在 Hopper 架构(Compute Capability 9.0 /sm_90)问世之前,GPU 的硬件加速主要依赖 Tensor Core 算力的提升。然而在实际的大模型计算(如 FlashAttention)中,内存带宽瓶颈(Memory Wall)与线程同步开销往往才是制约吞吐量的最大杀手。
FlashAttention-3(FA3)之所以能在 H100 上榨干近 75% 的理论极限算力,其根本原因在于彻底放弃了传统的 GPU 编程思维,全面拥抱了 Hopper 架构引入的四项底层硬件革命:Thread Block Cluster、TMA、mbarrier 以及 异步 WGMMA。
本文将从sm_90的底层硬件机制出发,深入拆解 FA3 的硬件支撑基石。
一、 Thread Block Cluster(线程块集群)
在 Ampere 及更早的架构中,GPU 线程层级的最小协同单位是Thread Block(CTA),且 Block 只能部署在单个 SM(Streaming Multiprocessor)上。Block 之间无法直接通信,必须通过昂贵且高延迟的全局显存(Global Memory/HBM)进行中转。
Hopper 架构在 Grid 和 Block 之间引入了一个全新的硬件抽象层——Thread Block Cluster。
Grid └── Thread Block Cluster (由 1~8 个 Block 组成) ├── Thread Block 0 ─(分布式共享内存 DSEM)─ Thread Block 1 └── (直接映射到物理 SM Cluster,支持硬件级 SM 到 SM 高速通信)底层硬件机制:分布式共享内存(DSEM)
- 硬件级跨 SM 通信:一个 Cluster 内的多个 Block 会被调度到同一个SM Cluster(物理上紧密相邻的 SM 集合)上运行。
- DSEM(Distributed Shared Memory):Hopper 允许一个 SM 上的线程通过专用的 SM-to-SM 硬件互联网络,直接以极低延迟访问同 Cluster 内其他 SM 的 Shared Memory。
- 在 FA3 中的作用:FA3 利用 Cluster/DSEM 机制实现了跨 SM 的 KV Cache 共享与 P2P 数据交换。在长文本 attention 计算中,多个 SM 可以并行加载K/VK/VK/V块并通过 DSEM 互相借阅,极大减少了对 HBM 的重复读取。
二、 TMA(Tensor Memory Accelerator,张量内存加速器)
在传统的 CUDA 编程中,将数据从 Global Memory(HBM)搬运到 Shared Memory(SRAM)需要使用 CUDA 线程手动执行LDG指令,并占用常规计算寄存器。即便 Ampere 引入了cp.async,数据的寻址、边界检查和索引计算仍需占用大量 CUDA 线程的算力。
Hopper 引入了TMA(Tensor Memory Accelerator)——一个独立的硬件级 DMA 搬运引擎。
[ Traditional Async (Ampere) ] CUDA Threads ──> Address Calculation ──> Issue cp.async ──> Standard Registers/L1 [ TMA (Hopper sm_90) ] Producer Warp ──> Issue TMA Descriptor (1 Instruction) ──> TMA Hardware Engine │ Shared Memory (SRAM) <──────── Direct HW Transfer ─────────────┴─ Global Memory (HBM)底层硬件机制:
- 硬件级多维张量寻址:TMA 引擎原生支持 1D 至 5D 张量的切片(Tiling)、stride 计算和边界填充(Out-of-bounds padding)。Host/Device 只需配置一个
TMA Descriptor(描述符),GPU 即可按硬件指令直接搬运多维矩阵切片。 - 零寄存器与零线程占用:线程只需提交一条 TMA 异步指令,后续所有的数据寻址、跨 Memory Hierarchy 搬运全由 TMA 硬件接管,不占用任何通用 CUDA 寄存器,也不消耗 Warp 的执行流水线。
- 支持 Cluster 广播(Multicast):TMA 允许将 HBM 中的某一块张量,一次性硬件级广播送到同一个 Cluster 内所有 SM 的 Shared Memory 中。
三、 mbarrier(Hardware Asynchronous Barrier)
有了异步搬运引擎 TMA,就必须有极轻量、高效的硬件同步机制来通知消费者线程:“数据已成功写入 SRAM,可以开始计算了”。
Hopper 提供了硬件级异步屏障mbarrier(Memory Barrier)。
底层硬件机制:
SRAM 级硬件计数器:
mbarrier是分配在 Shared Memory 中的硬件同步对象。它包含两个核心原子计数器:Transaction Count(字节事务计数):预设本次异步传输期望的总字节数。
Arrival Count(到达计数):记录到达/完成的线程或硬件引擎数量。
硬件级 TMA 绑定:TMA 引擎可以直接与
mbarrier硬件进行信号绑定。当 TMA 将指定大小的数据全部写入 SRAM 后,TMA 硬件会自动向mbarrier发送arrive信号,无需任何 CUDA 线程介入。非阻塞等待(
mbarrier.try_wait):消费者 Warp 可以通过非阻塞轮询或条件挂起来等待mbarrier翻转 Phase(阶段),彻底避免了传统__syncthreads()导致的全 SM 线程停顿。
四、 异步 WGMMA(Warp Group Matrix Multiply-Accumulate)
Tensor Core 是 GPU 进行矩阵乘法计算的核心部件。在 Ampere 架构中,Tensor Core 的最小驱动单位是Warp(32 个线程),执行mma.sync指令。
Hopper 架构打破了 Warp 的界限,引入了Warp Group(由 4 个连续 Warp 组成的 128 线程集合),并推出了专门的硬件级矩阵乘指令——WGMMA。
Ampere (MMA): Warp (32 Threads) ──> Issue mma.sync ──> Load Reg A/B ──> Tensor Core Hopper (WGMMA / sm_90): Warp Group (128 Threads) ──> Issue wgmma.mma_async ──> Directly Read SRAM (Operand A) └── Read Reg / SRAM (Operand B) └── Accumulate to Reg底层硬件机制:
- 直接读取 Shared Memory(SRAM-Driven GEMM):
传统的 MMA 指令要求矩阵AAA和BBB必须先从 SRAM 显式加载到寄存器(RF)中,再送入 Tensor Core。
WGMMA 允许 Tensor Core 直接从 Shared Memory 读取操作数AAA(甚至BBB),大幅降低了对通用寄存器的需求(Register Pressure),避免了寄存器溢出(Register Spilling)。 - 完全异步执行(Asynchronous Execution):
wgmma.mma_async是一条非阻塞指令。Warp Group 触发指令后,硬件会将计算任务派发给 Tensor Core 后台执行,指令立即返回。线程可以继续去干其他事情,最后通过wgmma.wait_group批量等待计算完成。 - 极致的硬件吞吐:
128 个线程组成的 Warp Group 作为一个整体调度,显著降低了硬件指令解码和发射开销(Instruction Overhead),能够充分驱动 Hopper FP16/FP8 Tensor Core 的最大硬件吞吐。
五、 四者合一:FA3 如何构建底层硬件流水线?
FlashAttention-3(FA3)正是将上述四大sm_90硬件特性缝合成了一条极其紧密的异步重叠流水线(Asynchronous Overlap Pipeline)。
1. Warp-Specialization(Warp 角色专精)
FA3 在一个 Thread Block 内将 128/256 个线程划分为不同的功能角色:
- Producer Warp Group(生产者):负责“指挥” TMA。利用
TMA指令发起Q,K,VQ, K, VQ,K,V矩阵切片向 SRAM 的搬运,并将传输绑定到mbarrier。 - Consumer Warp Group(消费者):负责“指挥” Tensor Core 与 Vector Core。等待
mbarrier信号后,直接调用WGMMA指令让 Tensor Core 从 SRAM 读取数据进行QKTQ K^TQKT和PVP VPV矩阵计算。
2. 三重异步掩盖流水线(Triple Async Overlap)
在 FA3 的主循环(Main Loop)中,整个计算流程被拆解为多重并发:
Time ───► ───────────────────────────────────────────────────────────────────────────── [TMA Engine] │ Load Tile i+1 (HBM -> SRAM) │ Load Tile i+2 ... [mbarrier] │ Signal Tile i+1 ready │ Signal Tile i+2 ready [Tensor Core] │ WGMMA Tile i (SRAM -> Reg) │ WGMMA Tile i+1 ... [Vector Core/ALU] │ Softmax Tile i-1 (Reg) │ Softmax Tile i ... ─────────────────────────────────────────────────────────────────────────────- 内存传输与计算重叠:TMA 正在异步加载第i+1i+1i+1块数据时,Tensor Core 正在用 WGMMA 计算第iii块数据。
- GEMM 与 Non-GEMM 重叠(Ping-Pong / Interleaving):当 Tensor Core 忙于执行P⋅VP \cdot VP⋅V的 WGMMA 时,CUDA Vector Core 正在同步计算第i−1i-1i−1块的 Softmax(eS−Me^{S-M}eS−M、求和与归一化)。
- 零阻塞同步:全程由
mbarrier在硬件层监控字节数与事件,Consumer 线程无需调用昂贵的全局同步指令。
总结:sm_90硬件特性对比
| 硬件特性 | 传统架构 (Ampere/sm_80) | Hopper 架构 (sm_90 / FA3 基石) | FA3 获得的性能红利 |
|---|---|---|---|
| 协同粒度 | Thread Block (单 SM) | Thread Block Cluster (多 SM) | 支持跨 SM 的 SRAM 共享,减少 HBM 访问 |
| 数据搬运 | 线程执行cp.async/ 占寄存器 | TMA 硬件引擎 (Zero-Thread/Reg) | 释放大量 CUDA 线程算力与寄存器 |
| 异步同步 | __syncthreads()/ 阻塞式屏障 | mbarrier(硬件 Transaction 计数) | 实现传输与计算的完全异步解耦 |
| 矩阵乘法 | mma.sync(Warp 级 / 必须读 Reg) | wgmma.mma_async(Warp Group / 直读 SRAM) | 极致降低寄存器压力,翻倍 Tensor Core 吞吐 |
FlashAttention-3 的成功,本质上是计算范式的转移——从传统的“编写 CUDA 线程去逐行计算”,转变为“编写调度逻辑,驱动 TMA、mbarrier 和 Tensor Core 三大硬件引擎协同高速流水化运转”。