GPU Execution Model — Blackwell GPU 执行模型详解
来源: Modern GPU Programming For MLSys (MLC Community)
章节: Part I, Chapter 1 — GPU Execution Model
目标架构: NVIDIA Blackwell
整理时间: 2026-06-24
📌 核心摘要
本章系统介绍了现代 GPU(以 Blackwell 架构为代表)的执行模型,涵盖三个核心维度:
- 线程层级(Thread Hierarchy):从 Thread 到 Grid 的嵌套分组结构
- 内存空间(Memory Spaces):GMEM → SMEM → TMEM → Register 的数据通路
- 计算引擎(Compute Engines):CUDA Cores 与 Tensor Cores 的分工协作
核心思想:内核是一个流水线,数据在这些内存空间之间流动,并在独立的计算与数据传输引擎之间交接工作。反复的目标是让这些引擎同时保持忙碌。
一、执行层级(The Execution Hierarchy)
GPU 不将数千个线程呈现为扁平池,而是分组为嵌套层级结构,每一层级的存在都是为了在特定尺度上使协作成本最低。
1.1 线程层级结构

1.2 各层级详解
| 层级 | 线程数 | 描述 | 关键特性 |
|---|---|---|---|
| Thread | 1 | 标量执行单元 | 每线程拥有独立 PC 和寄存器,由 Warp 内的 Lane ID 标识 |
| Warp | 32 | SIMT 执行单元 | 32 个线程执行同一条指令,各自保持独立寄存器,可独立 Mask(支持分支) |
| Warpgroup | 128 | 4 个连续 Warp | Hopper 引入,作为 wgmma 的发起单元;Blackwell 中增加 TMEM 协作角色 |
| CTA | 可变 | 硬件调度的基本单元 | 运行在单个 SM 上,拥有私有 SMEM;多个 CTA 可共存于同一 SM |
| Cluster | 多 CTA | 协作 CTA 组 | 可跨 SM,支持 CTA 间同步和分布式共享内存(DSMEM) |
| Grid | 全部 | Kernel 启动的所有 CTA | 由 Host 发起的完整执行网格 |
1.3 Blackwell 的关键变化
Blackwell 的关键操作不是由同一组线程发起的,每种操作有其天然的粒度。
| 操作 | 发起粒度 | 描述 |
|------|----------|------|
| TMA 拷贝 | 单线程 | 一个线程发出命令,硬件引擎搬运整个 Tile |
| TMEM ↔ 寄存器 | Warpgroup | 4 个 Warp 协作,每个 Warp 移动 TMEM Tile 的自己的切片 |
| tcgen05 MMA | 选举线程 | 一个选举出的线程提交,Tensor Core 执行 |
| Cluster MMA | 2-CTA | 跨两个 CTA 的协作 MMA |
Scope(作用域):运行某个操作的线程集合,是本书三大核心设计要素(Scope / Layout / Dispatch)中的第一个。
二、内存空间(Memory Spaces)
不存在同时兼具大容量和高速度的单一内存。物理规律决定了容量与速度的权衡,GPU 因此提供多种内存,每种在权衡曲线上处于不同位置。
2.1 内存层级总览
| 内存 | 归属 | 角色 | 说明 |
|---|---|---|---|
| Global (GMEM) | 设备级 | 持久化 Tensor 存储 | 大容量 HBM,所有 SM 共享 |
| Shared (SMEM) | 每 CTA(一个 SM) | Tile 中转站 | 低延迟 Scratchpad;B200 上每 SM 可达 228 KB |
| Tensor Memory (TMEM) | 每 CTA | MMA 累加器存储 | Blackwell 新增;tcgen05 专用 |
| Register File (RF) | 每线程 | 标量和每线程 Tile Fragment | 最快;存放 Epilogue/临时值 |
2.2 数据通路
GMEM → SMEM → [计算] → 寄存器 → SMEM → GMEM
↑
TMEM(存放累加器)
2.3 TMEM 详解(Blackwell 新增)
TMEM 是 Blackwell 独有的内存空间,在之前架构上没有对应物。
为什么需要 TMEM?
- 之前的 GPU 将大型 MMA 累加器存放在寄存器中,与线程的其他值争夺稀缺资源
- 寄存器是固定的每线程资源,随着 MMA Tile 增大,累加器 Fragment 也增大,开始挤占线程需要的其他值
- 更大的 Tile 对 Tensor Core 吞吐量有利,但把整个累加器保持在寄存器中使大 Tile 更难使用
TMEM 设计: - CTA 作用域的 2D Scratchpad:128 Lane × 最多 512 列(32-bit)
- tcgen05.mma 将累加器写入 TMEM 而非寄存器
- 内核需在 Epilogue 阶段将 TMEM 显式读回寄存器
两个重要后果:
- TMEM 读取是显式的、Warpgroup 分布式的——由 4 个 Warp 协作完成
- TMEM 必须显式分配和释放(不像寄存器由编译器自动分配)
三、Cluster 的分布式共享内存(DSMEM)
3.1 问题
- 单个 CTA 运行在一个 SM 上,使用该 SM 的 SMEM
- 但单个 CTA 的 SMEM 预算是有限的
- 大 Tile 常常需要比单个 Block 能提供的更多的操作数存储或复用
3.2 解决方案:Thread Block Cluster
Hopper 引入了 Thread Block Cluster:一组 CTA 比独立 Block 更紧密地协作:
- 可以彼此同步
- 可以读写彼此的共享内存(DSMEM)
Blackwell 保留了 Cluster 并增强了它: - 动态调度(Cluster Launch Control)
- 2-CTA 协作 MMA
3.3 DSMEM 工作机制
- CTA 可以寻址和访问对等 CTA 的 SMEM
- 线程可以在对等 CTA 的 SMEM 中指定位置,直接将 Tile 从自己的 SMEM 批量拷贝到对等的 SMEM
- 字节落地后触发完成 Barrier
- 2-CTA Cluster GEMM 正是基于此机制,在两个 CTA 之间共享操作数 Tile,无需通过全局内存中转

