为什么基于GPU的算法执行速度更快

时间:2012-02-11 08:48:38

标签: cuda gpgpu nvidia

我刚刚在GPU上实现了一种算法,用于计算数组的连续索引差异。我将它与基于CPU的实现进行了比较,并注意到对于大型阵列,基于GPU的实现执行得更快。

我很好奇为什么基于GPU的实现执行得更快。请注意,我知道GPU有几个核心的表面推理,因此可以进行并行操作,即不是按顺序访问每个索引,而是分配一个线程来计算每个索引的差异。

但有人可以告诉我更深层次的原因,为什么GPU的表现更快。他们的架构有什么不同,他们可以击败基于CPU的实现

3 个答案:

答案 0 :(得分:5)

他们通常不会表现得更快。

重点是:有些算法更适合CPU,有些算法更适合GPU。

GPU的执行模型不同(参见SIMD),内存模型不同,指令集不同......整个架构不同。

没有明显的方法来比较CPU和GPU。您只能讨论算法的CPU实现A(以及为什么)比此算法的GPU实现B更快或更慢。


这最终变得模糊不清,所以具体原因的冰山一角将是:CPU的强大一面是随机内存访问,分支预测等。当有大量计算时,GPU擅长高数据局部性,以便您的实现可以实现计算到内存访问的良好比例。例如,SIMD使GPU实现比CPU更慢,因为对许多代码路径进行了大量不可预测的篡改。

答案 1 :(得分:4)

真正的原因是GPU不仅有几个内核,而且还有多个内核,通常有数百个内核!然而,每个GPU核心都比低端CPU慢得多。

但编程模式根本不像多核CPU。因此,大多数程序无法移植到GPU或从中受益。

答案 2 :(得分:2)

虽然这里已经给出了一些答案并且这是一个老线程,但我只是想我会为后代添加这个而不是:

CPU和GPU在某些问题上的性能差异的主要原因是如何分配芯片资源的设计决策。 CPU将大部分芯片空间用于大型高速缓存,指令解码器,外设和系统管理等。它们的内核更加复杂,并且以更高的时钟速率运行(每个内核产生的热量必须消耗更多。)相比之下, GPU将其芯片空间用于在芯片上封装尽可能多的浮点ALU,因为它们可能会侥幸逃脱。 GPU的最初目的是尽可能快地增加基质(因为这是图形渲染中涉及的主要计算类型。)因为矩阵乘法是一个令人尴尬的并行问题(例如,每个输出值的计算完全独立于其他所有输出值并且每个计算的代码路径是相同的,通过让几个ALU遵循由单个指令解码器解码的指令,可以节省芯片空间,因为它们都在同时执行相同的操作。相比之下,每个CPU的内核必须有自己独立的指令解码器,因为内核不遵循相同的代码路径,这使得每个CPU的内核在芯片上比GPU的内核大得多。由于在矩阵乘法中执行的主要计算是浮点乘法和浮点加法,因此GPU的实现使得每个都是单周期运算,实际上,甚至包含一个乘以两的融合乘法和加法指令数字并将结果添加到单个循环中的第三个数字。这比典型的CPU快得多,其中浮点乘法通常是多周期操作。再次,这里的权衡是芯片空间专用于浮点数学硬件,而其他指令(例如控制流)通常比CPU上的速度慢得多,或者有时甚至不存在于CPU上。 GPU根本就没有。

此外,由于GPU内核的运行时钟速率远低于典型CPU内核,并且不包含那么多复杂的电路,因此它们不会产生每个内核的热量(或者每个内核使用尽可能多的功率)。其中更多的产品可以装入相同的空间而不会使芯片过热,并且允许具有1,000多个内核的GPU对只有4或8个内核的CPU具有类似的电源和散热要求。