等待OpenCL中的单个事件

时间:2011-11-14 05:44:27

标签: c opencl

我正在编写一个OpenCL程序,其中在多个设备上调用多个内核。在我将所有内核排队之后,我想等到它们中的任何一个完成后,然后将该设备的后续工作排入队列。

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

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

我现在能想到的选择是:

  1. 忙碌等待使用clGetEventInfo来测试活动完成情况。

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

  3. 错过了规范中的内容,实际上有一种方法可以帮我解决这个问题。

  4. 有关如何处理的建议或我遗失的内容?

    谢谢!

1 个答案:

答案 0 :(得分:10)

你的答案是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命令队列中排队的工作完成为止。 等待其他工作完成;只是与该一个事件相关联的enqueue调用指定的工作。

编辑:

我误解了原来的问题,这个问题在下面说明了。 OP正在询问CL规范中是否存在一个方法,在给定 set 事件的情况下,将阻塞,直到任何一个事件完成。目前没有这样的方法。

再次编辑:

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

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