c - 在 OpenCL 中等待单个事件

标签 c opencl

我正在编写一个 OpenCL 程序,其中多个内核在多个设备上被调用。在我将所有内核入队后,我想等到其中任何一个内核完成后,再为该设备入队工作。

例如,我有设备 A 和 B,它们每个都有一个内核。如果 A 先完成,我想在做一些工作后在其中加入一个新内核。如果 B 先完成,我想在做一些工作后为它排队一个新内核。我正在寻找类似 clWaitForAnyEvent 的东西,它将在传入的任何事件完成后返回。

查看规范,我看到了一个 clWaitForEvents 方法,但它似乎会等待所有事件完成后再继续,我想在一个事件后继续(并且需要知道哪个事件结束了)。

我现在能想到的选项是:

  1. 忙等待使用 clGetEventInfo 来测试事件是否完成。

  2. 多线程,每个事件都有一个线程(只需要几个线程,但我将 CPU 用作设备之一)

  3. 遗漏了规范中的一些内容,实际上有一种方法可以帮我做到这一点。

关于如何进行的任何建议或我缺少的东西?

谢谢!

最佳答案

你的答案是 3。

clWaitForEvents 将完全按照您的意愿进行。假设您有一个设备的命令队列,我们​​将其称为 klee_dev。您可以像这样在 klee_dev 上排队工作:

cl_event event;
cl_int status = clEnqueueNDRangeKernel(queue_for_klee_dev, ..., &event);

/* enqueue other work on other devices, perhaps even klee_dev */

clWaitForEvents(1, &event);

clWaitForEvents 的调用将阻塞,直到您在 klee_dev 的命令队列中排队的工作完成。它不会等待其他工作完成;仅由与该事件关联的入队调用指定的工作。

编辑:

我误解了原来的问题,下面已经澄清了。 OP 询问 CL 规范中是否有一种方法,在给定一组 事件的情况下,该方法将阻塞直到任何一个 事件完成。目前没有这种方法。

再次编辑:

您可以使用 clSetEventCallback 为每个事件注册一个回调方法。在回调中,您可以使用 clGetEventInfo 查询事件以找出与该事件关联的命令队列。

我认为这可以满足您的需求:任何事件完成的通知,以及找出与该事件关联的命令队列的能力。

关于c - 在 OpenCL 中等待单个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8117776/

相关文章:

javascript - WebAssembly 应用程序如何将其 native Window/OpenGL/Vulkan 调用映射到 DOM 中的 Canvas 元素?

c++ - OpenCV 3 OpenCL UMat 绘图函数

c++ - 如何使用 OpenCL 构建 ImageMagick?

algorithm - 在 CUDA/OpenCL 中,哪种方式可以订购共享 2D/3D 阵列以并行缩减 1 维?

c - 如果程序由于错误而提前退出,释放动态分配内存的正确方法是什么?

c++ - 你如何将带有字符串变量的字符串传递给C++中的函数

c - 定义有条件存在的元素的结构

c - 避免在 C 中读取配置文件的全局变量

在 Cuda 内核中调用 Opencv 函数

c# - 如何检查位值是否等于 1?