OpenCL 1.2乱序执行不起作用

时间:2018-02-08 13:16:16

标签: c++ opencl opencl-c

我正在尝试在序列基础图像中应用过滤器 - > filter1 - > filter2 - >读图像。我曾经使用CL1.1(C),其中我有事件,所以filter2需要等待filter1事件完成,读取需要等待filter2事件完成。

在CL 1.2(C ++)中,现在不再需要事件向量了。但我的下面的代码仍然有效并产生正确的结果,我不明白为什么与CL1.1(C)一样,这不会有效。

cl::CommandQueue queue(context, device, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err);
...
err = queue.enqueueNDRangeKernel(filter1Kernel, cl::NullRange, globalWorkSize, cl::NullRange, nullptr, nullptr);
err = queue.enqueueNDRangeKernel(filter2Kernel, cl::NullRange, globalWorkSize, cl::NullRange, nullptr, nullptr);
err = queue.enqueueReadImage(filter2Image, CL_FALSE, origin, region, 0, 0, ResultImage, nullptr, nullptr);

即使使用非阻塞调用并获得正确的输出,我也可以访问该图像。是否不再需要同步?

1 个答案:

答案 0 :(得分:3)

仅仅因为你说一个队列被启用了无序执行并不意味着它将会是,或者它是否会无缘无故地运行内核。因此,您要么以有序队列结束,要么按照您提交的顺序运行内核的无序队列。

如果您的作品是连续的,为什么要请求无序的队列?

P.S。您可以使用带有1.1或1.2的C ++包装器,并且可以使用带有1.1和1.2的C API。