在 OpenCL 中是否可以等待 clEnqueueNDRangeKernel 尚未返回的事件?

Is it possibile in OpenCL to wait for an event that has not been returned by clEnqueueNDRangeKernel yet?

假设有两个命令队列,我想使用事件同步它们。可以这样做:

cl_event event1;
clEnqueueNDRangeKernel(queue1, <..params..>, 0, NULL, &event1);
cl_event event2;
clEnqueueNDRangeKernel(queue2, <..params..>, 0, NULL, &event2);

clEnqueueNDRangeKernel(queue1, <..params..>, 1, &event2, NULL);
clEnqueueNDRangeKernel(queue2, <..params..>, 1, &event1, NULL);

是否有可能通过不同的 clEnqueueNDRangeKernel 调用顺序获得类似的结果?例如:

cl_event event1;
cl_event event2;

clEnqueueNDRangeKernel(queue1, <..params..>, 0, NULL, &event1);
clEnqueueNDRangeKernel(queue1, <..params..>, 1, &event2, NULL); //it fails here because event2 does not exist

clEnqueueNDRangeKernel(queue2, <..params..>, 0, NULL, &event2);
clEnqueueNDRangeKernel(queue2, <..params..>, 1, &event1, NULL);

Is it possibile in OpenCL to wait for an event that has not been returned by clEnqueueNDRangeKernel yet?

不一定,但可以采用不同的方法。

您可以创建一个用户事件 (clCreateUserEvent) 并在入队调用中使用返回的 userEvent 而不是 event2 参数。然后,在将创建 event2 的内核加入队列后,您在 event2 上添加一个回调 (clSetEventCallback),然后从该回调调用 clSetUserEventStatus(userEvent, CL_COMPLETE).

这只有两个问题,1) 即使最常见的 OpenCL 实现不是可怕的 WRT 用户事件,你也会引入不必要的用户空间旅行(= 减速),2) 它们是可怕的 WRT 用户事件.我的意思是,回调将被调用...在某个时候。在事件实际结束后看到它以 10-200 毫秒的延迟调用并不罕见。

如果您说出您要解决的问题是什么,您可以获得更有用的答案。