AI 开发中的隐形瓶颈:GPU 内存层次结构是如何影响你的项目的?
AI 开发中的隐形瓶颈:GPU 内存层次结构是如何影响你的项目的?
在AI开发中,GPU内存层次结构是一个容易被忽视但至关重要的因素。从CUDA的基础架构到最新的H100 GPU特性,理解内存层次结构对于优化性能、减少延迟和降低功耗至关重要。本文将深入探讨GPU内存的各个层次,帮助开发者更好地利用GPU的计算能力。
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)单元和异步事务屏障。