我有一个opencl内核批处理类,它将40多个内核排入队列,每个内核执行之间都有一个clFinish().
问题:当我注释掉clFinish()时,程序会更快地运行%100,这是否意味着当内核使用相同的缓冲区进行写入和读取时,内核之间存在未定义的行为?我怀疑性能提升来自更好地利用gpu /职业资源.使用有序命令队列是否保证两个内核之间存在障碍,还是需要它们之间的clFinish()?
它是一个简单的物理模型,两个版本之间没有差异.
也许我只需要在最后使用clFinish()?
编辑:此命令队列未使用CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE.
clFinish
如果所有内核调用都在同一个命令队列上执行并且这是一个有序队列,那么您就不需要使用inbetween内核调用,这正是您的场景所以您不需要所有这些clFinish
调用,只需保留最后一个.
性能差异来自以下各项的组合:
clFinish
调用都会产生开销,将所有排队的命令发送到设备并检查其执行状态.clFinish
调用还会在GPU完成的工作中产生中断 - GPU必须等待下一个内核入队并在之后发送到设备clFinish
.省略调用clFinish
意味着在先前的内核仍在执行时,内核调用会被发送到GPU.