GPU内存概念浅析

1. 内存架构

 系统存储

  • L1/L2/L3:多级缓存,位置在 CPU 芯片内部;
  • System DRAM:动态 RAM,CPU 芯片外部内存,如内存条
  • Disk/Buffer:外部存储,如磁盘或者固态硬盘。

GPU设备存储

  • L1/L2 cache:多级缓存,位置在 GPU 芯片内部;
  • GPU DRAM:通常所指的显存;

传输通道

  • PCIE BUS:PCIE标准的数据通道,数据就是通过该通道从显卡到达主机;
  • BUS: 总线。计算机内部各个存储之间交互数据的通道;
  • PCIE-to-PCIE:显卡之间通过PCIE直接传输数据;
  • NVLINK:NVIDIA 公司推出的、用于显卡之间的专用的超高速数据传输通道。

在磁盘/硬盘(Disk/SSD)上面的数据传入到 GPU 的内存要经过:硬盘 -> 系统内存 -> GPU 内存的过程。这个速度非常慢,要极力避免这种传输。

 

 

PCIE 6.0 的最大理论传输带宽为 128GB/s;而第四代 NVLINK 的能够提供 GPU 之间 900GB/s 的带宽。二者有接近一个数量级的差距。

2. GPU内存硬件

GPU 内存硬件的分类,按照是否在芯片上面可以分为片上 (on chip) 内存和片下 (off chip) 内存。

  • 片上内存:主要用于缓存 (cache) 以及少量特殊存储单元(如texture)。特点是速度快,存储空间小;
  • 片下内存:主要用于全局存储 (global memory) 即常说的显存,特点是速度相对慢,存储空间大。不同于 CPU 系统内存可扩展的设计,GPU 的整体内存大小是固定的,在选择好显卡型号后就会确定好,包括缓存和全局存储。

高带宽存储 HBM (High Bandwidth Memory) 是常用的片下 GPU 存储硬件。它将很多个 DDR 芯片堆叠在一起后和 GPU 封装在一起,实现大容量,高位宽的 DDR 组合阵列。

 

3. GPU内部架构

GPU 由许多 SM 组成。SM(Streaming Multiprocessors):可以理解为一个 GPU 计算单元的小集合,好比多核 CPU 的一个核 —— 但 CPU 的一个核一般运行一个线程,而 SM 能够运行多个轻量线程。

Wrap scheduler:运算规划器,可以理解为运算时一个 warp 抓一把线程(threads)扔进了 cores 里面进行计算。

每一个 SM 有自己的 Wrap scheduler 、寄存器(Register)、指令缓存、L1缓存、共享内存。

A100 中每个 SM 包括 4 个 SM partition(SMP),里边绿色的就是 Streaming Processor(SP),也叫 CUDA cores,它们是实际执行计算的基本单元。

 

所有的 SM 共享 L2 缓存。整个 GPU 内存结构如下图所示:

 

4. GPU的内部存储

按照存储功能进行细分,GPU 内存可以分为:局部内存(local memory)、全局内存(global memory)、常量内存(constant memory)、共享内存(shared memory)、寄存器(register)、L1/L2 缓存等。

其中全局内存、局部内存、常量内存都是片下内存,储存在 HBM 上。所以我们说 HBM 的大部分作为全局内存。

 全局内存

全局内存(global memory)能被 GPU 的所有线程访问,全局共享。它是片下(off chip)内存,前面提到的硬件 HBM 中的大部分都是用作全局内存。跟 CPU 架构一样,运算单元不能直接使用全局内存的数据,需要经过缓存,其过程如下图所示:

 

L1/L2缓存

L2 缓存可以被所有 SM 访问,速度比全局内存快;L1 缓存用于存储 SM 内的数据,被 SM 内的 CUDA cores 共享,但是跨 SM 之间的 L1 不能相互访问。

合理运用 L2 缓存能够提速运算。A100 的 L2 缓存能够设置至多 40MB 的持续化数据 (persistent data),能够拉升算子 kernel 的带宽和性能。Flash attention 的思路就是尽可能地利用 L2 缓存,减少 HBM 的数据读写时间。

 

关于SRAM与DRAM

RAM 分为静态 RAM(SRAM)和动态 RAM(DRAM)。SRAM 只要存入数据后,即使不刷新也不会丢失记忆;而 DRAM 的电容需要周期性地充电,否则无法确保记忆长存。

