OpenCL создает новые потоки при первом вызове функции, почему? - PullRequest
2 голосов
/ 10 марта 2012

Когда я вызываю функцию OpenCL, я не представляю, что создаст новые потоки, в этом случае, чтобы просто получить идентификаторы платформы, моя программа создает 8 новых потоков.

    cl_platform_id platforms[10] = {0};
    cl_uint numberofplatforms = 0;
    clGetPlatformIDs(10, platforms, &numberofplatforms);//this creates 8 threads

Из-за того, что я не создаю контекст, а просто запрашиваю идентификаторы платформы, чтобы посмотреть, что доступно, почему эта функция создает все эти потоки? Я использую 64-битную Windows 7, i7 920 с HT (я подозреваю, что это создает 8 потоков, потому что у меня 8 ядер), как Intel, так и Nvidia SDK (у меня есть GTS 250 и GTX 560), в то время как я связывание с библиотеками Nvidia OpenCL и использование его заголовков.

Это не большая проблема, но что, если я решу не использовать OpenCL после анализа устройств, только чтобы «бесполезно» лежало 8 бесполезных потоков. Кто-нибудь знает, почему это происходит?

1 Ответ

0 голосов
/ 21 октября 2012

Многие функции OpenCL не блокируют, это означает, что они выдают команды устройству в виде очереди, и я почти уверен, что потоки используются для управления устройством, в то время как хост-программа продолжает выполнятьостальная часть кода.

Для иллюстрации: при вызове clEnqueueNDRangeKernel ядро ​​не обязательно запускается сразу, но программа продолжает выполнять код после вызова clEnqueueNDRangeKernel.Поэтому я полагаю, что эта функция передает некоторую информацию отдельным потокам, которые управляют вычислительным устройством и следят за тем, чтобы ядро ​​в конце концов запустилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...