opencl - 在 OpenCL 中是否可以等待 clEnqueueNDRangeKernel 尚未返回的事件?
问题描述
假设有两个命令队列,我想使用事件同步它们。可以这样做:
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);
解决方案
在 OpenCL 中是否可以等待 clEnqueueNDRangeKernel 尚未返回的事件?
不是真的,但可能有不同的方法。
您可以创建一个用户事件 ( ) 并在 enqueue 调用中clCreateUserEvent
使用返回的userEvent
而不是参数。然后,在将event2
创建.event2
clSetEventCallback
event2
clSetUserEventStatus(userEvent, CL_COMPLETE)
这样做只有两个问题,1) 即使最常见的 OpenCL 实现不是可怕的 WRT 用户事件,您也会引入不必要的用户空间旅行(= 减速),2) 它们是可怕的 WRT 用户事件。我的意思是,回调将被调用......在某个时候。在事件实际完成后看到它以 10-200 毫秒的延迟被调用并不罕见。
如果您说出您要解决的问题是什么,您可以获得更多有用的答案。
推荐阅读
- kdb - kdb 表中的模糊查询
- python - 使用 selenium 进行 Python 网页抓取:在模式框中找到一个元素并下载它 - 循环中
- caching - 远程模式下对 JBoss 数据网格的 JTA 事务支持
- css - 使用 CSS Grid 的父 div 的跨度宽度
- r - 贝叶斯元分析 t 检验 - 混合一样本和二样本 (BayesFactor)
- javascript - 使用jquery表单和laravel的文件进度条
- sql - 如何在 Redshift 中存储一组字符串?
- c++ - 如何检测 unordered_map 向量中的重复项?
- css - 在 wordpress 中更改顶部菜单颜色
- regex - 如何从顶点中的字符串中删除单行和多行注释