我用clCreateCommandQueue()创建了多个OpenCL队列。
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 :(得分:0)
可能是驱动程序错误。在“nVIDIA + Linux + OpenCL”中工作时,我发现了很多这些。在我的情况下,我的程序在clReadBuffer()阻塞调用之后陷入困境,该调用从未返回。
即使您只创建了2个队列,也会发生这种情况吗?
我建议克服这个问题,尽可能少使用队列。通常2个队列是最好的(内核处理+ I / O)。如果您使用事件和无序队列支持,则不需要更多队列。
答案 1 :(得分:0)
问题在于OpenCL事件在不同平台上发布的差异。摆脱它后,代码开始工作正常。
答案 2 :(得分:0)
我们在OS X 10.8,10.9和beta 10.10中看到了类似的问题(以及其他一些包括驱动程序挂起),发现删除CL_QUEUE_PROFILING_ENABLE解决了它。