在 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 毫秒的延迟调用并不罕见。
如果您说出您要解决的问题是什么,您可以获得更有用的答案。
假设有两个命令队列,我想使用事件同步它们。可以这样做:
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 毫秒的延迟调用并不罕见。
如果您说出您要解决的问题是什么,您可以获得更有用的答案。