Opencl 编写多个内核或单个内核

Opencl 编写多个内核或单个内核,opencl,Opencl,假设我有两个大函数。在单独的内核中编写它们并按顺序调用它们更好,还是只编写一个内核更好?(我不想读回数据并在主机和设备之间强制执行表单)。如果我想多次调用内核,那么速度会如何呢?一般来说,这是一个性能比代码可读性稍微好一点的问题。只要将缓冲区保持在相同的上下文中,复制缓冲区就没有问题。例如,可以将内核的一个输出缓冲区设置为下一个内核的输入缓冲区,不涉及任何复制。登记的压力对硬件利用率和性能的影响。p> 一般来说,大内核有大的寄存器足迹。典型的OpenCL设备(即GPU)具有非常有限的寄存器文件大

假设我有两个大函数。在单独的内核中编写它们并按顺序调用它们更好,还是只编写一个内核更好?(我不想读回数据并在主机和设备之间强制执行表单)。如果我想多次调用内核,那么速度会如何呢?

一般来说,这是一个性能比代码可读性稍微好一点的问题。只要将缓冲区保持在相同的上下文中,复制缓冲区就没有问题。例如,可以将内核的一个输出缓冲区设置为下一个内核的输入缓冲区,不涉及任何复制。登记的压力对硬件利用率和性能的影响。p> 一般来说,大内核有大的寄存器足迹。典型的OpenCL设备(即GPU)具有非常有限的寄存器文件大小,而较大的内核可能导致较低的并发性(较少的并发扭曲/波前)、较少的延迟隐藏机会以及较差的总体性能。另一方面,在大多数平台上,内核启动开销非常低,因此如果您的算法在执行的“阶段”之间没有大量的状态需要保存,那么使用多个内核的代价可能相当低

使用多个内核还有另一个好处——您可以免费获得所有工作单元之间的隐式同步。通常,这可以消除对原子内存操作和同步原语的需要,这可能会对代码性能产生负面影响


最终的指南应该是衡量绩效。这类事情没有普遍的经验法则。基准测试是唯一确定的方法。

在OpenCL中编写代码的正确方法是将代码分成并行任务,每个任务都是一个内核。也就是说,每个“for循环”都应该是一个内核。有时,单个CPU代码函数可能导致OCL中的4内核实现

如果需要在内核执行之间存储数据,只需使用OpenCL缓冲区,而不复制到主机(这解决了DEVICEHOST瓶颈)


如果两个函数作用于不同的数据,则可以编写单个内核,但这取决于正在运行的操作的复杂性。

请看这里,类似的讨论:stackoverflow.com/questions/9208535/how-to-handle-a-variable-number-of-algorithms-in-a-kernelApple agree: