AI Infra 硬件体系与编程模型:3. GPU 流处理器解析
AI Infra 学习必知:GPU 流处理器(SM)深度解析与核心要点
作为一名 AI Infra 工程师,如果你只能深入理解一个 GPU 硬件概念,那一定是流多处理器(Streaming Multiprocessor, SM)。它是 GPU 的"心脏"和基本计算单元,决定了 GPU 的并行能力上限,也是所有 AI 训练和推理性能优化的最终落脚点。
不理解 SM,你就无法真正解释为什么同样的 FLOPS 不同 GPU 实际性能差异巨大,为什么有些算子跑不满 GPU,为什么混合精度训练能带来数倍加速,更不用说进行底层的 kernel 优化和大模型性能调优了。
一、从宏观到微观:GPU 架构的层级结构
在深入 SM 之前,我们先建立一个清晰的 GPU 整体架构认知。现代 GPU 采用严格的分层设计,从大到小依次是:
GPU 芯片 ├── 图形处理集群(GPC) │ ├── 纹理处理集群(TPC) │ │ └── 流多处理器(SM)← 我们今天的主角 │ │ ├── 计算核心(CUDA Core/Tensor Core) │ │ ├── 调度单元(Warp Scheduler) │ │ └── 存储单元(寄存器/共享内存/L1缓存) ├── L2 缓存 └── HBM 显存控制器核心认知:GPU 不是一个单一的处理器,而是由数十到上百个独立的 SM 组成的"计算集群"。每个 SM 都是一个功能完备的"迷你处理器",拥有自己的计算、调度和存储资源,能够独立执行线程块,如下图所示。
以当前主流的数据中心 GPU 为例:
- NVIDIA A100:108 个 SM
- NVIDIA H100:144 个 SM
- NVIDIA B100:160 个 SM
SM 数量直接决定了 GPU 的理论峰值算力。例如,H100 的 FP16 峰值算力 = 144 SM × 4 Tensor Core/SM × 256 FMA/周期 × 1.83 GHz ≈ 335 TFLOPS。
二、SM 的"解剖学":内部组件详解
一个现代的 SM(以 Hopper H100 为例)是一个高度复杂的单元,集成了执行计算、调度和存储所需的一切。根据下图,我们可以将其分为三大核心模块:
2.1 执行核心:真正干活的"劳动者"
这是 SM 内部执行数学运算的硬件单元,也是 AI 算力的直接来源。
| 核心类型 | 主要功能 | AI 工作负载中的作用 |
|---|---|---|
| FP32 CUDA Core | 32位单精度浮点运算 | 传统科学计算、部分算子的通用计算 |
| INT32 Core | 32位整数运算 | 地址计算、循环计数、量化推理 |
| FP64 Core | 64位双精度浮点运算 | 高精度科学计算(AI 中很少使用) |
| Tensor Core | 硬件化矩阵乘加(GEMM) | AI 训练和推理的绝对主力 |
| SFU(特殊功能单元) | 超越函数(sin/cos/exp等) | 激活函数计算 |
关键区别:CUDA Core 一次只能执行一个标量运算(a×b+c),而 Tensor Core 一次能执行一个完整的矩阵乘加运算(D=A×B+C)。对于 AI 中无处不在的矩阵乘法,Tensor Core 能提供比 CUDA Core 高 10-20 倍的性能。
2.2 调度单元:让核心不闲着的"管理者"
SM 的高效运行离不开强大的调度系统。现代 SM 通常包含多个 Warp 调度器和分发单元:
- Warp 调度器:负责管理和调度 Warp(32 个线程的组)的执行
- 分发单元:将指令分发给对应的计算核心
- 指令缓存:存储 SM 要执行的指令
核心机制:延迟隐藏。当一个 Warp 因为等待数据从显存返回而暂停时,Warp 调度器不会等待,而是立即切换到另一个准备就绪的 Warp 执行。这种硬件级的线程切换几乎没有开销,是 GPU 实现高吞吐量的关键。
2.3 存储单元:靠近计算的"数据仓库"
SM 内部集成了多级高速存储,以减少对外部慢速显存的访问。速度从快到慢依次是:
- 寄存器文件:GPU 上最快的存储,每个 SM 拥有巨大的寄存器文件(H100 每个 SM 有 256 KB)。寄存器被动态分配给活跃线程,用于存放临时变量。
- 共享内存:程序员可控的片上存储,线程块内的所有线程可以共享访问。H100 每个 SM 最多可配置 228 KB 共享内存。
- L1 缓存:自动管理的高速缓存,用于缓存频繁访问的数据和指令。
重要比例:在 AI 工作负载中,内存访问往往是性能瓶颈,而不是计算。因此,如何高效利用 SM 内部的高速存储,是性能优化的核心。
三、SM 的核心工作原理:SIMT 执行模型
GPU 采用单指令多线程(Single Instruction, Multiple Threads, SIMT)执行模型,这是它与 CPU 最根本的区别。
3.1 什么是 SIMT?
比喻:想象一个工厂车间(SM),里面有 32 个工人(CUDA Core)。车间主任(Warp 调度器)喊一声"把手上两个数相乘",32 个工人同时执行这同一条指令,但每个人算不同的数。
核心特点:
- 一条指令同时驱动 32 个线程(一个 Warp)
- 所有线程必须步调一致,执行相同的指令
- 如果线程出现分支(if-else),不同分支的线程会被串行执行,效率暴跌
3.2 线程的层级结构
CUDA 编程模型将线程组织成三级结构:
- Grid:一个 Kernel 启动的所有线程的集合
- Block(线程块):Grid 被划分为多个线程块,每个线程块被分配到一个 SM 上执行
- Warp:线程块被进一步划分为多个 Warp,每个 Warp 包含 32 个线程,是 SM 调度的基本单位
关键规则:
- 一个线程块一旦被分配到某个 SM,就会一直在该 SM 上执行直到完成
- 一个 SM 可以同时驻留多个线程块(H100 每个 SM 最多可驻留 32 个线程块)
- 一个 SM 可以同时管理数千个线程,但同一时刻只有少数几个 Warp 在执行
3.3 延迟隐藏的工作过程
- Warp A 执行一条加载指令,需要从全局显存获取数据(延迟约 400-800 个时钟周期)
- Warp 调度器立即切换到 Warp B,执行它的指令
- 当 Warp B 也遇到长延迟操作时,再切换到 Warp C
- 当 Warp A 的数据到达时,它重新进入就绪队列,等待调度
结论:GPU 通过"用并行性换延迟"的方式实现高吞吐量。要让 GPU 跑满,必须提供足够多的并行线程来隐藏各种延迟。
四、Tensor Core:AI 时代 SM 的"心脏"
如果说 SM 是 GPU 的心脏,那么 Tensor Core 就是 SM 的心脏。自 Volta 架构引入以来,Tensor Core 已经成为 AI 算力的绝对主导者。
4.1 Tensor Core 是什么?
Tensor Core 是一种硬件化的矩阵乘加(MMA)单元。它不是执行单一的加法或乘法,而是一次性完成一个完整的矩阵乘法运算。
基本操作:D = A × B + C
- A 和 B 是输入矩阵
- C 是累加矩阵
- D 是输出矩阵
4.2 Tensor Core 的性能优势
以 H100 的第四代 Tensor Core 为例:
- 每个 Tensor Core 每周期可执行 256 个 FP16 FMA 运算
- 每个 SM 有 4 个 Tensor Core
- 每个 SM 每周期可执行 1024 个 FP16 FMA 运算
- 相比之下,每个 SM 只有 128 个 FP32 CUDA Core,每周期只能执行 128 个 FMA 运算
8 倍的理论性能差距!这就是为什么混合精度训练能带来数倍加速的根本原因——它能充分利用 Tensor Core。
4.3 Tensor Core 支持的精度格式
随着架构演进,Tensor Core 支持的精度格式越来越丰富,专门针对 AI 工作负载优化:
| 架构 | 支持的精度格式 | 典型应用 |
|---|---|---|
| Volta | FP16 | 早期深度学习训练 |
| Ampere | FP16, BF16, TF32, INT8 | 主流训练和推理 |
| Hopper | FP16, BF16, TF32, FP8, INT8, INT4 | 大模型训练和高吞吐推理 |
| Blackwell | FP16, BF16, TF32, FP8, NVFP4, INT4 | 极致推理性能 |
NVFP4:Blackwell 架构引入的全新 4 位浮点格式,结合双级缩放机制,在保持精度的同时,将推理吞吐量再提升一倍。
五、SM 架构演进:从 Ampere 到 Blackwell
NVIDIA 每一代 GPU 架构都会对 SM 进行重大改进,以更好地适应 AI 工作负载的需求。
5.1 Ampere(A100):AI 架构的里程碑
- 首次引入 TF32 精度,在保持 FP32 精度的同时,利用 Tensor Core 加速
- 支持结构化稀疏,进一步提升 Tensor Core 性能
- 引入异步内存拷贝,减少数据搬运开销
- 每个 SM:64 个 FP32 Core,4 个第三代 Tensor Core,256 KB 寄存器文件,164 KB L1/共享内存
5.2 Hopper(H100):Transformer 优化
- 第四代 Tensor Core,支持 FP8 精度,Transformer 引擎
- 线程块集群(Thread Block Cluster),允许 SM 之间直接访问共享内存
- 分布式共享内存(DSMEM),提升 SM 间通信效率
- 每个 SM:128 个 FP32 Core,4 个第四代 Tensor Core,256 KB 寄存器文件,228 KB L1/共享内存
5.3 Blackwell(B100):推理性能的飞跃
- 第五代 Tensor Core,支持 NVFP4 精度,第二代 Transformer 引擎
- 双线程块 MMA,成对的 SM 协同工作,共享操作数
- 每个 SM 配备 256 KB Tensor 内存(TMEM),专门为 Tensor Core 提供数据
- 统一 INT32/FP32 流水线,提高资源利用率
- 每个 SM:128 个统一 INT32/FP32 Core,4 个第五代 Tensor Core,256 KB 寄存器文件,256 KB TMEM
演进趋势:越来越多的硅片面积被分配给 Tensor Core 和专用 AI 加速单元,通用计算单元的比例逐渐下降。这反映了 GPU 从通用并行处理器向 AI 专用处理器的转变。
六、AI Infra 工程师必须掌握的 SM 相关性能优化要点
理解 SM 架构的最终目的是为了优化 AI 工作负载的性能。以下是每个 AI Infra 工程师都应该掌握的核心优化原则:
6.1 充分利用 Tensor Core
- 使用混合精度训练:FP16/BF16 训练能充分利用 Tensor Core,带来 2-4 倍的性能提升
- 使用 FP8 训练:H100 及以上 GPU 支持 FP8 训练,可进一步提升 2 倍性能
- 确保矩阵维度对齐:Tensor Core 对矩阵维度有特定要求(如 16 的倍数),对齐后才能获得最佳性能
- 使用优化的 BLAS 库:cuBLAS、CUTLASS 等库已经针对 Tensor Core 做了深度优化
6.2 提高 SM 占用率
SM 占用率是指 SM 上实际驻留的 Warp 数与最大可驻留 Warp 数的比值。高占用率是隐藏延迟、提高吞吐量的关键。
影响占用率的因素:
- 每个线程使用的寄存器数量
- 每个线程块使用的共享内存数量
- 每个线程块的线程数
优化方法:
- 减少每个线程的寄存器使用量
- 合理设置线程块大小(通常 128、256 或 512 个线程)
- 避免使用过多的共享内存
6.3 优化内存访问模式
- 合并内存访问:让同一个 Warp 内的线程访问连续的内存地址,这样可以合并成一个内存事务
- 利用共享内存:将频繁访问的数据加载到共享内存中,减少对全局显存的访问
- 避免分支发散:尽量让同一个 Warp 内的线程执行相同的代码路径
- 使用异步内存拷贝:Ampere 及以上架构支持全局内存直接到共享内存的异步拷贝,减少寄存器使用和延迟
6.4 合理分配工作负载
- 确保足够的并行性:启动的线程块数量应该至少是 SM 数量的 4 倍,这样才能让所有 SM 都忙碌起来
- 负载均衡:尽量让每个线程块的工作量相同,避免出现"木桶效应"
- 避免过小的 Kernel:Kernel 启动有一定的开销,过小的 Kernel 会导致开销占比过高
七、常见误区与最佳实践
误区 1:FLOPS 越高,实际性能越好
真相:理论 FLOPS 只是一个上限,实际性能取决于能否有效利用这些 FLOPS。很多时候,内存带宽才是真正的瓶颈。
最佳实践:计算算法的算术强度(计算量/内存访问量),与 GPU 的运算强度(FLOPS/带宽)进行比较,判断是计算受限还是内存受限。
误区 2:线程越多,性能越好
真相:过多的线程会导致寄存器和共享内存不足,反而降低 SM 占用率和性能。
最佳实践:通过实验找到最佳的线程块大小和网格大小,通常在 128-512 个线程/块之间。
误区 3:所有算子都应该用 Tensor Core 加速
真相:Tensor Core 只擅长矩阵乘法,对于其他类型的算子(如逐元素操作、规约),使用 CUDA Core 可能更高效。
最佳实践:根据算子的计算特性选择合适的加速单元,不要盲目追求 Tensor Core 利用率。
八、总结与学习建议
SM 是 GPU 架构的核心,也是 AI Infra 工程师必须深入理解的概念。它的设计哲学——“用并行性换延迟”、“专用硬件加速特定工作负载”——贯穿了整个 GPU 的发展历程。
核心要点回顾:
- SM 是 GPU 的基本计算单元,GPU 的整体性能主要取决于 SM 的数量和每个 SM 的计算能力
- SM 采用 SIMT 执行模型,以 Warp(32 个线程)为基本调度单位
- Tensor Core 是 AI 算力的核心,能提供比 CUDA Core 高 10-20 倍的矩阵运算性能
- 性能优化的关键是:充分利用 Tensor Core、提高 SM 占用率、优化内存访问模式
学习建议:
- 动手写几个简单的 CUDA Kernel,观察不同线程块大小和内存访问模式对性能的影响
- 使用 NVIDIA Nsight 工具分析 Kernel 的执行情况,查看 SM 占用率、Tensor Core 利用率等指标
- 阅读 cuBLAS、CUTLASS 等优化库的源码,学习它们是如何充分利用 SM 资源的
- 关注 NVIDIA 每一代新架构的技术白皮书,了解 SM 架构的最新演进
理解 SM 只是 AI Infra 学习的起点,但它是最重要的起点。只有深入理解了硬件底层,你才能写出真正高效的 AI 系统,在大模型时代发挥出 GPU 的全部潜力。
附录:SM(流式多处理器)全模块拆解解析(安培架构)
这张是NVIDIA第二代光追+第三代Tensor Core架构SM(Ampere安培架构SM),整个SM由4组子执行簇+共享L1/纹理/RT单元构成,逐块拆分各模块功能:
一、橙色模块:L0 I-Cache + Warp Scheduler + Dispatch(每组子单元顶部橙色栏,4套)
1. L0 I-Cache(零级指令缓存)
- 功能:存储当前活跃Warp(32线程为1个Warp)的机器指令,从L2缓存预取指令,给Warp调度器快速喂指令,减少指令取指延迟;是指令流水线最前端的缓存。
2. Warp Scheduler(Warp调度器)
- CUDA最小调度单位是Warp(32线程),调度器负责从就绪Warp队列挑选符合条件的Warp,根据指令类型(算数/访存/特殊函数)分发到对应运算单元;
- 标注
32 thread/clk:单周期最多调度分发32个线程(1个完整Warp)。
3. Dispatch(指令派发单元)
把调度器选定的指令,路由发送到下方FP32/INT32、LD/ST、SFU、Tensor Core等不同执行流水线,完成指令分发。
二、深蓝色块:Register File (16384 × 32-bit,4组独立寄存器堆)
- CUDA通用寄存器堆:
16384×32bit=单块寄存器总容量:16384个32位通用寄存器; - 功能:每个线程的局部变量、中间运算结果全部存在通用寄存器中,是GPU线程的高速片上寄存器;Warp执行时从寄存器读源操作数、写入运算结果;寄存器是CUDA性能关键资源,寄存器占用量直接限制单个SM能并发的线程数量。
整SM共4份寄存器堆,每份独立供给下方1组FP/Tensor运算簇。
三、绿色运算阵列(每组子单元分三块:2×FP32/INT32 + 1×Tensor Core,共4组)
1. FP32 / INT32 算数核心(两大片绿色通用ALU阵列)
- FP32:单精度浮点运算单元(32位浮点数,图形光栅化、通用科学计算、CUDA基础浮点运算);
- INT32:32位整数运算单元(地址计算、逻辑运算、整型算法、分支判断);
- 安培架构该单元FP32和INT32硬件同核分时复用:同一套ALU可以跑浮点/整数指令,是SM最通用的计算资源,承担绝大部分通用图形、CUDA内核计算。
2. TENSOR CORE 3rd Gen(第三代张量核心,右侧整块深绿)
- AI专用加速硬件,第三代Tensor Core支持:FP16/BF16/TF32/INT8/INT4混合精度矩阵乘加(GEMM);
- 用途:深度学习推理/训练、AI超分辨率、DLSS超采样、神经网络卷积加速,专门吃掉矩阵运算(AI算力主力);
- 硬件内部集成矩阵乘法器+累加器,单周期完成大批量矩阵运算,大幅降低通用FP32单元负载。
四、暗红色底层单元:LD/ST + SFU(每组运算阵列最下方红块)
1. LD/ST(Load/Store 载入/存储单元,4个一组)
- 片上数据访存单元:负责线程从Shared Memory/L1/全局内存读数据(Load)、把运算结果写回内存(Store);
- 所有需要读写显存/共享内存的指令都走LDST流水线,是数据通路,分离「计算」和「访存」流水线,避免占用FP32算力。
2. SFU(Special Function Unit 特殊函数单元,最右侧小红块)
- 特殊数学函数专用硬件:计算
sin/cos/log/sqrt/exp/倒数等超越数学函数; - 不占用FP32通用核心资源,单独硬件加速复杂数学运算(图形纹理采样、物理计算高频用到)。
五、跨4个子簇的横向公共模块(SM下半部分横向长条)
1. 128KB L1 Data Cache / Shared Memory(蓝绿色长条,全SM共享)
L1数据缓存 + CUDA共享内存(物理同一块片上存储,逻辑分区)
- Shared Memory(共享内存):CUDA同一个Block内所有线程高速互通数据,片上极低延迟,程序员可手动分配大小,是CUDA并行优化核心;
- L1 Data Cache:自动缓存全局内存读写数据,对图形管线、不可控访存做硬件缓存;
- 安培架构SM统一128KB物理存储,可配置划分L1缓存/Shared Memory占比。
2. Tex(Texture Unit 纹理单元,4个并列蓝色块)
- 图形纹理采样硬件:负责纹理贴图寻址、双线性/三线性纹理过滤、各向异性过滤;
- 除光栅化纹理读取外,CUDA也可以用纹理缓存做带硬件插值的只读数据寻址。
六、最下方黄色大块:RT CORE 2nd Generation(第二代光线追踪核心)
硬件光追专用加速单元,整SM共用
- 核心功能:光线与包围盒(AABB)/三角形求交测试(光追中最耗时的BVH遍历、相交计算硬件加速);
- 用途:实时光线追踪(光栅化+光线追踪混合渲染,RTX实时光影、反射折射、全局光照);第二代RT Core优化了BVH遍历效率,支持运动模糊几何体相交加速。
整体架构总结
1个SM =4个独立执行子块(每子块:调度+寄存器+FP+Tensor+LDST+SFU) + 全SM共享L1/Shared+纹理单元+RT光追单元;
GPU由数十~上百个SM阵列组成,SM是NVIDIA GPU算力的最小组成单元。
