0

我用 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

4

3 回答 3

0

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

于 2013-05-13T14:51:30.157 回答
0

应该是驱动bug吧。我在“nVIDIA + Linux + OpenCL”中工作时发现了其中的许多。就我而言,我的程序在 clReadBuffer() 阻塞调用之后挂起,该调用从未返回。

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

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

于 2013-04-30T12:55:14.247 回答
0

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

于 2014-09-16T20:57:59.707 回答