DRAM 密度高、成本低、访问速度较慢、耗电量大。SRAM 则刚好相反。因此 SRAM 首选用于带宽要求高,或者功耗要求低的情境。如:CPU Cache、GPU On-Chip Buffer。DRAM 则一般用于系统内存、显存。

根据 What is the type of on-chip memories in NVIDIA gpus!? 这个讨论,GPU 的片上内存都是 SRAM。

局部内存

局部内存 (local memory) 是线程独享的内存资源,线程之间不可以相互访问。局部内存属于片下内存,所以访问速度跟全局内存一样。它主要是用来应对寄存器不足时的场景,即在线程申请的变量超过可用的寄存器大小时,nvcc 会自动将一部数据放置到片下内存里。

寄存器

寄存器(register)是线程能独立访问的资源,它是片上(on chip)存储,用来存储一些线程的暂存数据。寄存器的速度是访问中最快的,但是它的容量较小,只有几百甚至几十 KB,而且要被许多线程均分。

共享内存

共享内存(shared memory) 是一种在线程块内能访问的内存,是片上(on chip)存储,访问速度较快。

共享内存主要是缓存一些需要反复读写的数据。

注:共享内存与 L1 缓存的位置、速度极其类似,区别在于共享内存的控制与生命周期管理与 L1 不同:共享内存受用户控制,L1 受系统控制。共享内存更利于线程块之间数据交互。

常量内存

常量内存(constant memory)是片下(off chip)存储,但是通过特殊的常量内存缓存(constant cache)进行缓存读取,它是只读内存。

常量内存主要是解决一个 warp scheduler 内多个线程访问相同数据时速度太慢的问题。假设所有线程都需要访问一个 constant_A 的常量,在存储介质上 constant_A 的数据只保存了一份,而内存的物理读取方式决定了多个线程不能在同一时刻读取到该变量,所以会出现先后访问的问题,这样使得并行计算的线程出现了运算时差。常量内存正是解决这样的问题而设置的,它有对应的 cache 位置产生多个副本,让线程访问时不存在冲突,从而保证并行度。

5. Tensor Core

先讨论一下 CUDA core 和 Tensor core 的区别。首先,Tensor core 是在 Volta 以及之后的架构中才有的。相比于CUDA core,它可以提供更高效的运算。

具体来说,每个 GPU clock,CUDA core 可以进行一次单精度乘加运算,即:in fp32: x += y * z

每个 GPU clock,Tensor core 可以完成 4 × 4 的混合精度矩阵乘加 (matrix multiply-accumulate, MMA):D=A * B + C,其中 A、B、C、D 都是 4 × 4 矩阵。A 和 B是 FP16 矩阵,而累加矩阵 C 和 D 可以是 FP16 或 FP32 矩阵(FP16/FP16 或 FP16/FP32 两种模式)

注:Turing 架构中新增了 INT8/INT32, INT4/INT32, INT1/INT32 等模式

 

所以每个 GPU clock,Tensor core 可以执行 64 个浮点 FMA 混合精度运算(4 × 4 × 4)。疑问:我感觉应该是4x4x4(乘法) + 4x4x4(加法) + 4x4(加法) = 144 次运算,如果单论乘加运算,确实是4x4x4次运算。

V100 中,一个 SM 中有 8 个 Tensor core,每个 GPU clock 共可以执行 1024 个浮点运算(64 × 8 × 2,乘以 2 因为乘加是两个浮点运算)。

注:这里说的 GPU clock 和 GPU 的频率有关。GPU 的频率越高,GPU clock 越短。对于 V100,GPU frequency 等于 1.38GHz。

TENSOR CORE DL PERFORMANCE GUIDE 这份官方文档中提到,要充分发挥 Tensor core 的性能,必须要选择合适的矩阵尺寸。

 

6. Transformer 中的应用 

在 Transformer 架构中需要注意的几个点:

词表大小填充至 8 的倍数,可以显著加速最后一层投影层的计算:

 

将句子长度填充为 8 的倍数。transformers.DataCollatorForSeq2Seq 中有一个参数 pad_to_multiple_of 就是为了这个目的。

单个 batch 内的所有 tokens 数目等于 SM 数目的倍数时,计算效率(TFLOPS)会有略微提升。

 

 

 

参考链接

  • https://zhuanlan.zhihu.com/p/651179378?utm_id=0
posted @   青山牧云人  阅读(4586)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示