2013-04-25 53 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解決了它。