Opencl clFinish挂起,队列为空

Opencl clFinish挂起,队列为空,opencl,nvidia,Opencl,Nvidia,我已经使用clCreateCommandQueue()创建了多个OpenCL队列 创建的所有队列都没有错误。其中一个队列中暂时没有命令。所有内核执行都很顺利,等等。最后,我需要释放我创建的队列。所有clFinish()都正常,只有一个除外,它等待队列,队列中没有命令(例如,队列中没有命令)。所以 返回正确,但是 clFinish(queueN); 永远挂着。解决办法是什么 操作系统是Ubuntu 12.04 x64。GPU是GeForce GTS450。OpenCLSDK1.1可能是一个驱动程

我已经使用clCreateCommandQueue()创建了多个OpenCL队列

创建的所有队列都没有错误。其中一个队列中暂时没有命令。所有内核执行都很顺利,等等。最后,我需要释放我创建的队列。所有clFinish()都正常,只有一个除外,它等待队列,队列中没有命令(例如,队列中没有命令)。所以

返回正确,但是

clFinish(queueN);
永远挂着。解决办法是什么


操作系统是Ubuntu 12.04 x64。GPU是GeForce GTS450。OpenCLSDK1.1可能是一个驱动程序错误。我在“nVIDIA+Linux+OpenCL”中工作时发现了很多这样的东西。在我的例子中,我的程序在一个clReadBuffer()阻塞调用后运行,该调用从未返回

即使只创建2个队列,也会发生这种情况吗


我的建议是克服这个问题,使用尽可能少的队列。通常2个队列是最好的(内核处理+I/O)。如果使用事件和无序队列支持,则不需要更多队列。

问题在于不同平台上发布的OpenCL事件不同。摆脱了这个问题后,代码开始正常工作。

我们在OS X 10.8、10.9和beta 10.10中看到了一个类似的问题(以及其他一些问题,包括驱动程序挂起),并发现删除CL_队列分析功能解决了这个问题。

2个队列可能不够-e。G在同时执行内核的情况下,HtoD或DtoH IO&DtoD IO。
clFinish(queue1);
...
clFinish(queueK);
clFinish(queueN);