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

Opencl 重叠传输和执行:确保以正确的顺序执行命令,opencl,gpgpu,Opencl,Gpgpu,OpenCL最佳实践指南()在第3.1.3节中建议使用clFlush,以确保命令按正确的顺序执行,例如,处理不会在数据传输之前执行: 传输队列0的数据 clFlush用于队列0 运行queue0的内核,传输queue1的数据 clFlush用于队列0和队列1 运行queue1的内核并检索queue0的数据 clFlush两个 检索队列1的数据 这里的回答建议使用事件来实现同样的目标 我的问题是:我做对了吗?在这种情况下,clFlush和事件是否都有相同的用途(避免同时执行)?使用哪一个重要吗?c

OpenCL最佳实践指南()在第3.1.3节中建议使用
clFlush
,以确保命令按正确的顺序执行,例如,处理不会在数据传输之前执行:

  • 传输队列0的数据
  • clFlush
    用于队列0
  • 运行queue0的内核,传输queue1的数据
  • clFlush
    用于队列0和队列1
  • 运行queue1的内核并检索queue0的数据
  • clFlush
    两个
  • 检索队列1的数据
  • 这里的回答建议使用事件来实现同样的目标


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

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

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

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

    因此,您的问题取决于内核执行之间的依赖关系,以及是否使用非阻塞调用来传输数据。如果您没有依赖项,并且正在使用阻塞调用进行数据传输,则clFlush将执行此任务。否则,您需要事件