等待OpenCL中的单个事件

KLe*_*ee1 8 c opencl

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

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

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

我现在能想到的选择是:

  1. 忙 - 等待使用clGetEventInfo测试事件完成.

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

  3. 错过了规范中的某些内容,实际上有一种方法可以帮我完成.

有关如何处理的建议或我遗漏的事情?

谢谢!

Jam*_*mes 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);
Run Code Online (Sandbox Code Playgroud)

调用clWaitForEvents将阻塞,直到您在klee_dev命令队列中排队的工作完成.它不会等待其他工作完成; 只是与该一个事件关联的enqueue调用指定的工作.

编辑:

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

编辑,再次:

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

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