2017-10-07 98 views
1

OpenCL最佳实践指南(https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)在3.1.3节中建议使用clFlush以确保命令以正确的顺序发生,例如,处理不数据传输之前发生:重叠的传输和执行:确保按照正确的顺序执行命令

  1. 传输的数据队列0
  2. clFlush的队列0
  3. 运行内核队列0,传输数据的队列1
  4. clFlush的队列0和队列1
  5. 为队列1运行内核并检索队列0的数据
  6. clFlush对于它们都是
  7. 检索队列1的数据

这里的答复https://stackoverflow.com/a/12389713/4634819建议使用事件来实现,因为它看起来是相同的。

我的问题是:在这种情况下,我做得对吗?同时做两个事件(避免同时执行),这两个事件都是clFlush?它们中的哪一个使用是否重要?

回答

4

clFlush只确保入队函数将数据传输或内核执行排入队列,但它不能确保您调用的函数完成。有多种情况需要使用事件:

1 - 如果您使用非阻塞呼叫进行数据传输,则需要使用事件以确保在开始执行之前完成了所有事件的传输你的内核,当你复制回主机时,你需要等待读事件完成。

2 - 如果您在两个队列中执行的内核之间存在依赖关系,那么您必须再次使用事件以正确的方式对内核进行排序。

所以你的问题取决于你在内核执行和你是否使用非阻塞调用传输数据之间有什么样的依赖关系。如果你没有依赖关系,并且你正在使用阻塞调用进行数据传输,clFlush将完成这项工作。否则,你需要事件。

+0

谢谢!一切都很清楚:) – vgeclair

相关问题