C++ OpenCL 1.2无序执行不起作用

C++ OpenCL 1.2无序执行不起作用,c++,opencl,opencl-c,C++,Opencl,Opencl C,我试图在序列基本图像->过滤器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_M

我试图在序列基本图像->过滤器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.您可以使用1.1或1.2的C++包装器,并且可以使用1.1和1.2 .c/p>的C API,因为在调用C时,我使用了事件触发器,因为最后两个EnQueReangangeKEnEnter()参数用于等待事件和控制当前事件。因此,我会同时将所有过滤器排队,并使用事件来同步和控制顺序。但是,C++看起来有点不同,因为最后两个参数是事件向量和当前事件对象。如果没有,只需使用顺序队列。无序队列没有被大量使用,也没有得到广泛支持。对于一些类似于图形的工作流之类的东西来说;我从来都不需要它。是的,API在C++ API和C++包装器上是不同的,但是你有C++包装器的源码,并且可以看到它如何将向量解压缩到C API的列表中。它只是在内部使用了C API。