Opencl 注释clfinish()使程序加快了%100
我有一个opencl内核批处理类,它让40多个内核排队,每个内核执行之间都有一个clFinish() 问题:当我注释掉clFinish()时,程序运行速度加快了100%,这是否意味着当内核使用相同的缓冲区进行写入和读取时,它们之间存在未定义的行为?我怀疑性能的提高来自gpu/职业资源的更好利用。使用顺序命令队列是否保证两个内核之间存在障碍,还是需要在它们之间使用clFinish() 这是一个简单的物理模型,两个版本之间没有明显差异 也许我只需要在结尾使用clFinish()Opencl 注释clfinish()使程序加快了%100,opencl,Opencl,我有一个opencl内核批处理类,它让40多个内核排队,每个内核执行之间都有一个clFinish() 问题:当我注释掉clFinish()时,程序运行速度加快了100%,这是否意味着当内核使用相同的缓冲区进行写入和读取时,它们之间存在未定义的行为?我怀疑性能的提高来自gpu/职业资源的更好利用。使用顺序命令队列是否保证两个内核之间存在障碍,还是需要在它们之间使用clFinish() 这是一个简单的物理模型,两个版本之间没有明显差异 也许我只需要在结尾使用clFinish() 编辑:如果所有内核调
编辑:如果所有内核调用都在同一个命令队列上执行,并且这是一个有序队列,这正是您的场景,因此您不需要所有这些
clFinish
调用,那么您不需要在内核调用之间使用clFinish
,只保留最后一个
性能差异来自以下因素的组合:
- 每个
调用都有开销,用于将所有排队的命令发送到设备并检查其执行状态clFinish
- 这些
调用也会中断GPU正在完成的工作-GPU必须等待下一个内核排队,并在clFinish
之后发送到设备。省略对clFinish
的调用意味着在以前的内核仍在执行时将内核调用发送到GPUclFinish
- 也许内核没有运行?将内核排队很便宜,并且不需要主机的任何努力。但是,调用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