OpenCL 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);

Я могу получить доступ к изображению даже при неблокирующем вызове и получении правильного вывода. Синхронизация больше не нужна?

1

Решение

То, что вы говорите, что очередь включена для выполнения не по порядку, не означает, что она будет работать, или если это так, что она будет запускать ядра из строя без причины. Таким образом, вы либо получили очередь в порядке, либо очередь не в порядке, в которой ваши ядра работают в том порядке, в котором вы их отправили.

Если ваша работа носит последовательный характер, почему вы запрашиваете очередь с нарушением порядка?

Постскриптум Вы можете использовать оболочку C ++ с 1.1 или 1.2, и вы можете использовать C API с 1.1 и 1.2.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]