OpenCL 1.2 乱序执行不起作用
OpenCL 1.2 out of order execution does not work
我正在尝试在序列基础图像中应用过滤器 -> 过滤器 1 -> 过滤器 2 -> 读取图像。我曾经使用 CL1.1 (C),其中我有事件,因此 filter2 需要等待 filter1 事件完成,而 read 需要等待 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。您可以将 C++ 包装器与 1.1 或 1.2 一起使用,并且可以将 C API 与 1.1 和 1.2.
一起使用
我正在尝试在序列基础图像中应用过滤器 -> 过滤器 1 -> 过滤器 2 -> 读取图像。我曾经使用 CL1.1 (C),其中我有事件,因此 filter2 需要等待 filter1 事件完成,而 read 需要等待 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。您可以将 C++ 包装器与 1.1 或 1.2 一起使用,并且可以将 C API 与 1.1 和 1.2.
一起使用