c++ - OpenCL 1.2 乱序执行不起作用

标签 c++ opencl opencl-c

我正在尝试在序列基础图像中应用过滤器 -> 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/

相关文章:

c++ - std::common_type 的特化 - 误解、错误、两者兼而有之?

image - 在 OpenCL 中使用 CLK_FILTER_LINEAR 读取图像时的精度

c++ - 调用 opencl 需要多长时间?

c++ - OpenCL:动态内存分配,使用空闲工作项好还是同时写入好

OpenCL 2.0 设备命令队列不断填​​满并停止执行

c - 如何在 Linux (ubuntu 16.04) 上运行 OpenCL 程序?

c++ - "ns"在 "nsresult"中代表什么?

c++ - ld : symbol(s) not found

c++ - 如何在派生类中访问聚合