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