四、计算引擎:CUDA Cores 与 Tensor Cores
SM 提供两种不同的数学引擎,而非一种。两者之间的分工塑造了几乎每个内核的编写方式。
4.1 两种引擎对比
| 引擎 | 类型 | 角色 | 特点 |
|---|---|---|---|
| CUDA Cores | 通用 SIMT ALU | 标量和向量指令 | 处理索引算术、Elementwise 数学、归约、控制流——围绕重型矩阵工作的"胶水逻辑" |
| Tensor Cores | 专用固定功能单元 | 密集矩阵乘加 | 在 Tile 粒度上执行 D = AB + C 单指令完成 |
4.2 为什么这个分工很重要
Tensor Cores 的算术吞吐量比 CUDA Cores 高约 10 倍以上(FLOP/s)。密集线性代数(GEMM、卷积、Attention)只有在 Tensor Cores 上运行时才能达到峰值性能。
获取性能的关键在于:保持 Tensor Cores 持续有数据可消费。
4.3 代际演进
| 代际 | Tensor Core 变化 |
|---|---|
| Hopper | 引入异步 Warpgroup MMA(wgmma.mma_async) |
| Blackwell | 第五代 Tensor Core(tcgen05),累加器存放在 TMEM 而非寄存器 |
4.4 Cluster 对引擎的扩展
2-CTA 协作 MMA:两个 CTA 各自贡献 SMEM 操作数到单个更大的 Tensor Core MMA Tile
TMA 多播:数据移动引擎的一次加载可将同一 GMEM Tile 交付给多个 CTA,消除独立加载产生的冗余全局流量
五、GEMM 数据流水线(The GEMM Data Pipeline)
5.1 三阶段流水线

以通用矩阵乘法(GEMM)为例,单个 GEMM Tile 流经三个阶段:
┌─────────────────────────────────────────────────────────┐
│ GEMM 三阶段流水线 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Load │ → │ Compute │ → │ Epilogue │ │
│ │ │ │ │ │ │ │
│ │ TMA 拷贝 │ │ tcgen05 │ │ TMEM → │ │
│ │ GMEM → │ │ MMA │ │ 寄存器 → │ │
│ │ SMEM │ │ SMEM → │ │ GMEM │ │
│ │ │ │ TMEM │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ 单线程发起 选举线程发起 Warpgroup 协作 │
│ 字节计数Barrier 完成Barrier TMA Store │
└─────────────────────────────────────────────────────────┘
阶段 1:Load
- TMA 拷贝将 A 或 B 操作数 Tile 从 GMEM 流式传输到 SMEM
一个线程发出拷贝,提前记录预期到达的字节数
TMA 引擎报告进度,完成 Barrier 在所有预期字节交付后才翻转
阶段 2:Compute
tcgen05 MMA 从 SMEM 读取操作数 Tile,将乘积累加到 TMEM Tile
一个选举出的线程提交,完成后发出 Barrier 信号
阶段 3:Epilogue
Warpgroup 将 TMEM 累加器读回寄存器
将结果转换为目标输出数据类型
存储到 GMEM(通常通过 SMEM 中转并发出 TMA Store)
5.2 慢内核 vs 快内核
写成这样三个阶段看起来是严格串行的,但慢内核和快内核的全部区别在于重叠(Overlap)。
慢内核(Naive):
加载 → 等待 → 计算 → 等待 → 存储
每个引擎在等待前一个引擎完成时空闲。
快内核(Pipeline):
时间轴:
TMA: [Tile k-1 Load] [Tile k Load] [Tile k+1 Load]
MMA: [Tile k-1 Compute] [Tile k Compute] [Tile k+1 Compute]
Epilogue: [Tile k-2 Writeback] [Tile k-1 Writeback] [Tile k Writeback]
- Tensor Core 在计算 Tile k 时
- TMA 引擎已经在获取 Tile k+1
- Epilogue 正在排出 Tile k-1
- 三个引擎同时保持忙碌
5.3 安全交接的关键
让三个异步引擎安全交接工作,正是 Barrier 和 Phase 模型(Async Coordination: mbarriers)的职责。Part III 的 GEMM 优化阶梯正是建立在此基础之上。
六、核心设计要素
贯穿全书的三个核心设计要素:
| 要素 | 含义 | 示例 |
|---|---|---|
| Scope | 运行操作的线程集合 | 单线程发起 TMA、Warpgroup 协作 TMEM、2-CTA 协作 MMA |
| Layout | 数据在内存中的物理排列 | SMEM Swizzle、TMEM 2D 布局、寄存器 Fragment |
| Dispatch | 操作如何被触发和执行 | TMA 引擎、tcgen05、CUDA Core 指令 |
311

被折叠的 条评论
为什么被折叠?



