深入理解GPU硬件架构及运行机制
作者:Tim在路上
曾看到有一篇名为《The evolution of a GPU: from gaming to computing》的文章。
这篇文章非常热烈的讨论了这些年GPU的进步,这引发了我们的一些思考:
为什么我们总说GPU比CPU要强大,既然GPU强大,为什么不能取代CPU呢?
答案:CPU工作方式和GPU的工作方式截然不同,下面的两张图有助于帮助我们理解CPU和GPU的工作方式的不同。
上图有几个重点的元素,也是我们下文重点要阐述的概念,
- 绿色代表的是computational units(可计算单元) 或者称之为 cores(核心),
- 橙色代表memories(内存) ,
- 黄色代表的是control units(控制单元)。
因此想要理解GPU的底层核心构成,就必须明确这几个元素的作用,下文会逐一讲解每个元素的作用。
1. 计算单元 (cores)
总的来看,我们可以这样说:CPU的计算单元是“大”而“少”的,然而GPU的计算单元是“小”而“多”的。
这里的大小是指的计算能力,多少指的是设备中的数量。
通过观察上图,显然可以看出,计算单元(绿色的部分),CPU“大少”,GPU“小多”的特点。
CPU的cores 比GPU的cores要更加聪明(smarter),这也是所谓“大”的特点。
在过去的很长时间里,CPU的core计算能力增长是得益于主频时钟最大的频率增长。
相反,GPU不仅没有主频时钟的提升,而且还经历过主频下降的情况,因为GPU需要适应嵌入式应用环境,在这个环境下对功耗的要求是比较高的,不能容忍超高主频的存在。
例如英伟达的Jetson NANO, 安装在室内导航机器人身上,就是一个很好的嵌入式环境应用示例,安装在机器人身上,就意味着使用电池供电,GPU的功耗不可以过高。
CPU比GPU聪明,很大一个原因就是CPU拥有"out-of-order exectutions"(乱序执行)功能。
出于优化的目的,CPU可以用不同于输入指令的顺序执行指令,当遇到分支的时候,它可以预测在不久的将来哪一个指令最有可能被执行到(multiple branch prediction 多重分支预测)。
通过这种方式,它可以预先准备好操作数,并且提前执行他们(soeculative execution 预测执行),通过上述的几种方式节省了程序运行时间。
显然现代CPU拥有如此多的提升性能的机制,这是比GPU聪明的地方。相比之下,GPU的core不能做任何类似out-of-order exectutions那样复杂的事情。
总的来说,GPU的core只能做一些最简单的浮点运算,例如 multiply-add(MAD)或者 fused multiply-add(FMA)指令。
Fused Multiply-Add (FMA) 指令是一种在许多现代处理器上可用的特殊指令,用于执行浮点数乘法和加法操作。它结合了两个操作数(通