评论clfinish()会使程序%100更快

时间:2013-08-27 16:42:11

标签: opencl

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

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

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

也许我只需要在最后使用clFinish()?

编辑:此命令队列未使用CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE。

2 个答案:

答案 0 :(得分:6)

如果所有内核调用都在同一个命令队列上执行并且这是一个有序队列,那么您不需要在内核调用之间使用clFinish,这正是您的场景所以您不需要所有这些{ {1}}来电,只保留最后一个。

性能差异来自以下各项的组合:

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

答案 1 :(得分:2)

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

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

VS

//Start host timer
clEnqueueNDRangeKernel(...);
clFinish();
//Stop host timer - this does time the kernel on the host

或者,您可以使用内核分析和事件。