【问题标题】:Overlapping transfer and execution: ensure that commands are performed in the right order重叠传输和执行:确保命令以正确的顺序执行
【发布时间】:2017-10-07 09:47:07
【问题描述】:

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. clFlush 用于 queue0 和 queue1
  5. 为 queue1 运行内核并检索 queue0 的数据
  6. clFlush 他们俩
  7. 检索 queue1 的数据

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

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

【问题讨论】:

    标签: opencl gpgpu


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 2016-08-06
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2014-06-13
      • 2021-07-23
      相关资源
      最近更新 更多