2013-04-25 83 views
0

我用clCreateCommandQueue()创建了多个OpenCL队列。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个队列,它是否会发生?

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

+0

2个队列可能不够 - 例如, G。在同时执行内核的情况下,HtoD或DtoH IO和DtoD IO。 – 2013-05-13 14:46:40

0

问题在于在不同平台上发布OpenCL事件的差异。摆脱之后,代码开始工作得很好。

0

我们在OS X 10.8,10.9和beta 10.10中看到类似的问题(以及其他一些问题,包括驱动程序挂起),并发现删除CL_QUEUE_PROFILING_ENABLE解决了它。