GPU的源头及架构分析

最佳答案 匿名用户编辑于2023/07/17 11:17

CPU图形算力捉襟见肘,GPU适应图形学并行计算需求。

1.CPU:通用性与效率存在矛盾,为通用性牺牲单一场景性能

 提及 GPU,则自然会关联到 CPU,因为 GPU 可以看作 CPU 的变种。CPU 历史悠久, 核心的 CPU 设计理念,其实早在 1960s 就已经出现了,甚至早于 Intel 和 AMD 两家公司 的诞生,更早于各种图形化操作系统。例如现有 CPU 中必备的流水线、指令动态调度等 核心技术,在 60 年代就已经应用在 IBM 大型机当中。而与之对比,“GPU”这 个名词则是在 1999 年 NVIDIA 发布 GeForce 256 时首次提出的。由此可见,GPU 是 CPU 的后辈,同时 GPU 也是在 CPU 基础上进行针对性改进而生的产品。

因此,要了解 GPU,就有必要对 CPU 进行回顾,从而我们可以了解 GPU 在 CPU 的 基础上进行了哪些改变,以及为什么要进行这些改变。以下是计算机系统的简要框图,其 中 CPU 居于核心地位,CPU 与内存共同构成计算机,CPU 从内存中读数据,进行运算之 后再写回内存,显示在输出设备中。

CPU作为计算机的核心,就要求其必须能够处理人类世界种种纷繁复杂的任务,注 定其将通用性摆在首要位置。那么为了通用性,CPU势必采用最通用的架构设计。这种讲 求通用性的架构设计有何特点?我们不妨从典型的CPU架构中略窥一二。 以下是 Intel 十分经典的 Skylake 桌面处理器单核心架构。从图中左侧我们可以看到, 每个核心可以分成前端(淡黄色底纹部分)、后端(也称执行引擎,淡绿色底纹部分)、缓 存子系统(淡紫色底纹部分)。 前端主要用来进行指令解码、分支预测等,用以应付多种多样、变幻莫测的程序; 缓存用来存储程序所需的指令和数据;后端则是真正将前端处理过后的指令进行执行的部分。

其实在后端中,真正执行指令的部分占比也不高,因为程序种类繁多,其中的指令 耗费的时间和数据也各不相同,因此后端中相当大一部分芯片面积用于对指令执行顺序进 行动态调度。而真正用于指令执行的,其实只有执行单元(EU,图中深绿色部分)。再进 一步看,EU 部分的 8 个小分组中,有 4 个用于与内存沟通,例如生成内存地址、读写数 据,只有 4 个剩余的 EU 组可以用来真正进行数据计算(图中红色虚线框部分)。而这 4 组 EU 当中,包含 4 个整数加减单元,1 个整数乘法、1 个整数除法、1 个浮点除法单元, 2 个浮点乘加单元,以及 5 个向量运算单元。

可见,如果有大批量的某种单一运算任务(例如数百万次浮点乘除法),那么 CPU 真 正能够利用的计算面积可谓小之又小,效率很低。正如同人体,为了追求通用性,具备各 式各样的结构,但每一种功能都只用到一小部分结构,那么我们在特定任务上的表现往往 不会那么出色,我们对温度的感知能力甚至不如一个简单的体温计。 从 CPU 的架构,我们可以看到,“通用性”和“单一任务效率”始终存在矛盾。CPU 极端倾向通用性,而 GPU 则是牺牲一定程度的通用性来换取单一任务效率提升。

2.GPU架构:适应图形需求,一批核心共用控制部分,同时执行同样指令

如前所述,图形渲染需要处理的是大量独立并行的运算任务,GPU 的设计与此相合。 以较为简单的 Fermi 架构为例(该架构于 2010 年推出),可以看到其中计算核心占比 非常高(图中绿色部分)。如果我们进一步拆开来看,打开一个 SM(Stream Multi-processor, 红框中部分),其中包含了 2*16 个计算核心(深绿),16 个读写单元(LD/ST,黄绿),4 个用来计算超越函数的特殊功能单元 SFU(浅绿),数量较多;同时还包含 22 线程束调度 器(Warp Scheduler,橙色),每个线程束调度器可以同时控制 16 个计算核心,让这些核 心同时执行相同的指令。

对比 CPU 架构来看,可以发现 CPU 中 EU 只占很小一部分,而 GPU 中计算核心占 据大多数面积。由于无需考虑指令之间的相互依赖关系,只需对大量数据执行同样的操作, 因此 GPU 无需 CPU 中那么复杂的控制单元(前端以及指令调度部分)。可以说,是图形 应用的特殊性给了 GPU 改进的空间,使其可以舍弃部分通用性设计,专注并行计算效率。