如何解决OpenCL 中是否有可能等待 clEnqueueNDRangeKernel 尚未返回的事件?
假设有两个命令队列,我想使用事件同步它们。可以这样做:
cl_event event1;
clEnqueueNDRangeKernel(queue1,<..params..>,NULL,&event1);
cl_event event2;
clEnqueueNDRangeKernel(queue2,&event2);
clEnqueueNDRangeKernel(queue1,1,&event2,NULL);
clEnqueueNDRangeKernel(queue2,&event1,NULL);
是否有可能获得类似的结果,但 clEnqueueNDRangeKernel 调用的顺序不同?例如:
cl_event event1;
cl_event event2;
clEnqueueNDRangeKernel(queue1,&event1);
clEnqueueNDRangeKernel(queue1,NULL); //it fails here because event2 does not exist
clEnqueueNDRangeKernel(queue2,&event2);
clEnqueueNDRangeKernel(queue2,NULL);
解决方法
OpenCL 中是否有可能等待 clEnqueueNDRangeKernel 尚未返回的事件?
并非如此,但可能有不同的方法。
您可以创建一个用户事件 (clCreateUserEvent
) 并在入队调用中使用返回的 userEvent
而不是 event2
参数。然后,在将创建 event2
的内核入队后,在 clSetEventCallback
上添加回调 (event2
),并从该回调调用 clSetUserEventStatus(userEvent,CL_COMPLETE)
。
这只有两个问题,1) 即使最常见的 OpenCL 实现不是可怕的 WRT 用户事件,您也会引入不必要的用户空间旅行(= 减速),2) 它们是可怕的 WRT 用户事件。我的意思是,回调将被调用......在某个时候。看到它在事件实际完成后延迟 10-200 毫秒被调用并不罕见。
如果您说出您要解决的问题是什么,您可以获得更多有用的答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。