我正在编写一个OpenCL程序,其中在多个设备上调用多个内核。在我将所有内核排队之后,我想等到它们中的任何一个完成后,然后将该设备的后续工作排入队列。
例如,我有设备A和B,每个设备都有一个内核。如果A首先完成,我想在完成一些工作之后将新内核排入其中。如果B先完成,我想在完成一些工作之后为它排队一个新的内核。我正在寻找像clWaitForAnyEvent
之类的东西,它将在任何传入的事件结束后返回。
查看规范,我看到了一个clWaitForEvents
方法,但似乎它会在继续之前等待所有事件完成,并且我想在一个事件之后继续(并且需要知道哪个事件完成)。
我现在能想到的选择是:
忙碌等待使用clGetEventInfo
来测试活动完成情况。
多线程为每个事件都有一个线程(只需要几个线程,但我使用CPU作为其中一个设备)
错过了规范中的内容,实际上有一种方法可以帮我解决这个问题。
有关如何处理的建议或我遗失的内容?
谢谢!
答案 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
查询事件,以找出与事件关联的命令队列。
这可以满足您的需求,我认为:任何事件完成的通知,以及找出与该事件关联的命令队列的能力。