GPU 内存层次结构正日益成为深度学习研究人员和从业者感兴趣的领域。通过围绕内存层次结构建立直觉,开发人员可以最大限度地减少内存访问延迟、最大限度地提高内存带宽并降低功耗,从而缩短处理时间、加快数据传输速度并实现经济高效的计算使用。彻底了解内存架构将使开发人员能够大规模实现 GPU 的峰值能力。
CUDA 回顾
CUDA(计算统一设备架构)是由 NVIDIA 为 GPU 配置而开发的并行计算平台。
当主机代码(即在 CPU 上执行的串行代码)调用内核函数时,CUDA 程序的执行就开始了。此函数调用会在设备(即 GPU)上启动一个线程网格,以并行处理不同的数据组件。
线程由程序的代码、当前执行点,以及代码中的变量和数据结构的值组成。一组线程组成一个线程块,而多个线程块组成 CUDA 内核网格。这些软件组件、线程和线程块直接对应于硬件上的类似物:CUDA 核心和 CUDA 流式多处理器 (SM)。
所有这些共同构成了 GPU 的组成部分。
图:线程被组织成块,块被组织成网格。图片取自 NVIDIA 技术博客
图:图片取自NVIDIA H100白皮书
H100s 引入了新的线程块集群架构,扩展了 GPU 的物理编程架构,现在包括线程、线程块、线程块集群和网格。
CUDA 内存类型
CUDA 设备使用的内存存储类型的可访问性和持续时间各不相同。当 CUDA 程序员将变量分配给特定的 CUDA 内存类型时,他们会指定如何访问该变量、访问速度以及可见性程度。
以下是不同内存类型的简要概述:
图:图片取自教科书《大规模并行处理器编程》第 4 版第 5 章
寄存器内存是每个线程的私有内存,这意味着当特定线程结束时,寄存器中的数据将会丢失。
本地内存同样是每个线程的私有内存,但它的访问速度比寄存器内存要慢。
共享内存可以被同一线程块中的所有线程访问,并且在整个线程块的生命周期内持续存在。
全局内存的数据在整个网格或主机的生命周期内持续存在,所有线程和主机都可以访问全局内存。
常量内存是只读的,专为在内核执行期间不会改变的数据而设计。
纹理内存则是另一种只读内存类型,非常适合用于访问物理上相邻的数据。与全局内存相比,纹理内存的使用可以减少内存流量并提高性能
GPU 内存层次结构
在内存访问效率方面,速度与容量之间存在权衡。通常,速度越高,内存容量就越小。
寄存器
寄存器是 GPU 上最快的内存组件,包括用于直接为 CUDA 核心提供数据的寄存器文件。内核函数利用寄存器来存储线程私有且频繁访问的变量。
寄存器和共享内存都是片上内存,驻留在这些内存中的变量可以被并行高效地访问。
通过有效利用寄存器,可以最大限度地重复使用数据,从而优化性能。
缓存级别
现代处理器通常具有多级缓存。缓存与处理器的距离决定了缓存的编号方式。
L1 缓存
L1(一级)缓存直接连接到处理器核心。当活动数据量超过 SM(流式多处理器)寄存器文件的容量时,L1 缓存充当备用存储区域。
L2 缓存
L2(二级)缓存容量较大,通常在多个 SM 之间共享。与 L1 缓存不同,L2 缓存通常只有一个。
常量缓存
常量缓存用于存储每个内核中常用的变量,以提高性能。
在为大规模并行处理器设计内存系统时,常量内存变量是预设的,不需要重新写入。为此,像常量缓存这样的专用内存系统可以消除对计算成本高昂的硬件逻辑的需求。
H100s 的新内存功能
图:NVIDIA Hopper 流式多处理器。图片取自 NVIDIA H100 白皮书
Hopper 通过其 H100 系列 GPU 推出了新功能,与之前的 NVIDIA 微架构相比,其性能得到了增强。
线程块集群
如前文所述,线程块集群首次出现在 H100 中,扩展了 CUDA 编程的层次结构。通过线程块集群,可以对比单个 SM 上的线程块更大规模的线程组进行更精细的编程控制。
异步执行
异步执行的最新进展引入了张量内存加速器 (TMA) 和异步事务屏障到 Hopper 架构中。
张量内存加速器 (TMA) 单元允许在全局内存和共享内存之间高效传输大块数据。
异步事务屏障则使得无论 CUDA 线程和片上加速器是否位于不同的 SM 上,都能够实现同步。
图:H100 包含 Ampere GPU 架构中引入的异步屏障和新的异步事务屏障
结论
将变量分配给特定的 CUDA 内存类型允许程序员对其行为进行精确控制。这种指定不仅决定了变量的访问方式,还决定了访问的速度。存储在访问速度更快的内存类型(如寄存器或共享内存)中的变量可以被快速检索,从而加速计算。相反,存储在访问速度较慢的内存类型(如全局内存)中的变量则会被较慢地访问。此外,内存类型的分配还会影响变量的作用范围以及与其他线程的交互。具体分配的内存类型决定了变量是否可供单个线程、线程块或整个网格内的所有线程访问。最后,当前用于 AI 工作流的最先进 GPU H100s 引入了一些影响内存访问的新功能,如线程块集群、张量内存加速器 (TMA) 单元和异步事务屏障。
最后,如果你希望快速获得 H100 GPU 资源,欢迎了解 DigitalOcean 的 Paperspace 提供 GPU 驱动的虚拟机和 Jupyter IDE notebook,它们可以用于训练和运行复杂模型。除了 H100,DigitalOcean 还支持包括 A5000、A6000、A100 在内的多种 GPU。