我正在尝试在序列基础图像中应用过滤器 -> filter1 -> filter2 -> 读取图像。我曾经使用 CL1.1 (C),其中我有事件,因此 filter2 需要等待 filter1 事件完成,而 read 需要等待 filter2 事件完成。
在 CL 1.2 (C++) 中不再是这种情况,因为它现在要求事件 vector 。但是我下面的代码仍然有效并产生了正确的结果,我不明白为什么与 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);
即使使用非阻塞调用并获得正确的输出,我也可以访问图像。不再需要同步了吗?
最佳答案
仅仅因为您说队列已启用乱序执行并不意味着它会,或者如果它会无缘无故地乱序运行内核。因此,您要么得到一个有序队列,要么得到一个按照您提交的顺序运行内核的乱序队列。
如果您的工作是串行的,为什么要请求一个支持乱序的队列?
附言您可以将 C++ 包装器与 1.1 或 1.2 一起使用,并且可以将 C API 与 1.1 和 1.2 一起使用。
关于c++ - OpenCL 1.2 乱序执行不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48686399/