Cuda 为什么基于GPU的算法执行得更快

Cuda 为什么基于GPU的算法执行得更快,cuda,gpgpu,nvidia,Cuda,Gpgpu,Nvidia,我刚刚在GPU上实现了一个算法,可以计算数组的差分btw连续索引。我将其与基于CPU的实现进行了比较,发现对于大型阵列,基于GPU的实现执行速度更快 我很好奇为什么基于GPU的实现执行得更快。请注意,我知道一个GPU有几个内核,因此可以并行执行操作的表面推理,也就是说,我们可以分配一个线程来计算每个索引的差异,而不是顺序访问每个索引 但有人能告诉我一个更深层次的原因,为什么GPU的表现更快。他们的体系结构有什么不同之处,以至于可以击败基于CPU的实现?真正的原因是GPU不仅有几个核,而且有许多核

我刚刚在GPU上实现了一个算法,可以计算数组的差分btw连续索引。我将其与基于CPU的实现进行了比较,发现对于大型阵列,基于GPU的实现执行速度更快

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


但有人能告诉我一个更深层次的原因,为什么GPU的表现更快。他们的体系结构有什么不同之处,以至于可以击败基于CPU的实现?真正的原因是GPU不仅有几个核,而且有许多核,通常有数百个!然而,每个GPU内核都比低端CPU慢得多


但编程模式与多核CPU完全不同。因此,大多数程序无法移植到GPU或从GPU中获益。

通常,它们的执行速度不会更快

关键是:有些算法更适合CPU,有些更适合GPU

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

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



这最终有点含糊不清,因此具体原因的冰山一角是:CPU的强大一面是随机内存访问、分支预测等。GPU在有高数据局部性的高计算量时表现出色,因此您的实现可以实现很好的计算内存访问比率。SIMD使GPU的实现比CPU慢,例如,在CPU中有许多不可预测的分支到许多代码路径。

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

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


此外,由于GPU内核的时钟频率比典型的CPU内核低得多,并且不包含那么多复杂的电路,因此它们不会在每个内核上产生那么多热量(或者在每个内核上使用同样多的功率)这使得更多的CPU可以被封装在同一个空间中,而不会使芯片过热,同时也使得1000多核的GPU具有与只有4或8核的CPU相似的电源和冷却要求。

这是一个“一根绳子有多长?”的问题——没有单一的答案。什么算法?什么GPU?什么CPU?对于一个微不足道的差异示例,内核的内存带宽是有限的,因此答案可能是“你的GPU的内存带宽比你的CPU多”。这有点像问,“为什么一条总线承载更多的人(类似于带宽)比汽车还多?请注意,我已经知道公共汽车有几个座位,因此可以同时搭载多人,但有人能告诉我一个更深层次的原因,为什么他们可以搭载更多的人吗?“好吧,他们搭载更多的人,因为,好吧,他们搭载更多的人……”talonmies:内存带宽有限意味着什么?顾名思义,内存带宽受限意味着代码的整体性能受到设备内存最大吞吐量的限制。GPU的内存吞吐量是性能瓶颈。