2013-04-25 2 views
0

Я создал несколько очередей OpenCL с clCreateCommandQueue().clFinish зависает с пустой очередью

cl_int ret_code = CL_SUCCESS; 
cl_command_queue queue1 = clCreateCommandQueue(GPU_context, GPU_device_ID, CL_QUEUE_PROFILING_ENABLE, &ret_code); 
... 
cl_command_queue queueN = clCreateCommandQueue(GPU_context, GPU_device_ID, CL_QUEUE_PROFILING_ENABLE, &ret_code); 

Все очереди создаются без ошибок. На одной из этих очередей на несколько минут нет команд. Все исполнения ядер прекрасны и т. Д. Наконец, мне нужно освободить очереди, которые я создал. Все clFinish() идут нормально, кроме одного - который ждет очереди, у которой нет команд внутри (скажем, queueN не имеет команд внутри). Так что

clFinish(queue1); 
... 
clFinish(queueK); 

возвращается правильно, но

clFinish(queueN); 

вешает навсегда. Каким может быть решение?

Операционная система: Ubuntu 12.04 x64. GPU - GeForce GTS450. OpenCL SDK 1.1

ответ

0

Возможно, это ошибка драйвера. Я нашел много из них при работе в «nVIDIA + Linux + OpenCL». В моем случае моя программа зависала после вызова clReadBuffer(), который никогда не возвращался.

Это происходит, даже если вы создаете только две очереди?

Советуем решить эту проблему, чтобы использовать как можно меньше очередей. Обычно 2 очереди являются лучшими (обработка ядра + ввод-вывод). Если вы используете события и поддержку очереди очередей, нет необходимости в дополнительных очередях.

+0

2 очереди могут быть недостаточными - e. г. в случае одновременного выполнения ядра, HtoD или DtoH IO & DtoD IO. –

0

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

0

Мы видели аналогичную проблему (а также некоторые другие, в том числе зависания драйверов) в OS X 10.8, 10.9 и beta 10.10, и обнаружили, что удаление CL_QUEUE_PROFILING_ENABLE было разрешено.

Смежные вопросы