三十年前,CPU 和其他专用处理器几乎处理所有计算任务。那个时代的显卡有助于加快 Windows 和应用程序中 2D 形状的绘制速度,但没有其他用途。
但具有讽刺意味的是,图形芯片的唯一功能是图形的日子已经一去不复返了,机器学习和高性能计算严重依赖于不起眼的 GPU 的处理能力。与我们一起探索这款单芯片如何从一个不起眼的像素推动器演变成一个强大的浮点计算引擎。
让我们回到 20 世纪 90 年代末。高性能计算领域,包括超级计算机的科学工作、标准服务器上的数据处理以及工作站上的工程和设计任务,完全依赖于两种类型的 CPU:1)专为单一目的而设计的专用处理器,2)来自AMD、IBM 或 Intel 的现成芯片。
由于我们将在本文中经常提到 TFLOPS,因此值得花点时间来解释它的含义。在计算机科学中,浮点数(或简称floats )是表示非整数值的数据值,例如 6.2815 或 0.0044。整数值(称为整数)经常用于控制计算机及其上运行的任何软件所需的计算。
浮点数对于精度至关重要的情况至关重要,特别是与科学或工程相关的任何事情。即使是简单的计算,例如确定圆的周长,也至少涉及一个浮点值。
几十年来,CPU 一直拥有单独的电路来对整数和浮点数执行逻辑运算。在上述 Pentium II Overdrive 的情况下,它可以在每个时钟周期执行一次基本浮点运算(乘法或加法)。理论上,这就是为什么 ASCI Red 的峰值浮点性能为 9,632 个 CPU x 3.33 亿个时钟周期 x 1 次操作/周期 = 3,207,456 百万次 FLOPS。
这些数字基于理想条件(例如,对适合缓存的数据使用最简单的指令),并且在现实生活中很少可以实现。然而,它们很好地表明了系统的潜在能力。
为了达到万亿次浮点运算级别的处理能力,需要数千个 CPU,所有这些都需要大量 RAM 和硬盘存储的支持。这过去是,现在仍然是,由于机器的数学要求。
当我们在学校第一次接触物理、化学和其他学科的方程时,一切都是一维的。换句话说,我们使用一个数字来表示距离、速度、质量、时间等。然而,为了准确地建模和模拟现象,需要更多的维度,并且数学上升到向量、矩阵和张量的领域。
它们在数学中被视为单个实体,但包含多个值,这意味着任何进行计算的计算机都需要同时处理大量数字。鉴于当时的 CPU 每个周期只能处理一到两个浮点数,因此需要数千个浮点数。
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 图形,而不是其他任何东西。即使是专业市场的显卡也只专注于渲染。
那个时代的 GPU 无法用于其他用途,因为转换 3D 对象并将其转换为监视器图像的过程并不涉及大量的浮点数学。事实上,其中很大一部分是在整数级别,并且图形卡需要几年的时间才开始在整个管道中大量使用浮点值。
第一个是ATI 的 R300 处理器,它有 8 个独立的像素管道,以 24 位浮点精度处理所有数算。不幸的是,除了图形之外,没有其他方法可以利用这种能力——硬件和相关软件完全以图像为中心。
计算机工程师并没有忘记 GPU 拥有大量 SIMD 功能,但缺乏将其应用到其他领域的方法这一事实。令人惊讶的是,这是一个游戏机,展示了如何解决这个棘手的问题。
这款代号为 Xenos 的图形芯片很特别,因为它的布局完全避开了单独的顶点和像素管道的经典方法。
取而代之的是一个三路 SIMD 阵列集群。具体来说,每个集群由 16 个向量处理器组成,每个向量处理器包含 5 个数学单元。这种布局使每个阵列能够在每个周期对 80 个浮点数据值同时执行来自线程的两条顺序指令。
被称为统一着色器架构(unified shader architecture),每个阵列可以处理任何类型的着色器。尽管 Xenos 使芯片的其他方面变得更加复杂,但它引发了一种至今仍在使用的设计范例。在时钟速度为 500 MHz 的情况下,整个集群理论上可以为乘法加法命令的三个线) 的处理速率。
为了让这个数字有一定的规模感,十年前的一些世界超级计算机无法匹敌这个速度。例如,桑迪亚国家实验室的aragon XP/S140凭借 3,680 个 Intel i860 CPU 在 1994 年名列世界超级计算机榜首,峰值速度为 184 GFLOPS。芯片开发的速度很快就超过了这台机器,但 GPU 也是如此。
CPU 多年来一直在整合自己的 SIMD 阵列,例如,英特尔最初的 Pentium MMX 有一个专用单元,用于在向量上执行指令,最多包含 8 个 8 位整数。当 Xbox 的 Xenos 在全球家庭中使用时,此类设备的尺寸至少增加了一倍,但与 Xenos 相比,它们仍然很小。
当消费级显卡开始采用具有统一着色器架构的 GPU 时,它们已经拥有比 Xbox 360 的图形芯片明显更高的处理速率。
两家图形芯片制造商很快就在其专业模型中利用了这种计算能力。虽然价格过高,但 ATI FireGL V8650 和 Nvidia Tesla C870 非常适合高端科学计算机。然而,在最高级别上,全世界的超级计算机仍然依赖标准 CPU。事实上,几年后 GPU 才开始出现在最强大的系统中。
超级计算机和类似系统的设计、建造和操作都极其昂贵。多年来,它们都是围绕大量 CPU 阵列构建的,因此集成另一个处理器并不是一朝一夕的事。此类系统在增加芯片数量之前需要进行彻底的规划和初始小规模测试。
其次,让所有这些组件协调运行,尤其是软件方面,绝非易事,这也是当时 GPU 的一个重大弱点。虽然它们已经变得高度可编程,但以前可供它们使用的软件相当有限。
然而,科学和数据处理社区真正需要的是一个全面的软件包,它将大量的 CPU 和 GPU(通常称为异构平台)视为由众多计算设备组成的单个实体。
他们的需求在 2009 年得到满足。OpenCL 最初由 Apple 开发,由 Khronos Group 发布,该集团几年前吸收了 OpenGL,成为在日常图形之外或当时该领域使用 GPU 的事实上的软件平台GPGPU 指的是 GPU 上的通用计算,该术语由Mark Harris创造。
与广阔的技术评论世界不同,全球范围内并没有数百名评论者测试超级计算机的性能主张。然而,德国曼海姆大学于 20 世纪 90 年代初启动的一个正在进行的项目正是致力于实现这一目标。
在高端 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 连接在一起时,它们就证明足够了。然而,此类系统缺乏功效。
几年后,不仅仅是世界上的超级计算机在利用 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 的超级计算机相。