波前(Wavefront / Wave)
3 秒看懂
波前(Wavefront)是 GPU/加速器中一组被硬件捆绑、在同一时钟周期内执行相同指令的线程集合。 NVIDIA 称之为 Warp(32 线程),AMD 称之为 Wavefront(GCN 时代 64 线程,RDNA 可 32 或 64,CDNA 仅 64)。它是一切 GPU 并行计算——包括 AI 训练与推理——的最小调度粒度。理解 Wavefront,就是理解 GPU 吞吐的”齿轮”如何咬合。
3 分钟产业解释
为什么 Wavefront 对 AI 产业链重要?
AI 大模型训练的本质是海量矩阵乘法 + 高带宽访存,而 GPU 的核心设计哲学是:用成千上万个小线程的并行执行来掩盖访存延迟。这些线程并不是一个一个独立调度的——那硬件开销太大。GPU 的做法是把线程打包,以 Wavefront/Warp 为单位统一派发、统一执行、统一切换。
- 一个 Wavefront 就是一个”执行槽位”:SM(NVIDIA)/ CU(AMD)内的调度器每个周期决定”本周期执行哪个 Wavefront”。
- Wavefront 数量决定了”隐藏延迟的能力”:当一个 Wavefront 因内存访问而停顿时,调度器可以瞬间切换到另一个就绪的 Wavefront,实现零开销切换。这就是 latency hiding 的核心机制。
- Occupancy(占用率)= 实际驻留 Wavefront 数 / 最大可驻留 Wavefront 数,是 GPU 性能调优的第一指标。
产业含义:
- 芯片设计:Wavefront 宽度和调度策略直接决定 GPU 架构的吞吐效率,是 NVIDIA vs AMD 架构差异的关键维度之一。
- AI 框架/编译器:Triton、XLA、TVM 等编译器后端需要按 Wavefront/Warp 粒度进行指令调度和内存合并(coalescing)优化。
- 算子优化:CUDA kernel 中的
__shfl_sync、Warp-level reduction 等编程范式直接操作 Warp/Wavefront 内的线程通信,是 Flash Attention、LayerNorm 等核心算子的性能基石。 - 国产 GPU 生态:摩尔线程、壁仞、天数智芯等公司的架构设计中,如何定义和实现自己的 Wavefront/Warp 粒度,是衡量其 ISA 成熟度的关键标志。
15 分钟专家深入
Wavefront 的架构级地位
在现代 GPU 的执行层次中,Wavefront/Warp 处于线程 → Wavefront/Warp → Block → Grid 这一映射链的核心位置:
Grid (整个 Kernel)
└─ Block / Thread Block (软件概念,分配到一个 SM/CU)
└─ Warp / Wavefront (硬件调度最小单位)
└─ Thread (单个线程,有自己的寄存器状态)
SIMT 执行模型:同一指令,不同数据
Wavefront 内所有线程在每个周期执行同一条指令(Single Instruction, Multiple Thread)。这与纯 SIMD 不同——SIMT 允许线程有不同的控制流,但 divergent 分支需要串行化执行两个路径(通过 active mask 控制),性能代价是分支发散惩罚(branch divergence penalty)。
关键设计参数对比(已知公开信息,未充分披露处已标注):
| 维度 | NVIDIA(Warp) | AMD GCN/RDNA/CDNA | Intel Xe(Sub-Slice) |
|---|---|---|---|
| 线程粒度 | 32 线程(自 Fermi 以来稳定) | GCN: 64; RDNA: 支持 wave32/wave64; CDNA: wave64 [AMD 架构白皮书] | 硬件 SIMD 宽度因代际而异 [未充分披露统一命名] |
| 调度器 | Warp Scheduler(每 SM 多个) | Wavefront Scheduler(每 CU 一个或多个) | Thread Director 相关 [定性] |
| Warp 内通信 | __shfl_sync() 系列 | ds_bpermute / ds_swizzle | 类似机制 [定性] |
| 分支处理 | Active mask 串行化 | Exec mask 串行化(64-bit) | 类似机制 [定性] |
为什么 Warp=32 / Wavefront=64?
这不是随意选择——它是硬件资源分摊和延迟隐藏之间的平衡:
- 更宽的 Wavefront(如 64):单个调度决策覆盖更多线程,调度器简单,但分支发散时浪费的线程槽位更多。
- 更窄的 Warp(如 32):分支发散惩罚更小,wave32 模式下寄存器压力可降低(因为不需要为 64 线程分配同一组寄存器 bank),但调度器负担相对更高。
- AMD RDNA 引入 wave32 模式,一个核心动机就是图形渲染中大量存在小三角形(small primitive),wave32 可减少线程浪费;AI 计算中矩阵运算通常高度一致,wave64 仍有优势。
- NVIDIA 从 Fermi 到 Blackwell 一直维持 Warp=32,说明 32 线程在通用计算和 AI 负载中是足够好的平衡点。
Wavefront 的生命周期
1. Block 被分配到 SM/CU
2. Block 内的线程被分组为若干 Wavefront/Warp
3. Wavefront 注册到调度器的 wavefront pool / warp slot
4. 每周期,调度器从就绪(ready)队列中选择一个 Wavefront 发射
5. 若 Wavefront 遇到长延迟操作(如 global memory load),
标记为 stall,调度器立即切换到其他就绪 Wavefront
6. 数据到达后,该 Wavefront 重新变为 ready
7. 所有指令执行完毕,Wavefront 退出
关键瓶颈——寄存器压力与占用率:
每个 Wavefront 中的每个线程都需要独立的寄存器组。假设一个 SM 有 65536 个 32-bit 寄存器(NVIDIA Ampere 的公开数据),Warp=32 线程:
- 每线程使用 32 个寄存器 → 每 Warp 需 32×32 = 1024 个寄存器
- 最多驻留 65536 / 1024 = 64 个 Warp
- 每线程使用 128 个寄存器 → 每 Warp 需 32×128 = 4096 个寄存器
- 最多驻留 65536 / 4096 = 16 个 Warp
寄存器用得越多,能同时驻留的 Wavefront 越少,延迟隐藏能力越差。 这就是为什么 kernel 优化中”寄存器 spill”和”占用率”是永恒的权衡主题。
技术原理
1. SIMT 执行引擎的微架构
以 NVIDIA SM(Streaming Multiprocessor)为例,展示 Warp 在硬件中的执行路径:
┌─────────────────────────────────────────────────────┐
│ SM (Streaming Multiprocessor) │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Warp Scheduler│ │ Warp Scheduler│ (Ampere: 4个) │
│ │ + Dispatch │ │ + Dispatch │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ 执行单元 (Execution Units) │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌────────┐ │ │
│ │ │ FP32│ │ FP32│ │ INT │ │ SFU/LDX│ │ │
│ │ │ (16)│ │ (16)│ │ (16)│ │ │ │ │
│ │ └─────┘ └─────┘ └─────┘ └────────┘ │ │
│ │ 每周期: 4个 Warp 可并发发射 │ │
│ └──────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────┐ │
│ │ Register File (64K × 32-bit 典型值) │ │
│ │ → 所有活跃 Warp 共享物理寄存器池 │ │
│ └──────────────────────────────────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Shared Mem│ │ L1 Cache │ │
│ │ (可配置) │ │ │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────┘
关键机制说明:
- 多发射(Multi-Issue):Ampere/Hopper 的 SM 中,一个 Warp 的 32 线程被拆成两个 16 线程的 sub-warp(或称 half-warp),分别在两组执行单元上并发。这是”32”这个数字与硬件执行宽度匹配的结果。
- 操作数收集器(Operand Collector):从寄存器文件中为即将发射的 Warp 收集源操作数的硬件模块,需处理 bank conflict。
- Scoreboard:跟踪每个 Warp 中每条指令的依赖关系,决定哪些 Warp 处于 ready 状态。
2. Wavefront 内的线程通信
Wavefront/Warp 内的线程可以不经共享内存,直接通过 shuffle 指令交换数据:
// NVIDIA CUDA: Warp 内 shuffle
__shfl_sync(0xFFFFFFFF, val, src_lane); // 从指定 lane 读取值
__shfl_down_sync(0xFFFFFFFF, val, delta); // 从 lane_id+delta 读取
__shfl_xor_sync(0xFFFFFFFF, val, mask); // Butterfly 模式
; AMD GCN: ds_bpermute
v_bpermute_b32 vdst, vsrc, vaddr ; 按 vaddr 指定的 lane 索引读取
应用场景:
- Warp-level reduction:LayerNorm、Softmax 中的求和/求最大值,一次 shuffle 即可完成 Warp 内 32/64 线程的归约,无需 Shared Memory。
- Flash Attention:核心的 online softmax 更新中,Warp 间通过 Shared Memory +
__syncthreads()通信,Warp 内通过 shuffle 通信。 - Warp Matrix Multiply Accumulate (WMAA / WMMA):Ampere 的
mma.sync指令让整个 Warp 协作完成一个小矩阵乘(如 16×16×16),线程间通过寄存器文件的隐式布局共享数据。
3. Branch Divergence 机制详解
代码:
if (threadIdx.x % 2 == 0)
A(); // 偶数线程
else
B(); // 奇数线程
执行时间线 (Warp=8 为例):
Cycle 1: [exec_mask = 10101010] 执行 A() — 奇数线程空转
Cycle 2: [exec_mask = 01010101] 执行 B() — 偶数线程空转
→ 总耗时 = 2×,即"分支发散惩罚"
为什么对 AI 计算影响大?
- 大规模矩阵乘(GEMM)中几乎没有分支发散,Wavefront 效率极高(接近 100%)。
- 但 MoE 路由、动态稀疏计算、TopK 选择 等操作会引入显著的分支发散,降低 Wavefront 利用率。这也是硬件稀疏加速(如 NVIDIA 的结构化稀疏 2:4)试图绕开的问题。
4. 内存合并(Memory Coalescing)与 Wavefront
Wavefront/Warp 内的 32/64 个线程如果访问的全局内存地址连续且对齐,硬件可以将它们合并为极少的内存事务:
理想情况(合并度=100%):
线程 0 → addr[0], 线程 1 → addr[1], ..., 线程 31 → addr[31]
→ 合并为 1 次 128-byte 事务
最差情况(合并度=1/32):
线程 0 → addr[0], 线程 1 → addr[1024], 线程 2 → addr[2048]...
→ 32 次独立事务,带宽利用率暴跌
对 AI 的意义:Tensor Core 的输入布局(如 HMMA 的 fragment layout)就是为了让 Warp 内线程的寄存器访问模式与矩阵的内存布局匹配,最大化合并效率。
技术演进史
| 时间 | 事件 | Wavefront/Warp 维度的变化 |
|---|---|---|
| 2006 | NVIDIA G80(Tesla 初代) | 引入 Warp=32 概念(前身是 NV4x 的 8-wide SIMD),确立 SIMT 模型 |
| 2007 | AMD/ATI R600(TeraScale) | 5-wide VLIW,每线程组 16 个线程并行,非现代 Wavefront 概念 |
| 2011 | AMD GCN(Southern Islands) | Wavefront=64 自 R600 时代延续,GCN 改进了调度和执行方式:4 个周期×16-wide SIMD 执行一个 Wavefront;同时发布 HSA 异构计算规范 |
| 2012 | NVIDIA Kepler(GK110) | SMX 拥有 4 个 Warp Scheduler;支持 Warp Shuffle(__shfl),大幅减少 Shared Memory 使用 |
| 2014 | NVIDIA Maxwell | 进一步优化调度效率,L1/Shared Memory 重新划分 |
| 2016 | NVIDIA Pascal (GP100) | 引入 FP16 半精度支持,Warp 级半精度吞吐翻倍;NVLink 提升多 GPU 通信 |
| 2017 | NVIDIA Volta (GV100) | 独立线程调度(Independent Thread Scheduling):每个线程有独立的 PC 和栈,但 Warp 仍然是执行粒度;引入 Tensor Core v1(Warp 协作完成 4×4×4 矩阵乘) |
| 2020 | AMD RDNA(RX 5000 系列) | 引入 wave32 模式,与 wave64 并存;CU 结构重新设计为 Work Group Processor (WGP) |
| 2020 | NVIDIA Ampere (A100) | Tensor Core v3,mma.sync 指令支持更大矩阵 tile(如 16×16×16);结构化稀疏 2:4 对 Warp 级数据流提出新要求 |
| 2022 | AMD CDNA 2 (MI250X) | Wavefront=64 为默认,针对 HPC/AI 优化;引入 Matrix Core(对标 Tensor Core) |
| 2022 | NVIDIA Hopper (H100) | Warp Specialization:同一个 Block 内不同 Warp 可以执行不同角色(如 producer warp 负责数据搬运,consumer warp 负责计算),这是 TMA(Tensor Memory Accelerator)的软件模型基础;Tensor Core v4(FP8 支持) |
| 2023 | AMD CDNA 3 (MI300X) | Wavefront=64 继续;Matrix Core 扩展支持 FP8/INT8;MI300X 为纯 GPU 加速卡,不支持 APU 模式(统一内存架构和 APU 模式为 MI300A 特性;MI300X 可通过 CXL 等支持统一内存访问机制) |
| 2024 | NVIDIA Blackwell (B100/B200) | Tensor Core 进一步扩展到 FP4/FP6;Warp 级协作机制未见公开架构级变化 [基于已公开信息] |
| 2024 | Intel Gaudi 3 | 非传统 GPU,使用 VPU(Vector Processing Unit)+ TPC(Tensor Processing Core)架构,调度粒度概念不同于 Warp/Wavefront [定性] |
趋势总结:
- Wavefront/Warp 宽度稳定:NVIDIA 坚守 32 超过 15 年,AMD 在 AI/HPC 场景维持 64、图形场景增加 wave32 灵活性。
- 执行语义越来越”粗”:从逐条标量指令,到 Warp-level 矩阵指令(
mma.sync),再到 Block-level 异步操作(TMA +wgmma),调度粒度逐级上移。 - Warp Specialization 成趋势:Hopper 的 producer/consumer warp 模型让一个 Block 内不同 Warp 承担不同角色,打破了”所有 Warp 做同一件事”的传统假设。
技术路线对比(量化表)
| 指标 | NVIDIA Warp (Ampere A100) | NVIDIA Warp (Hopper H100) | AMD Wavefront (CDNA2 MI250X) | AMD Wavefront (CDNA3 MI300X) |
|---|---|---|---|---|
| 线程粒度 | 32 | 32 | 64 | 64 |
| 每 SM/CU 最大驻留 Warp/Wave 数 | 64 warps [NVIDIA 白皮书] | 64+(支持更多 concurrent warp 与 TMA 异步)[NVIDIA 白皮书] | 每 CU 最多 40 wavefronts [AMD CDNA2 ISA] | 40 wavefronts per CU [AMD CDNA3 公开资料,待确认] |
| 每 SM/CU 寄存器文件 | 65536 × 32-bit | 65536 × 32-bit [NVIDIA 白皮书] | 每 CU: 65536 × 32-bit [AMD 架构手册] | 65536 × 32-bit [供应链估算] |
| Tensor/Matrix Core Warp 协作 | mma.sync m16n8k16(FP16) | mma.sync + wgmma(Block 级) | MFMA 32×32×8(FP16) | MFMA 扩展至 FP8 [AMD 公开资料] |
| Warp Shuffle 带宽 | 32 线程 × 4B = 128B/周期 | 同上 | 64 线程 × 4B = 256B/周期 [AMD ISA] | 同 CDNA2 [待确认] |
| Warp Specialization | 不支持(Block 内 Warp 同质) | 支持(producer/consumer warp) | 不支持(截至目前公开信息) | 不支持 [截至目前公开信息] |
| 结构化稀疏 | 2:4(Warp 级元数据) | 2:4 | 不适用 | 不适用 |
注意:上表部分数据来源于厂商公开白皮书和 ISA 手册,部分为行业通用认知,具体数字可能因型号配置(如 A100 40GB vs 80GB 的 SM 数差异)而不同。所有数值请以厂商官方文档为准。
上下游
上游(影响 Wavefront 设计的因素)
┌─────────────────────────────────────────────────────────────┐
│ 制程工艺 (5nm/4nm/3nm) │
│ → 决定 SM/CU 内可集成多少执行单元和寄存器 │
├─────────────────────────────────────────────────────────────┤
│ 内存子系统 (HBM3/HBM3E, GDDR7) │
│ → 决定 Wavefront 访存延迟,影响需多少 Wave 做 latency hiding │
├─────────────────────────────────────────────────────────────┤
│ 编译器 (NVCC, ROCm/hipcc, Triton, XLA) │
│ → 决定 Warp/Wave 的指令调度和寄存器分配 │
├─────────────────────────────────────────────────────────────┤
│ AI 框架 (PyTorch, JAX, TensorFlow) │
│ → 算子实现的 Warp 级优化程度 │
└─────────────────────────────────────────────────────────────┘
下游(Wavefront 效率影响的层面)
┌─────────────────────────────────────────────────────────────┐
│ Kernel 性能 (单算子吞吐) │
│ → 占用率、分支发散、内存合并直接影响 │
├─────────────────────────────────────────────────────────────┤
│ 大模型训练吞吐 (Tokens/sec) │
│ → 所有 GEMM/Attention kernel 的 Wavefront 利用率叠加 │
├─────────────────────────────────────────────────────────────┤
│ 推理延迟 (Time-to-First-Token, Inter-Token Latency) │
│ → batch size 小时占用率低,Wavefront 利用率是关键瓶颈 │
├─────────────────────────────────────────────────────────────┤
│ 多 GPU 并行效率 │
│ → Tensor/Pipeline Parallelism 中每个 GPU 内部的 Wavefront 效率│
│ 决定了通信/计算重叠(overlap)的效果 │
└─────────────────────────────────────────────────────────────┘
关键指标
| 指标 | 定义 | 典型优秀值 | 对 AI 的意义 |
|---|---|---|---|
| Occupancy(占用率) | 活跃 Warp 数 / 最大 Warp 数 | ≥50%(视 kernel 而定) | 太低→延迟隐藏不足→SM 利用率低 |
| Warp Execution Efficiency | 非 divergent 周期 / 总周期 | ≥90%(GEMM kernel) | 分支发散直接降低 |
| Memory Coalescing Rate | 有效字节 / 事务字节 | ≥80% | 决定显存带宽实际利用率 |
| Warp Stall Reasons | 各类停顿原因占比 | 应以 MIO/Long Scoreboard 为主(说明在等计算或显存) | ncu/rocprof 核心诊断指标 |
| Register Per Thread | 每线程寄存器使用数 | 32–128(视 kernel) | 决定最大驻留 Warp 数 |
| Shared Memory Per Block | 每 Block 共享内存 | 决定 Block 级 Wavefront 可用的快速通信资源 | 影响 Wave 间同步开销 |
| Tensor Core Utilization | Tensor Core 活跃周期占比 | ≥60%(成熟 kernel) | Wavefront 级矩阵指令的有效发射率 |
供需与市场数据
Wavefront/Warp 不是一个独立的产品市场,而是 GPU 架构的内在机制。其商业影响通过以下链条传导:
需求侧
- AI 训练芯片:全球 AI 训练 GPU 市场 2024 年预估超 $80B [综合多家行业报告,口径差异较大]。每颗 GPU 的核心竞争力之一是其 Wavefront/Warp 调度效率对 kernel 吞吐的贡献。
- 推理芯片:推理场景 batch size 小,占用率普遍较低,Wavefront 利用率是推理芯片需要特别优化的维度。
- 编译器/工具链生态:Triton、XLA、TVM 等中间表示层需要深度理解目标硬件的 Wavefront/Warp 语义,这直接决定了这些工具的实际性能上限。
供给侧
- NVIDIA:CUDA 生态对 Warp 语义的抽象和优化已积累 15+ 年,
ncu(Nsight Compute)提供完整的 Warp 级分析指标。 - AMD:ROCm 生态正在快速补齐,
rocprof+ OmniPerf 提供 Wavefront 级分析,但工具链成熟度仍有差距(截至 2024 年行业共识)。 - 国产 GPU:多数国产 AI 芯片厂商借鉴 NVIDIA 的 Warp=32 模型,但 ISA 细节(如 shuffle 指令、Tensor Core/Wave 协作模式)各有差异,生态兼容性是核心挑战。
代表公司与资本映射
| 公司 | 与 Wavefront 的关联 | 资本标的 |
|---|---|---|
| NVIDIA | Warp=32 SIMT 模型的定义者;从 Fermi 到 Blackwell 持续迭代 | NVDA |
| AMD | Wavefront=64(GCN/CDNA)/ wave32+64(RDNA)双模式;MI300X 为 HBM3 APUs 旗舰 | AMD |
| Intel | Xe 架构的线程调度粒度设计;Gaudi 3 的 TPC/VPU 架构对 Warp 概念的替代方案 | INTC |
| 摩尔线程 | MUSA 架构借鉴 Warp 模型,具体粒度未完全公开 [未充分披露] | 一级市场 |
| 壁仞科技 | BR100 采用自研 SIMT 架构,Wave/Warp 粒度设计是 ISA 核心 | 一级市场 |
| 天数智芯 | 天垓系列 GPU,SIMT 执行模型 [定性] | 一级市场 |
| 寒武纪 | MLU 架构的并行调度粒度不同于传统 GPU Wavefront,但核心思想类似 | 688256.SH |
| Triton(OpenAI) | 编译器后端需要为每个目标硬件生成 Wavefront/Warp 级优化代码 | 未上市 |
| TVM / Apache | 自动调优(AutoTVM)的搜索空间包含 Wavefront/Warp 相关参数 | 开源 |
投资逻辑
直接逻辑
- 架构差异化壁垒:Wavefront/Warp 调度器是 GPU 微架构中最难被逆向工程的部分之一。它不是简单的宽度数字,而是包括调度策略、依赖追踪、寄存器分配、分支处理的完整状态机。这是 NVIDIA 和 AMD 的核心 IP 护城河。
- 编译器生态绑定:CUDA 的
__shfl_sync、mma.sync等 Warp 级 API 被数十万个 kernel 使用,迁移成本极高。这构成了 NVIDIA 的软件 lock-in。 - 国产替代维度:评估国产 GPU 不仅要看 Tensor Core 的 peak TFLOPS,更要看其 Warp 调度器的实际效率(occupancy 上限、stall pattern、shuffle 延迟)。这些是纸面参数看不到、但实测性能差异巨大的因素。
间接逻辑
- **HBM 带宽与