重叠传输和执行:确保以正确的顺序执行命令

时间:2017-10-07 09:47:07

标签: opencl gpgpu

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. 传输queue0的数据
  2. clFlush for queue0
  3. 为queue0运行内核,传输queue1
  4. 的数据
  5. clFlush用于queue0和queue1
  6. 为queue1运行内核并检索queue0的数据
  7. clFlush对他们而言
  8. 检索queue1
  9. 的数据

    这里的回复https://stackoverflow.com/a/12389713/4634819建议使用事件来实现,看起来是一样的。

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

1 个答案:

答案 0 :(得分:5)

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

1 - 如果您使用非阻塞调用数据传输,则需要使用事件来确保在开始执行内核之前以及在复制回主机之前已完成所有事件的传输,你需要等待阅读事件才能完成。

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

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