OPENCL 1.2失效执行不起作用

OpenCL 1.2 out of order execution does not work

本文关键字:执行 不起作用 失效 OPENCL      更新时间:2023-10-16

我正在尝试以序列基础图像 -> 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);

我也可以使用非阻止调用并获取正确的输出。不再需要同步吗?

仅仅是因为您说启用了排序执行的队列并不意味着它将是,或者是因为它无缘无故地将内核放出订单。因此,您要么最终以固定队列或按要顺序运行内核的订购队列。

如果您的工作是串行的,为什么请要求订购的队列?

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