【问题标题】:clFinish hangs with empty queueclFinish 挂起,队列为空
【发布时间】:2014-09-17 04:57:59
【问题描述】:

我已经使用 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

【问题讨论】:

    标签: opencl nvidia


    【解决方案1】:

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

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

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

    【讨论】:

    • 2 个队列可能不够 - e。 G。在同时执行内核的情况下,HtoD 或 DtoH IO & DtoD IO。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 2021-03-01
        相关资源
        最近更新 更多