Opencl 注释clfinish()使程序加快了%100

Opencl 注释clfinish()使程序加快了%100,opencl,Opencl,我有一个opencl内核批处理类,它让40多个内核排队,每个内核执行之间都有一个clFinish() 问题:当我注释掉clFinish()时,程序运行速度加快了100%,这是否意味着当内核使用相同的缓冲区进行写入和读取时,它们之间存在未定义的行为?我怀疑性能的提高来自gpu/职业资源的更好利用。使用顺序命令队列是否保证两个内核之间存在障碍,还是需要在它们之间使用clFinish() 这是一个简单的物理模型,两个版本之间没有明显差异 也许我只需要在结尾使用clFinish() 编辑:如果所有内核调

我有一个opencl内核批处理类,它让40多个内核排队,每个内核执行之间都有一个clFinish()

问题:当我注释掉clFinish()时,程序运行速度加快了100%,这是否意味着当内核使用相同的缓冲区进行写入和读取时,它们之间存在未定义的行为?我怀疑性能的提高来自gpu/职业资源的更好利用。使用顺序命令队列是否保证两个内核之间存在障碍,还是需要在它们之间使用clFinish()

这是一个简单的物理模型,两个版本之间没有明显差异

也许我只需要在结尾使用clFinish()


编辑:如果所有内核调用都在同一个命令队列上执行,并且这是一个有序队列,这正是您的场景,因此您不需要所有这些
clFinish
调用,那么您不需要在内核调用之间使用
clFinish
,只保留最后一个

性能差异来自以下因素的组合:

  • 每个
    clFinish
    调用都有开销,用于将所有排队的命令发送到设备并检查其执行状态
  • 这些
    clFinish
    调用也会中断GPU正在完成的工作-GPU必须等待下一个内核排队,并在
    clFinish
    之后发送到设备。省略对
    clFinish
    的调用意味着在以前的内核仍在执行时将内核调用发送到GPU

    • 也许内核没有运行?将内核排队很便宜,并且不需要主机的任何努力。但是,调用clenquendrangekernel!=运行内核

      //Start host timer
      clEnqueNDRangeKernel(...);
      //Stop host timer - this doesn't actually time the kernel on the host
      
      vs


      或者,您可以使用内核评测和事件

      你们能发布一些主机代码吗?是的,所有主机代码都在同一个队列中。谢谢。绝对有效的一点是,每个OpenCL函数调用的错误状态都需要检查,例如,内核执行错误可能只表现为以后的
      clFinish
      返回的错误代码。
      //Start host timer
      clEnqueueNDRangeKernel(...);
      clFinish();
      //Stop host timer - this does time the kernel on the host