三十年前,CPU 和其他专用处理器几乎处理所有计算任务。那个时代的显卡有助于加快 Windows 和应用程序中 2D 形状的绘制速度,但没有其他用途。
快进到今天,GPU 已经成为业界最具主导地位的芯片之一。
但具有讽刺意味的是,图形芯片的唯一功能是图形的日子已经一去不复返了,机器学习和高性能计算严重依赖于不起眼的 GPU 的处理能力。与我们一起探索这款单芯片如何从一个不起眼的像素推动器演变成一个强大的浮点计算引擎。
一开始,CPU统治一切
让我们回到 20 世纪 90 年代末。高性能计算领域,包括超级计算机的科学工作、标准服务器上的数据处理以及工作站上的工程和设计任务,完全依赖于两种类型的 CPU:1)专为单一目的而设计的专用处理器,2)来自AMD、IBM 或 Intel 的现成芯片。
ASCI Red 超级计算机是 1997 年左右最强大的超级计算机之一,由 9,632 个 Intel Pentium II Overdrive CPU 组成(如下图所示)。每个单元的运行频率为 333 MHz,该系统的理论峰值计算性能略高于 3.2 TFLOPS(每秒万亿次浮点运算)。
由于我们将在本文中经常提到 TFLOPS,因此值得花点时间来解释它的含义。在计算机科学中,浮点数(或简称floats )是表示非整数值的数据值,例如 6.2815 或 0.0044。整数值(称为整数)经常用于控制计算机及其上运行的任何软件所需的计算。
浮点数对于精度至关重要的情况至关重要,特别是与科学或工程相关的任何事情。即使是简单的计算,例如确定圆的周长,也至少涉及一个浮点值。
几十年来,CPU 一直拥有单独的电路来对整数和浮点数执行逻辑运算。在上述 Pentium II Overdrive 的情况下,它可以在每个时钟周期执行一次基本浮点运算(乘法或加法)。理论上,这就是为什么 ASCI Red 的峰值浮点性能为 9,632 个 CPU x 3.33 亿个时钟周期 x 1 次操作/周期 = 3,207,456 百万次 FLOPS。
这些数字基于理想条件(例如,对适合缓存的数据使用最简单的指令),并且在现实生活中很少可以实现。然而,它们很好地表明了系统的潜在能力。
其他超级计算机也拥有类似数量的标准处理器——劳伦斯利弗莫尔国家实验室的Blue Pacific使用 5808 个 IBM PowerPC 604e芯片,洛斯阿拉莫斯国家实验室的Blue Mountain(上图)则使用 6144 个MIPS Technologies R1000。
为了达到万亿次浮点运算级别的处理能力,需要数千个 CPU,所有这些都需要大量 RAM 和硬盘存储的支持。这过去是,现在仍然是,由于机器的数学要求。
当我们在学校第一次接触物理、化学和其他学科的方程时,一切都是一维的。换句话说,我们使用一个数字来表示距离、速度、质量、时间等。然而,为了准确地建模和模拟现象,需要更多的维度,并且数学上升到向量、矩阵和张量的领域。
它们在数学中被视为单个实体,但包含多个值,这意味着任何进行计算的计算机都需要同时处理大量数字。鉴于当时的 CPU 每个周期只能处理一到两个浮点数,因此需要数千个浮点数。
SIMD 加入竞争:MMX、3DNow!和上交所
1997 年,Intel 通过名为MMX 的技术扩展更新了 Pentium CPU 系列,这是一组利用内核内部八个附加寄存器的指令。每个都被设计为存储一到四个整数值。该系统允许处理器同时执行跨多个数字的一条指令,这种方法被称为 SIMD(Single Instruction, Multiple Data)。
一年后,AMD 推出了自己的版本,名为3DNow!。它的性能尤其优越,因为寄存器可以存储浮点值。又过了一年,英特尔才在 MMX 中解决这个问题,并在 Pentium III 中引入了SSE (Streaming SIMD Extensions)。
随着日历进入新千年,高性能计算机的设计者可以使用能够有效处理矢量数学的标准处理器。
一旦扩展到数千个,这些处理器就可以同样出色地管理矩阵和张量。尽管取得了这一进步,超级计算机世界仍然青睐旧的或专用的芯片,因为这些新的扩展并不是专门为此类任务而设计的。对于另一种快速普及的处理器来说,GPU 也是如此,它比 AMD 或 Intel 的任何 CPU 都更擅长 SIMD 工作。
在图形处理器的早期,CPU 处理构成场景的三角形的计算(因此 AMD 用于执行 SIMD 的名称为 3DNow!)。然而,像素的着色和纹理完全由 GPU 处理,并且这项工作的许多方面都涉及矢量数学。
20 多年前最好的消费级显卡,例如 3dfx Voodoo5 5500和 Nvidia GeForce 2 Ultra,都是出色的 SIMD 设备。然而,它们的创建目的是为游戏生成 3D 图形,而不是其他任何东西。即使是专业市场的显卡也只专注于渲染。
ATI 售价 2,000 美元的 ATI FireGL 3 配备了两个 IBM 芯片(一个 GT1000 几何引擎和一个 RC1000 光栅器)、一个巨大的 128 MB DDR-SDRAM 以及据称 30 GFLOPS 的处理能力。但这一切都是为了使用 OpenGL 渲染 API 加速 3D Studio Max 和 AutoCAD 等程序中的图形。
那个时代的 GPU 无法用于其他用途,因为转换 3D 对象并将其转换为监视器图像的过程并不涉及大量的浮点数学。事实上,其中很大一部分是在整数级别,并且图形卡需要几年的时间才开始在整个管道中大量使用浮点值。
第一个是ATI 的 R300 处理器,它有 8 个独立的像素管道,以 24 位浮点精度处理所有数学运算。不幸的是,除了图形之外,没有其他方法可以利用这种能力——硬件和相关软件完全以图像为中心。
计算机工程师并没有忘记 GPU 拥有大量 SIMD 功能,但缺乏将其应用到其他领域的方法这一事实。令人惊讶的是,这是一个游戏机,展示了如何解决这个棘手的问题。
统一的新时代
微软的Xbox 360于2005年11月上市,其CPU由IBM设计和制造,基于PowerPC架构,GPU由ATI设计、台积电制造。
这款代号为 Xenos 的图形芯片很特别,因为它的布局完全避开了单独的顶点和像素管道的经典方法。
取而代之的是一个三路 SIMD 阵列集群。具体来说,每个集群由 16 个向量处理器组成,每个向量处理器包含 5 个数学单元。这种布局使每个阵列能够在每个周期对 80 个浮点数据值同时执行来自线程的两条顺序指令。
被称为统一着色器架构(unified shader architecture),每个阵列可以处理任何类型的着色器。尽管 Xenos 使芯片的其他方面变得更加复杂,但它引发了一种至今仍在使用的设计范例。在时钟速度为 500 MHz 的情况下,整个集群理论上可以为乘法加法命令的三个线程实现 240 GFLOPS (500 x 16 x 80 x 2) 的处理速率。
为了让这个数字有一定的规模感,十年前的一些世界顶级超级计算机无法匹敌这个速度。例如,桑迪亚国家实验室的aragon XP/S140凭借 3,680 个 Intel i860 CPU 在 1994 年名列世界超级计算机榜首,峰值速度为 184 GFLOPS。芯片开发的速度很快就超过了这台机器,但 GPU 也是如此。
CPU 多年来一直在整合自己的 SIMD 阵列,例如,英特尔最初的 Pentium MMX 有一个专用单元,用于在向量上执行指令,最多包含 8 个 8 位整数。当 Xbox 的 Xenos 在全球家庭中使用时,此类设备的尺寸至少增加了一倍,但与 Xenos 相比,它们仍然很小。
当消费级显卡开始采用具有统一着色器架构的 GPU 时,它们已经拥有比 Xbox 360 的图形芯片明显更高的处理速率。
GeForce 8800 GTX (2006 ) 中使用的 Nvidia G80(上图)的理论峰值为 346 GLFOPS,而Radeon HD 2900 XT (2007) 中的 ATI R600 则拥有 476 GLFOPS。
两家图形芯片制造商很快就在其专业模型中利用了这种计算能力。虽然价格过高,但 ATI FireGL V8650 和 Nvidia Tesla C870 非常适合高端科学计算机。然而,在最高级别上,全世界的超级计算机仍然依赖标准 CPU。事实上,几年后 GPU 才开始出现在最强大的系统中。
超级计算机和类似系统的设计、建造和操作都极其昂贵。多年来,它们都是围绕大量 CPU 阵列构建的,因此集成另一个处理器并不是一朝一夕的事。此类系统在增加芯片数量之前需要进行彻底的规划和初始小规模测试。
其次,让所有这些组件协调运行,尤其是软件方面,绝非易事,这也是当时 GPU 的一个重大弱点。虽然它们已经变得高度可编程,但以前可供它们使用的软件相当有限。
Microsoft 的 HLSL(Higher Level Shader Language)、Nvidia 的Cg 库和 OpenGL 的 GLSL 使访问图形芯片的处理能力变得简单,尽管纯粹是为了渲染。
统一着色器架构 GPU 改变了这一切。
2006 年,当时已成为AMD 子公司的ATI和 Nvidia 发布了软件工具包,旨在将这种能力不仅仅用于图形,其 API 分别称为 CTM(Close To Metal)和CUDA(Compute Unified Device Architecture)。
然而,科学和数据处理社区真正需要的是一个全面的软件包,它将大量的 CPU 和 GPU(通常称为异构平台)视为由众多计算设备组成的单个实体。
他们的需求在 2009 年得到满足。OpenCL 最初由 Apple 开发,由 Khronos Group 发布,该集团几年前吸收了 OpenGL,成为在日常图形之外或当时该领域使用 GPU 的事实上的软件平台GPGPU 指的是 GPU 上的通用计算,该术语由Mark Harris创造。
GPU 进入计算竞赛
与广阔的技术评论世界不同,全球范围内并没有数百名评论者测试超级计算机的性能主张。然而,德国曼海姆大学于 20 世纪 90 年代初启动的一个正在进行的项目正是致力于实现这一目标。
该组织被称为“TOP500”,每年两次发布全球最强大的 10 台超级计算机排行榜。
第一个夸耀 GPU 的条目出现在 2010 年,中国有两个系统——Nebulae 和Tianhe-1。它们分别依赖于 Nvidia 的Tesla C2050(本质上是 GeForce GTX 470,如下图所示)和 AMD 的Radeon HD 4870芯片,前者的理论峰值为 2,984 TFLOPS。
在高端 GPGPU 的早期阶段,Nvidia 是为计算巨头配备的首选供应商,不是因为性能(因为 AMD 的 Radeon 卡通常提供更高程度的处理性能),而是因为软件支持。CUDA经历了快速发展,几年后 AMD 才找到合适的替代方案,鼓励用户改用 OpenCL。
然而,英伟达并没有完全主导市场,英特尔的至强融核处理器试图占据一席之地。这些大型芯片源自一个名为 Larrabee 的已中止的 GPU 项目,是一种特殊的 CPU-GPU 混合体,由多个类似奔腾的核心(CPU 部分)与大型浮点单元(GPU 部分)配对组成。
对 Nvidia Tesla C2050 内部结构的检查揭示了 14 个称为流式多处理器 (SM) 的块,由缓存和中央控制器划分。每一个都包含 32 组两个逻辑电路(Nvidia 称之为 CUDA 核心),用于执行所有数学运算——一组用于整数值,另一组用于浮点数。在后一种情况下,内核可以在每个时钟周期以单(32 位)精度管理一次 FMA(融合乘加)操作;双精度(64 位)运算至少需要两个时钟周期。
Xeon Phi 芯片(如下所示)中的浮点单元看起来有些相似,只是每个内核处理的数据值是 C2050 中 SM 的一半。尽管如此,由于与 Tesla 的 14 个重复核心相比,有 32 个重复核心,单个 Xeon Phi 处理器总体上每个时钟周期可以处理更多的值。然而,英特尔首次发布的该芯片更多的是一个原型,并不能完全发挥其潜力——英伟达的产品运行速度更快,功耗更低,并被证明最终是优越的。
这将成为 AMD、英特尔和 Nvidia 之间三路 GPGPU 之争中反复出现的主题。一种型号可能拥有数量较多的处理核心,而另一种型号可能具有更快的时钟速度或更强大的缓存系统。
CPU 对于所有类型的计算仍然至关重要,许多超级计算机和高端计算系统仍然由 AMD 或英特尔处理器组成。虽然单个 CPU 无法与普通 GPU 的 SIMD 性能竞争,但当数千个 CPU 连接在一起时,它们就证明足够了。然而,此类系统缺乏功效。
例如,在天河一号超级计算机使用Radeon HD 4870 GPU的同时,AMD最大的服务器CPU(12核Opteron 6176 SE)也开始流行。对于大约 140 W 的功耗,CPU 理论上可以达到 220 GFLOPS,而 GPU 只需额外 10 W 即可提供 1,200 GFLOPS 的峰值,而且成本仅为其一小部分。
一个可以(做更多事情)的小显卡
几年后,不仅仅是世界上的超级计算机在利用 GPU 来集体进行并行计算。Nvidia 正在积极推广其GRID 平台,这是一种用于科学和其他应用的 GPU 虚拟化服务。最初是作为托管基于云的游戏的系统而推出的,对大规模、经济实惠的 GPGPU 不断增长的需求使得这一转变不可避免。在其年度技术会议上,GRID 被认为是各领域工程师的重要工具。
在同一事件中,GPU 制造商展示了代号为 Volta 的未来架构。公布的细节很少,普遍的假设是这将是另一款服务于英伟达所有市场的芯片。
与此同时,AMD 也在做类似的事情,在其专注于游戏的 Radeon 系列以及 FirePro 和 Radeon Sky 服务器卡中利用定期更新的 Graphics Core Next (GCN) 设计。那时,性能数据已经令人震惊——FirePro W9100 的峰值 FP32 吞吐量为 5.2 TFLOPS(32 位浮点),这个数字对于不到二十年前的超级计算机来说是不可想象的。
GPU 仍然主要是为 3D 图形设计的,但渲染技术的进步意味着这些芯片必须越来越熟练地处理一般计算工作负载。唯一的问题是它们执行高精度浮点数学(即 FP64 或更高)的能力有限。
纵观2015 年顶级超级计算机,与完全基于 CPU 的超级计算机相比,使用 GPU(英特尔的 Xeon Phi 或 Nvidia 的 Tesla)的数量相对较少。
当 Nvidia 在 2016 年推出Pascal 架构时,这一切都发生了变化。这是该公司首次尝试专门为高性能计算市场设计 GPU,其他 GPU 则用于多个领域。前者只生产过一款(GP100),并且只产生了 5 种产品,但之前所有架构都只配备少数 FP64 内核,而这款芯片却容纳了近 2,000 个内核。
Tesla P100 提供超过 9 TFLOPS 的 FP32 处理能力和 FP64 处理能力的一半,它的功能非常强大。AMD 的 Radeon Pro W9100 使用 Vega 10 芯片,在 FP32 下速度快了 30%,但在 FP64 下慢了 800%。此时,英特尔因销售不佳而濒临停产 Xeon Phi。
一年后,Nvidia 终于发布了 Volta,这表明该公司不仅仅有兴趣将其 GPU 引入 HPC 和数据处理市场,它还瞄准了另一个市场。
神经元、网络
深度学习是机器学习这一更广泛学科中的一个领域,而机器学习又是人工智能的一个子集。它涉及使用复杂的数学模型(称为神经网络)从给定数据中提取信息。
一个例子是确定所呈现的图像描绘特定动物的概率。为此,模型需要进行“训练”——在本例中,显示了数百万张该动物的图像,以及数百万张不显示该动物的图像。所涉及的数学植根于矩阵和张量计算。
几十年来,此类工作负载只适合基于 CPU 的大型超级计算机。然而,早在 2000 年代,GPU 就显然非常适合此类任务。
尽管如此,英伟达还是押注于深度学习市场的大幅扩张,并在其 Volta 架构中添加了额外的功能,使其在该领域脱颖而出。这些是作为张量核心销售的 FP16 逻辑单元组,作为一个大型阵列一起运行,但功能非常有限。
事实上,它们的功能非常有限,只能执行一个功能:将两个 FP16 4x4 矩阵相乘,然后将另一个 FP16 或 FP32 4x4 矩阵添加到结果中(这一过程称为 GEMM 运算)。Nvidia 之前的 GPU 以及竞争对手的 GPU 也能够执行此类计算,但速度远不及 Volta。使用该架构的唯一 GPU GV100 总共容纳了 512 个张量核心,每个核心能够在每个时钟周期执行 64 个 GEMM。
根据数据集中矩阵的大小以及所使用的浮点大小,Tesla V100 卡在这些张量计算中理论上可以达到 125 TFLOPS。Volta 显然是为小众市场设计的,但 GP100 在超级计算机领域的进展有限,而新的 Tesla 型号则迅速被采用。
PC 爱好者会知道,Nvidia 随后在图灵架构的通用消费产品中添加了张量核心,并开发了一种名为DLSS(Deep Learning Super Sampling)的升级技术,该技术使用 GPU 中的核心在计算机上运行神经网络。放大图像,纠正帧中的任何伪影。
在短时间内,Nvidia 独占了 GPU 加速的深度学习市场,其数据中心部门的收入大幅增长——2017 财年增长率为 145%,2018 财年增长率为 133%,2019 财年增长率为 52%。截至 2019 财年末,HPC、深度学习等领域的销售额总计 29 亿美元,这是一个非常积极的结果。
但随后,市场真的爆发了。该公司 2023 年第四季度的总收入为 221 亿美元,同比增长 265%。其中大部分增长来自该公司的人工智能计划,该计划创造了 184 亿美元的收入。
然而,只要有钱,竞争就不可避免,尽管 Nvidia 仍然是迄今为止最大的 GPU 提供商,但其他大型科技公司也没有坐以待毙。
2018 年,谷歌开始通过云服务提供对其内部开发的张量处理芯片的访问。亚马逊很快也紧随其后,推出了专用 CPU AWS Graviton。与此同时,AMD 正在重组其 GPU 部门,形成两条不同的产品线:一条主要用于游戏 (RDNA),另一条专门用于计算 (CDNA)。
虽然 RDNA 与其前身明显不同,但 CDNA 在很大程度上是 GCN 的自然演变,尽管规模扩大到了一个巨大的水平。看看当今用于超级计算机、数据服务器和人工智能机器的 GPU,一切都非常巨大。
AMD 的 CDNA 2 驱动的MI250X拥有 220 个计算单元,提供略低于 48 TFLOPS 的双精度 FP64 吞吐量和 128 GB 的高带宽内存 (HBM2e),这两个方面在 HPC 应用中都备受追捧。Nvidia 的 GH100 芯片采用Hopper 架构和 576 个 Tensor Core,在 AI 矩阵计算中采用低精度 INT8 数字格式,有可能达到 4000 TOPS。
英特尔的Ponte Vecchio GPU 同样庞大,拥有 1000 亿个晶体管,AMD 的 MI300 拥有 460 亿个晶体管,包括多个 CPU、图形和内存小芯片。
然而,它们共有的一件事是它们绝对不是 GPU:它们不是 GPU。早在英伟达将该术语用作营销工具之前,该缩写词就代表图形处理单元。AMD 的 MI250X 没有任何渲染输出单元 (ROP:render output units),甚至 GH100 也仅拥有类似于 GeForce GTX 1050 的Direct3D 性能,使得 GPU 中的“G”变得无关紧要。
那么,我们可以称呼它们什么呢?
“GPGPU”并不理想,因为它是一个笨拙的短语,指的是在通用计算中使用 GPU,而不是设备本身。“HPCU”(高性能计算单元)也好不了多少。但也许这并不重要。
毕竟,“CPU”一词非常广泛,涵盖了各种不同的处理器和用途。
GPU 接下来要征服什么?
Nvidia、AMD、Apple、Intel 和其他数十家公司在 GPU 研发上投入了数十亿美元,当今的图形处理器不会很快被任何截然不同的产品所取代。
对于渲染,最新的 API 和使用它们的软件包(例如游戏引擎和 CAD 应用程序)通常与运行代码的硬件无关,因此从理论上讲,它们可以适应全新的东西。
然而,GPU 中专门用于图形的组件相对较少,三角形设置引擎和 ROP 是最明显的组件,并且最近版本中的光线追踪单元也高度专业化。然而,其余部分本质上是大规模并行 SIMD 芯片,由强大而复杂的内存/缓存系统支持。
基本设计与以往一样好,未来的任何改进都与半导体制造技术的进步紧密相关。换句话说,它们只能通过容纳更多逻辑单元、以更高的时钟速度运行或两者的组合来改进。
当然,它们可以合并新功能,使其能够在更广泛的场景中发挥作用。在 GPU 的历史上,这种情况已经发生过多次,但向统一着色器架构的过渡尤为重要。虽然最好拥有专用硬件来处理张量或光线追踪计算,但现代 GPU 的核心能够管理这一切,尽管速度较慢。
这就是为什么 AMD MI250 和 Nvidia GH100 等产品与台式电脑的同类产品非常相似,未来用于 HPC 和 AI 的设计很可能会遵循这一趋势。那么,如果芯片本身不会发生重大变化,那么它们的应用又如何呢?
鉴于与 AI 相关的任何事物本质上都是计算的一个分支,因此只要需要执行大量 SIMD 计算,就可能会使用 GPU。虽然科学和工程领域没有多少领域尚未使用此类处理器,但我们可能会看到 GPU 衍生产品的使用激增。
目前人们可以购买配备微型芯片的手机,其唯一功能是加速张量计算。随着ChatGPT等工具的功能和普及度不断增强,我们将看到更多配备此类硬件的设备。
不起眼的 GPU 已经从仅仅比 CPU 更快地运行游戏的设备发展成为通用加速器,为全球的工作站、服务器和超级计算机提供动力。
全球数百万人每天都在使用它——不仅在我们的计算机、电话、电视和流媒体设备中,而且在我们使用包含语音和图像识别或提供音乐和视频推荐的服务时也是如此。
GPU 真正的下一步可能是一个未知的领域,但有一点是肯定的,图形处理单元将在未来几十年内继续成为计算和人工智能的主要工具。