CPU 和 GPU
好久没有更新了,最近在阅读 CUDA 相关的一些论文,因为都是碎片化阅读,容易导致读过后,可能过一段时间又忘记掉,所以决定抽时间翻译翻译阅读的论文,一方面增强自己记忆,一方面与大家共享。期待大家给我推荐好的论文。今天开篇就从 GPU 的演进历史开始,当然 GPU 的演进历史,主要角色当然是 NVIDIA,所以本文也是以 NVIDIA 为主进行介绍的。话不多说,直接上正文,有翻译不当的位置,望各位不吝赐教。文章原文在文末。
图形处理单元 GPU 的演进
早期 GPU 是一种图形处理设备,但是如今它已经作为一种通用设备服务于多个领域,在超算领域,它赋能当今最快的超级计算机,在人工智能领域它作为深度学习的主要平台,为自动驾驶、机器人以及智能摄像头等诸多设备提供智能。与此同时,它依然能够以实时的帧率生成令人信服的逼真的高质量图片。GPU 的演进主要是通过增加新特性支持新的应用场景。NVIDIA 的 GeForce 256 是一款用于实时图形处理的专用处理器。图形实时处理应用需要高内存带宽和大量的浮点计算能力用于顶点(vertex)和片元(fragment)的着色计算(shading computations)。随着实时图形处理技术的进步,GPU 拥有了可编程性。可编程性与浮点计算能力的结合,使得 GPU 对于科学计算拥有了巨大的吸引力。早期,科学家通过把科学计算映射为顶点和片元着色器(shader)来使用 GPU 的计算能力。这一阶段,GPU 通过不断的降低硬件编程的复杂度,同时提供双精度浮点计算等通用能力来满足科学计算领域的需求。
GPU 的高性能浮点计算能力和易用的可编程特性使之成为了 AI 研究者训练视觉、语音识别、自然语言处理以及推荐系统等领域深度神经网络的理想平台,直接推动了当前深度学习技术的革命。GPU 通过添加深度学习相关的数据类型支持以及相关指令来进一步满足深度学习应用的需求。如今 GPU 已经成为深度学习训练和推理的主要平台。
01
早期的 3D 图形处理硬件
图形渲染对于计算能力有很强的需求,因此需要使用专用硬件来完成生成图像所需的计算。1986 年 Evans and Sutherland Computer Corporation 成立,致力于研发专用的 3D 图形处理硬件。他们使用当时的一种小规模集成技术(small-scale inegration technology),这种昂贵的 multirack 系统 (multirack systems)主要用于飞行模拟器这样的应用场景。
易于编程的高性能浮点计算 GPU 的出现,使当前深度学习革命成为可能。
按照摩尔定律(Moore's law)发展的大规模集成电路技术大幅度降低了构建图形系统的成本,并使其向两个方向发展。一种是昂贵的复杂的 3D 图形技术,一种则是低成本的 2D 图形技术。20 世纪 80 年代末,Silicon Graphics 公司建立了新一代 3D 图形系统和高端专业工作站。与此同时,低成本的 2D 图形技术在大量的市场产品中得到应用,例如 PC 以及视频游戏终端等。早期的终端是 sprite-base 的,将虚拟矩形复制到屏幕上显示背景、场景及角色。最早的 PC 显卡(graphics cards)是简单的 2D 加速器和显示控制器。它们主要负责将像素值从 PC 系统内存拷贝到帧缓冲区,最终复制到 CRT 屏幕上,同时产生地址和同步信号并进行 D/A 转换。2D 图形加速器逐步发展成能够支持文本和视窗加速的硬件,支持图像 (texture) 的拷贝、伸缩、融合等功能。
3D 游戏终端如 3DO、Sega Saturn 以及 Sony Playstation 的出现引领了 3D 游戏的大众市场。在 PC 上支持 3D 图形用于游戏的愿景激发了整个 2.5D 和 3D 图形加速器领域的发展,这样一个极其诱人的机会,导致先后有 60 多家公司成立以参与这一市场。1993 年由 Jensen Huang、Chris Malachowsky 和 Curtis Priem成立的 NVIDIA 公司致力于将先进的 3D 图形技术应用于 PC 平台,同时参与游戏终端的竞争。3D PC 图形技术的灵感来源于专业的 3D 工作站中的复杂而昂贵的图形管线 (graphics pipelines), 类似 Silicon graphics 公司研发的那些。NVIDIA 的创办者认为,随着摩尔定律的发展,大面积的高复杂度的芯片会逐步变的集成度更高,更便宜,从而使基于 PC 的 3D 游戏成为可能。第一代 3D PC 显卡能够执行光栅化(rasterization)的片元(或者像素)计算、颜色插值、纹理映射、 z-buffering (hidden surface removal)以及着色等功能。给定二维屏幕中三角形顶点的坐标和参数,显卡将生成三角形中每个像素的深度和颜色,并将这些像素合成到帧缓冲区中(frame buffer)。顶点的计算包括将顶点从世界空间转换到屏幕空间,在视窗中修正三角形以及计算每个顶点的光照并保存到CPU中。NVIDIA 的第一个成功的这种类型的产品叫做 RIVA-128(NV3), 是在 1997 年发布的。3D 加速器的发展包括在更复杂的光照和阴影场景下同时混合多种纹理的能力。NVIDIA 的 RIVA-TNT 和 TNT2(NV4 和 NV5) 具备这些功能,同时具有并行处理 pipeline 上的多个位置的多个像素的能力,包括光栅化、着色等。
02
GeForce 256: 第一款 GPU
1999 年推出的 GeForce 256 是第一款将顶点变换和光照以及片元计算集成到一块芯片上的芯片。这一完全集成的图形引擎被称作 "graphics processing unit" or GPU。它承担了原来由 CPU 执行的顶点计算,这样可以在游戏中使用更复杂的几何运算,但是代价是需要更高的浮点计算能力。例如透视变换(perspective transformation)需要一个4x4 的矩阵向量乘和一个透视除法操作(perspective division operation)。在 GeForce 256 中,顶点和像素的计算被组织在硬件管线(hardwired pipeline)中的可配置的固定的硬件单元(fixed-function hardware)上执行。
随着 PC 游戏越来越复杂,为了实现更加复杂的游戏效果,对修改顶点和像素的计算需求也与日俱增。从 20 世纪 80 年代开始,可编程的“着色器(shaders)”已经被应用在离线图形软件中。GeForce 3(NV20) GPU 在 2001 年发布了一种可编程的顶点着色器(vertes shader)特性,2002 年在 GeForce FX 上发布了可编程的片元着色器(fragment shaders)特性。
03
GPU 计算
由于强大的浮点计算能力和可编程特性促使具备可编程 shader 特性的 GPU 对于科学计算有着极强的吸引力, 至此,通用 GPU(general-purpose GPU, GPGPU) 编程领域出现了。GeForce 6 的单精度浮点峰值计算能力是 108 GFLOPS,同时代的 CPU 仅有 8 GFLOPS。然而,在这样的 GPU 上编程是非常复杂的。数据的输入和输出受到严格的限制。片元着色器仅仅接受插值顶点属性的输入 (interpolated vertex attributes) 和纹理(texture)上得输入,仅能够输出数据到帧缓冲区中。程序员必须把他们的程序转换成渲染纹理映射(rendering texture mapped)或者混合三角形(blended triangles)来利用 GPU 的 FLOPS。早期的 GPGPU 代码包含很多难以理解的着色器代码,这些代码迫使科学算法以这种形式出现。
为了利用日益增长的 GPU 能力,GPUs 最终采用流处理器编程模型(stream processing programming models),这种方式隐藏了着色器编程的大部分复杂性。流式编程系统强调并行性和生产者-消费者的局部性,最初是为诸如 Imagine 和 Merrimac 等专用流处理器开发的。然而这种编程系统却非常适合 GPU 编程。Brook 编程语言最初是为 Merrimac 开发的,之后适配到 GPU 上, 叫做 Brook-GPU。Brook 后来被 AMD 作为开发语言适配到自家的 unified shader GPU 上。
流处理器编程模型影响了用于计算的 GPU 的设计。从 2003 年开始,在斯坦福领导流处理器项目的 Bill Dally 就开始与在 NVIDIA 工作的 John Nickolls 和 Erik Lindholm 探讨将流处理的思想应用到 GeForce 8 (NV50) GPU。在 2004 年,Brook 的主要开发者 lan Buck 加入 NVIDA 与很多合作者一起开发 CUDA 编程语言。
GeForce 8 GPU 或者 G80 引入了流处理器簇(streaming multiprocessors, SMs), 顶点和片元着色器都使用 SMs 来执行。SMs 能够独立于图形管线(graphics pipeline),以线程组的形式执行计算着色器(compute shaders)。SMs 使用 share memory 来促进线程组内的线程之间的数据共享。G80 ”Tesla“ GPU 和 CUDA都是在 2006 年发布的,他们大大降低了使用 GPU 开发科学应用以及其他通用目的应用的障碍。图 1 展示了 G80 GPU 的照片,它由 6.81 亿个晶体管组成,能够提供 346 GFLOPS 的 FP32 计算吞吐和 86 GB/s 的 DRAM 带宽。
然而革命性的硬件和新的编程语言并不能依靠自身进行革命。其主要原因在于大量遗留的高性能计算(high-performance computing, HPC)应用,是基于 FORTRAN 语言和单线程序列化编程的,而 G80 是一种大规模线程并行处理器,CUDA 语言 是一种线程和数据并行的类 C 编程语言。为此,NVIDIA 首席科学家 David Kirk 和 伊利诺伊大学厄巴纳-香槟分校 (UIUC) 的电气与计算机工程教授 Wen-mei HWu 一起为 UIUC 的研究生课程设计原型以培养下一代的并行编程程序员。这一课程的课堂笔记逐步演进成为流行的并行编程语言教材--Programming Massively Parallel Processors,这本书已经被翻译成很多种语言并出版,很快讲发行它的第四版。
与此同时,NVIDIA 建立基金会以支持在各个高校建立优秀的 CUDA 研究中心,以此来促进 CUDA 教学、推广 GPU 技术和并行编程。Kirk 和 Hwu 也支持了许多“教师培训”活动,包括在西班牙巴塞罗那的 UPC/BSC 举办的年度 PUMPS 暑期学校。
来自庞大的且不断增长的 GPU 计算社区的反馈,促使在 2010 年的 Fermi 系列 GPU 中增加了高性能科学计算的特性。这一特性包括支持双精度浮点计算,相对于 G80 的 0 GFLOPS,Fermi 支持 750 GFLOPS 的双精度浮点计算吞吐,除此之外还包含,可靠性、可用性和可服务性 (RAS) 等特性,以及主存储器上的 ECC 和片上存储器的奇偶校验保护。
凭借 HPC 特性,高性能和高效率,GPU 很快成为了大型计算机的首选技术。GPU 计算的重要里程碑是橡树岭国家实验室(Oak Ridge National Labs,ORNL)使用 18688 块 NVIDIA kepler (K20) 组成 Titan 系统,在 2012 年 11 月在 Linpack 测试中以 17.6 PFLOPS 的性能获得 Top 500 的第一名。2018 年 6 月 ORNL 延续了这一传统,使用 27648 块 NVIDIA 的 Volta(V100) GPU,在 Linpack 测试中以 122.3 PFLOPS 的浮点性能获得第一。在 2021 年 6 月的 Top 500 中,前 10 名的机器中有 6 个是使用 NVIDIA 的 GPU。
GPU 推动了当前的深度学习革命,而未来深度学习的发展很大程度上取决于 GPU 性能
GPU 要在 HPC 领域取得成功,需要开发一个庞大而多样性的软件生态系统,该系统的成熟经历了 10 年。基于 CUDA 的编程系统,GPU 的编程生态系统现在包括了其他的编程方法,例如 CUDA Fortran 和 OpenACC 等。下一级别的支持,是一组数学计算库,包括 CuBLAS,CuSparse 和 CuFFT 等对大量数学程序的关键函数进行过高度优化的计算库。通过从编程语言到计算库等软件生态的完善,用户可以通过使用这些库来方便的使用 GPU 的各种能力。到目前为止,有超过 600 种 HPC 的应用是使用 GPU 进行加速的,其中包括 GROMACS、NAMD, AMBER, 以及 LAMMPS 等分子动力学代码;气象学代码,如 WRF;流体动力学代码,如 ANSYS 和 OpenFOAM;化学代码,如 Gaussian, VASP, Quantum Espresso, 和 GAMESS; 以及结构分析代码,如 LS-DYNA 和 ANSYS。
04
深度学习硬件
GPU 促使了当今深度学习领域的的革命,而未来深度学习的进展也很大程度上取决于 GPU 的性能。深度学习的成功需要 3 个必要条件:算法、数据、算力。深度学习领域核心的算法:深度神经网络、卷积网络、反向传播训练、随机梯度下降以及其他算法,都是在上世纪 80 年代或者更早被发明的。大规模数据集例如 PASCAL VOC 和 ImageNet 到 2005 年已经达到可用的程度。唯一缺少的因素就是足够快的硬件能够以可接受的时间在大规模数据集上训练一个健壮的神经网络。
这一因素是在拥有高性能浮点计算能力且易于编程的 GPU 出现后才被满足的。以计算机视觉领域为例,它是在 2012 年 AlexNet 被开发出来后才开始发生变化的,AlexNet 是一个使用两块 GeForce 580 (Fremi) GPU 训练两周得到的卷积神经网络。AlexNet 在 2012 年赢得了 ImageNet 竞赛,其准确度大幅度提升,以至于计算机视觉社区在很大程度上放弃了手工设计的特征检测器,而使用神经网络。相同的改变也发生在其他领域,例如语音识别领域、自然语言处理领域以及推荐系统领域。
GPU 使深度学习大众化,任何人只要拥有一台带有 GPU 的个人电脑就可以使用这一技术。在 2010 年,Google Brain 的研究员构建了一个深度神经网络来识别互联网上得猫,使用了 16000 块 CPU。这一实验在 2012 年被复现,仅使用 48 块 GPU,使用的软件为 cuDNN, 一个为深度学习开发的 CUDA 库。就像 CUDA 简化了科学应用在GPU上的编程任务,cuDNN 简化了在 GPU 上实现深度学习任务,其方便快捷的特性被深度学习研究员和相关从业者广泛使用。
如图 2 所示,深度学习模型的复杂性随着时间的推移而急剧增加。自然语言处理模型的复杂度仅仅两年就增加了 1000 倍,从 2018 年的 BERT 到 2020 年的 GPT-3。这些模型在精度方面显著增加,但是想要成功训练更复杂的模型,则取决于硬件性能的提升。
GPU 通过两种方式来满足深度学习训练快速增长的性能需求,其一是纵向扩展(scale-up),其二是在横向扩展(scale-out)。为了促进横向扩展,2015 年在 Pascal GPU 上发布了 NVLink,一种高速的 GPU-GPU 交流通道。然后,在 2017 年 Volta GPU 发布了 NVSwitch 技术,能够支持高性能的 GPU 网络互联。NVSwitch 链接的 GPU 节点可以共享内存,能够通过 Infiniband 网络与其他节点互联。AlexNet 最早是通过两块 GPU 训练的,现代语言模型是在拥有几千块 GPU 的集群上训练的。例如,Selene,在 2021 年 6 月的 Top 500 中排名第六,是一个由 Infiniband 互联的 560 个 DGX-A100 机箱组成的深度学习(Deep Learning, DL)训练集群。每个 DGX-A100 机箱包含 8 块由 NVSwitch 互联的 A100 GPU,总共有 4480 块 GPU。
图 3 展示了如何在单块 GPU 上纵向扩展以满足深度学习的需求。GPU 的推理性能已经提升了 317 倍,从 2012 年的 Kepler 到 2020 年的 Ampere,每年有超过 2 倍的性能提升,远远超过了摩尔定律所预测的增长系数。这一增长速度被称为黄氏定律(Huang's Law),其高速增长很大程度上依赖于增加深度学习专用的数据类型和指令。推理计算的性能在 Kepler 时代,可用的是 4 TFLOPS 的 FP32 处理能力。这种数据表示超出了 DL (尤其是推理)所需的精度。除此之外,在 Kepler 架构上,可利用的最复杂的指令是融合乘加指令(fused multiply–add, FMA),Kepler 只能够将指令的提取、解码以及操作数的提取分摊到,每个通道(lane)的两个数学运算上。(注,通过乘加操作的计算耗时来隐藏指令延迟和操作数读写延迟)。2016 年,Pascal 架构增加 FP32 的性能到 10.6 TFLOPS,同时增加了 21.3 TFLOPS 的 FP16 能力。Pascal 不仅仅是拥有更高的 DL 性能,同时也具有很好的能效,主要原因是:1)对于 DL 应用,FP16 的精度和动态范围都是足够的;2)Pascal 的点积(dot-product)指令,像 FDP4,能够通过增加数学操作的数量来分摊指令的开销。
在 2017 年发布的Volta 上重磅推出 Tensor Core 架构,在 DL 的性能方面取得重大进步。Volta Tensor Core 实现了一条支持 FP16 精度的 4x4 矩阵乘加指令,HMMA,这是大多数 DL 算法的内循环形式。单一指令支持 128 个浮点操作(64 FP16 乘,64 次 FP16 加,注:两个 4x4 的矩阵相乘,需要做 64 次乘法,64 次加法),大量的计算很好的隐藏了指令开销,致使其可以忽律不计。因此,GPU Tensor Core 是一种拥有灵活的可编程架构的高效 DL 专用芯片。Volta 的 FP16 Tensor Core 总共提供了 125 TFLOPS 的 FP16 性能。在 2018 年,在 Tuning 架构上发布了 INT8 Tensor Core,能够提供 260 TOPS 的 INT8 算力。它引入了 IMMA 指令,能够单指令计算一个 INT8 的 8x8 矩阵乘加。在 Tuning 架构上支持 INT8 Tensor Core 是最理想的,因为此时对于大多数的推理任务 INT8 的精度和动态范围已经足够。
在 2020 年,Ampere 架构上发布的 Tensor Core 支持稀疏化数据的计算。稀疏化 MMA 指令对于权重矩阵每 4 个元素中有 2 个是 0 的情况,会有两倍的性能提升,这种稀疏化叫做结构化稀疏(structured sparsity)。稀疏化指令使得 Ampere 架构的总推理性能达到 1248 TOPS(INT8)。下一节讲对 Ampere 架构进行详细描述。
与在 HPC 领域相同,在深度学习领域 GPU 取得成功的关键因素依然是软件。从 2012 年发布 cuDNN 开始,一个为深度学习应用创建庞大软件生态的计划已经被作为重要目标。NVIDIA 的 Tensor RT (TRT) 是最优化的推理代码库,它的 Triton 推理服务器能够管理多个模型的调度。第三方框架,如 TensorFlow,Pytorch 和 Caffe2 都支持 NVIDIA 的这些库。NVIDIA 的 DALI 软件库管理部分深度学习训练的预处理流水线(pipeline),例如分阶段的数据预处理和数据解压等操作。NVIDIA 推出的模板库 CUTLASS 大大简化了程序员为每一代 GPU 开发高性能矩阵乘 kernel 的负担。也提供支持医学成像和视频分析等应用程序的库。软件栈的发展对于深度学习的性能也是至关重要的。在 MLPerf Training V1.0 的提交中,相同的硬件上,仅仅由于软件的增强,性能便提升 2.1 倍。
由于高性能和丰富的软件生态,如今 GPU 成为深度学习应用的首要平台。最新的 MLPerf 结果显示 NVIDIA 的 GPU 系统是用于数据中心推理和训练的最快的商用平台。
05
A100: 当今的 GPU
Ampere 的 A100,在 2020 年发布,如图 4 所示,是目前最新的 NVIDIA GPU。Ampere 采用 7 nm 技术,在有限的芯片面积上集成了 540 亿个晶体管。表 1 对比了 Ampere A100 与它上一代数据中心处理器 Volta V100 (2017)的关键属性。Ampere 在每一个关键硬件特性上都有惊人的增长,其中包括 5 倍的 FP16 吞吐,2.2 倍的 DRAM 带宽以及 6.7 倍的片上 L2 cache。除了大量的并行计算吞吐和内存带宽,Ampere 架构还在包括用于机器学习和 HPC 的硬件支持,以及用于大型数据中心和超级计算机的可扩展性功能。
先进的支持。例如,Ampere 通过在复杂的任务图中自动发射计算任务来加速 CUDA 的任务图执行效率。Ampere 同样为 arrive/wait barriers 提供硬件支持,有利于 GPU 更好的执行异步任务。最后,Ampere 架构在硬件上增加了对 Cooperative Groups 的支持,例如通过 warp-wide 的 reduction 操作加速 group-wide 的 collective 操作(Finally, Ampere provides additional hardware support for CUDA’s Cooperative Groups, such as a warp-wide reduction operation that accelerates group-wide collective operations.)。
机器学习特性
每个 Ampere 的 Tensor Core 使用 256 个 FP16 浮点计算单元在一个周期内完成 8x4x8 的混合精度矩阵乘法。Tensor Core 架构也支持不同数字表示的的高吞吐计算,例如 INT1,INT4,INT8,FP16, BFloat16(8 bit 指数位,7 bit 尾数位,E8:M7)。A100 也发布了一种新的数据格式,TF32(TensorFloat-32, E8:M10), 它能够提供与 FP32 相同的指数动态范围,但是把尾数的精度降低到 10 bit。A100 在硬件上提供对这种 19 bit 数据的支持,其性能达到 FP32 吞吐的 8 倍,同时能够提供充足的精度,以达到 DNN 网络使用 FP32 训练所达到的精度。
之前提到,A100 的 Tensor Core 在硬件上支持结构化稀疏,这一特性可以有效降低 DNN 权重数据的存储,同时通过减少不必要的计算,增加吞吐。结构化稀疏要求每个子向量的4个分量中有 2 个分量是 0,这样可以用于压缩权重矩阵(类似于 Tensor Core 中 C = A x B 矩阵乘中得 A 矩阵)。这一特性把计算转换为一个更小的矩阵计算,它仅需要原先一半的计算密度,因此能够产生 2 倍的性能提升。虽然结构化稀疏要求神经网络在训练的过程中要有额外的训练细节,但是它不会在包括视觉、目标检测、分割、自然语言处理以及语言翻译等广泛的神经网络上产生精度损失。
在存储系统上,A100 也提供了一系列的特性来更好的控制数据的搬运和放置。为了提高能效,A100 支持数据直接从全局内存传输到共享内存,不需要经过寄存器转运。A100 也提供了一系列新的控制 L2 cache 的操作,允许程序员影响 cache 的替换策略,以及高效的决定哪些数据能够驻留在 cache 中,哪些可以直接从 DRAM 中获取而不污染 cache。最后,L2 cache 包含硬件支持的数据压缩技术,这一技术保证在 DRAM 和 L2 cache 中的数据都是压缩的,在 SM 读取数据的时候进行解压缩,写数据的时候进行压缩,这样可以很好的节省带宽。
高性能计算特性
传统的 HPC 任务依然需要更高的双精度浮点计算能力,以及内存带宽和互联带宽。在 GEMM 加速方面,A100 在体系结构上增加了 Tensor Core 对 FP64 的支持,增强 GPU 的双精度浮点算力到 19.5 TFLOPS。此外 A100 部署了第三代 NVLink 互联技术,通过每通道 50 Gb/s 的引脚数据速率(pin data rate)和 12 通道的 NVLink 组合获得了 600 GB/s 的片外带宽。高速互联可以使任意两个系统紧密的联系在一起,例如 DGX A100 就是使用 8 块 A100 两两相连,任意两块 A100 之间都能够实现 600 GB/s 的数据传输速率,同时,整个系统能够提供 150 TFLOPS 的 FP64 算力。使用 Infiniband 扩展,Selene 的 560 DGX-A100 能够在 2.6 MW 的功率下,达到 64 PFLOPS 的算力;在 2021 年 6 月的 Green 500 列表中,最节能的 10 台超级计算机中有 9 台使用 A100 GPUs。
图形特性
除了传统的光栅图形外,Ampere 架构还包括了对光线追踪的硬件支持。从图灵 GPU 开始,NVIDIA 把 RT Core 与 SM 集成,用以加速层次包围体(bounding-volume hierarchy,BVH)数据结构遍历以及 ray-triangle 相交测试。运行在 SM 上的并行着色器代码模拟数百万光线,通过它们传递给 RT core,RT core 预测光线是否击中三角形。Ampere 的 RT core 的吞吐是图灵的两倍,相对于 GPU 上的软件光追,可以实现 2-3 倍的渲染帧率。图形和计算的重要特性逐步趋同,例如 Turing 和 Ampere 支持图形应用使用基于机器学习的图形算法,例如深度学习超采样(Deep learning supersampling, DLSS), 使用 Tensor Core 去加速光追流水线。
06
未来的方向
GPU 已经演进为极具计算能力的平台,硬件上支持图形计算、HPC 和深度学习的加速。未来几年,GPU 将在性能、应用领域、可扩展性和可编程性方面继续发展。
正如我们在十年前的文章中大体预测的那样,GPU FP64 性能从 2010 年的 Fermi 到 2020 年的 Ampere,十年间增长了 20 倍,年增长率为 35%(见图 5)。我们预计这一趋势将会在未来的 GPU 迭代中持续,但是会放缓。虽然 2005 年 Dennard 微缩技术的终结停止了传统的电压微缩技术,但半导体特征尺寸仍在变得更小。随着 GPU 的技术曲线从 Ampere 的 7 nm,到 5 nm,3 nm 以及更高的工艺,我们将会在芯片上集成更多的器件和电容,因此一个特定功能所需的能量将会减少,单位面积或者单位功耗将产生更高的性能。深度学习推理的性能已经以很高的速率(见图3)在增加,每年增速超过 100%。我们预计这一趋势将会持续几代,但是随着架构的成熟,主要增长来自技术的驱动,最终将会趋于每年 35% 。
GPU 性能持续提升的主要挑战来自于内存带宽。虽然像 Linpack 这样的基准测试可以很好的使用 cache 以保证 A100 的计算单元可以被填满,但是大多数 HPC 和光追图形应用依然受到带宽限制。一个经典的 HPC 应用,每个 FP64 算术操作需要从内存获取 1-4 bytes 的数据。例如,HPCG 基准测试是使用共轭梯度求解器代码的代表,它的访存计算比 (Byte/Flop) 达到 4 : 1。内存带宽是从 Pascal 一代开始出现重大飞跃,从此开始向高带宽内存(high-bandwidth memory, HBM)发展。Ampere 的 FP64 Tensor Core 和 HBM2E 的 DRAM 使得访存计算比达到 0.1。为了继续扩展内存带宽和HPC应用程序性能,我们预计还需要在封装和内存架构方面进行更多的创新。
GPU 是融入新的专用需求的理想硬件加速平台。它提供了可编程平台和高速的片上带宽,以及片外存储系统和高速的片外互联技术。专用需求的硬件可以以新的指令添加到 SM 中(就像为深度学习添加的 Tensor Core 指令),或者作为独立的内存事务,从 SM 启动相关操作(例如 RT cores)。我们预测,在未来几年,新的指令和基于内存的加速器将被集成到 GPU 中,以支持数据库、稀疏线性代数和生物信息学等应用领域。
另外,除了纵向扩展单个 GPU 的性能,我们预测 GPU 将被横向扩展到更大的集群,以赋能深度学习训练和 HPC 应用。如今,通过 NVLink 连接的 Ampere 系统能够实现每组超过 8 个 GPU之间以 600 GB/s 的带宽共享彼此的内存,就像一块 GPU 一样。在未来几代中,我们预计芯片外通信带宽将继续扩大,NVLink连接节点和 Infiniband 连接集群的规模将继续增长。我们也期望GPU、CPU 和 DPUs(智能网卡)之间更紧密的集成,以更少的开销实现更高带宽的通信和 I/O。
CUDA和相关库的使用已经简化了gpu编程,超过600个HPC应用程序都是gpu加速的。由于有更好的工具和对编程的抽象,我们预计未来的 GPU 编程将更加简单。例如,Legate 编程系统允许 Numpy 程序在任意数量的 GPU 上运行,从单个 GPU 到4,480 个 GPU 集群(如Selene)。Legate 是建立在 Legion 之上的一个运行时系统,它能够管理多 GPU 应用的任务图及其数据模型。Legion 负责任务的调度和管理数据通信、复制和迁移,大大简化了多gpu系统的编程任务。
未来 GPU 编程的一个挑战是,从不同的 SMs 访问不同的内存位置时非统一内存访问(Nonuniform memory access,NUMA)所带来的固有开销。曾经 GPU 提供过一个统一内存访问(Uniform memory access,UMA)模型,从任意 SM 访问内存的任意位置开销都是均等的。随着 GPU 尺寸和多 GPU 系统规模的逐渐增大,要求所有的内存出现在同样距离的位置上变得不可能,也就导致 UMA 模型变得不可维护。我们预计向非统一内存访问模型的转变能够促使 SMs 接近内存的某些部分,以便它们能够利用局部性来提高性能和效率。这一转变,将要求 GPU 程序具有更好的局部性表达,以便 GPU threads 能够和他们所操作的数据具有更好的一致局部性。虽然程序员已经在多 GPU 系统中采用了这样的策略,但是我们希望 NUMA 模型在单 GPU 中也能够更有效。
自 GeForce 256 面世的 20 多年里, GPU 已经取得了长足的发展。它们在性能方面增加了 390 倍,同时变得高度可编程,并增加了专用领域的硬件来支持 HPC、深度学习和光线追踪。我们期待在未来20年里,在性能和功能上也会有类似的进步。
07
致谢
在NVIDIA硬件和软件工程师的共同努力下,GPU 在过去的20年里得到了快速的发展。我们都期待着共同建设未来。
08
参考文献
略 见原文 https://ieeexplore.ieee.org/document/9623445