1

我正在尝试按顺序应用过滤器基本图像->过滤器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);

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

4

1 回答 1

3

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

如果你的工作是串行的,你为什么要请求一个可以乱序的队列?

PS 您可以将 C++ 包装器与 1.1 或 1.2 一起使用,并且您可以将 C API 与 1.1 和 1.2 一起使用。

于 2018-02-09T00:33:45.160 回答