Back to blog

Tawa: Automatic Warp Specialization for Modern GPUs with Asynchronous References(Tawa:面向现代 GPU 的异步引用自动 Warp 特化编译器)

CGO 2026 论文,Cornell + NVIDIA 合作。提出 Tawa——首个面向现代 NVIDIA GPU(Hopper+)的**全自动 warp 特化编译流程**,从未经修改、无标注的 Triton 程序出发,自动分区为 producer/consumer warp group,自动管理软件流水线。核心创新是**异步引用(asynchronous reference, aref)**——一种形式化语义保证的 IR 抽象,将 warp 间通信建模为带硬件 mbarrier 的单槽信道(put/get/consumed),封装 TMA 描述符配置、mbarrier 初始化/相位管理等底层细节。编译器三步变换:① 基于语义标记的任务感知分区(iteration stmt → producer, tile stmt → consumer,依赖闭包 + 计算复制);② 基于 aref 的多槽环形缓冲自动构建跨 warp 数据流;③ 多级软件流水线(细粒度:CUDA 地址计算与 MMA 重叠;粗粒度:CUDA Core 变换与 TC 流水线装配线)。额外优化:协作计算 warp group(多 WG 共享 tile 寄存器预算)、持久化 kernel。在 H100 上:GEMM 达 cuBLAS 水平(FP16 +1.01×,FP8 +1.06×);Attention 达 FA3 手工优化内核的 96%,超 Triton 1.21×。ablation 显示 +Auto WS 提升 3.78×,最终 GEMM 达 718 TFLOPs/s(baseline 的 ~7×)。

Tawa: Automatic Warp Specialization for Modern GPUs with Asynchronous References(Tawa:面向现代 GPU 的异步引用自动 Warp 特化编译器)

一、论文概述

项目内容
标题Tawa: Automatic Warp Specialization for Modern GPUs with Asynchronous References
作者Hongzheng Chen, Evghenii Gaburov, Jason Knight, Bin Fan, Masahiro Masuda, Zhiru Zhang, Alexander Collins, Matthew Brookhart, Vinod Grover, Bastian Hagedorn, Chris Sullivan
机构Cornell University / NVIDIA
会议CGO 2026(ACM/IEEE International Symposium on Code Generation and Optimization)
PDFcsl.cornell.edu/~zhiruz/pdfs/tawa-cgo2026.pdf
硬件NVIDIA H100 SXM5 80GB, CUDA 12.7
基准GEMM(FP16/FP8)、Batched/Grouped GEMM、Multi-Head Attention(FP16/FP8)

一句话总结:Tawa 是 CudaDMA → Singe → Twill 这条 warp 特化研究血脉的又一延伸,但路线不同——Twill 用 SMT 求解器自动发现最优调度;Tawa 则面向实际工程,目标是让程序员写普通的 Triton 代码(enable_warp_specialization=True 一键开启),编译器自动完成分区、数据流管理和多级流水线,达到甚至超越手写 CUTLASS C++ FlashAttention-3 的性能。

二、核心问题:SIMT 编程模型与现代 GPU 架构的根本错位

现代 GPU(Hopper/Blackwell)已从同质处理器演变为异构系统:除 CUDA 核心外,集成了 Tensor Core(密集矩阵计算)和 TMA(异步数据搬运)。这启发了异步数据流执行模型——数据搬运可与计算显式重叠。然而,SIMT 编程模型(CUDA/Triton 的基础)假设 warp 内所有线程执行相同指令,无法表达不同 warp 承担不同角色的需求。

这造成三大编程挑战:

挑战说明
① 协调并发 warp 角色SIMT 缺乏 warp 角色分配的一等抽象,开发者须手动用复杂条件分支封装异构角色;Triton 等高级 DSL 仍保留 SIMT 中心抽象,无法自然表达 warp 特化
② 底层通信管理CUDA 无 C++ 级 TMA/mbarrier 接口,须用内联 PTX 配置 TMA 描述符、初始化 mbarrier、编排同步——涉及 arrival count、barrier phase、shared memory aliasing,微妙错误导致死锁
③ 资源分配与流水线编排有效重叠 producer/consumer 须手动实现深层软件流水线:管理 shared memory 多缓冲、划分 prologue/main/epilogue、平衡寄存器/shared memory 占用率——设计决策紧密耦合,优化空间巨大且繁琐

Figure 1. H100 SXM5 简化的 GPU 架构

三、Tawa 编译器架构(Section III)

Figure 2. Tawa 编译流程:Triton 前端 → 内部 MLIR 表示

Tawa 对未经修改、无标注的 Triton 程序执行三步变换:

  1. 任务感知分区(Task-aware partitioning):将程序分为 producer/consumer warp group(解决挑战 ①)
  2. 异步引用抽象(asynchronous reference, aref):以一等 IR 值表达 warp 间通信,自动插入同步和数据搬运(解决挑战 ②)
  3. 多级软件流水线(Multi-granularity pipelining):在 aref 程序上编排通信与计算的重叠(解决挑战 ③)

产出 IR 经标准 Triton 编译管线降至 LLVM IR → PTX。

3.1 异步引用 aref(§III-B)

Figure 3. aref 抽象及相关操作

aref 是 Tawa 的核心创新——一个 IR 抽象,建模 GPU 上 producer 与 consumer 之间的单槽信道,由硬件 mbarrier 实现两个同步原语:empty 和 full。任一时刻恰好一个 barrier 编码槽状态:

  • E=1, F=0(初始):槽空,producer 可写
  • E=0, F=1:槽满,consumer 可读

aref 暴露三个操作,其形式化运算语义如下:

PUT:   σ(a).E = 1  ⇒  ⟨σ, put(a,v)⟩ → ⟨σ[a↦⟨buf=v, F=1, E=0⟩], ε⟩
GET:   σ(a).F = 1  ⇒  ⟨σ, get(a)⟩ → ⟨σ[a↦⟨buf=σ(a).buf, F=0, E=0⟩], σ(a).buf⟩
CONSUMED:  ⟨σ, consumed(a)⟩ → ⟨σ[a↦⟨buf=σ(a).buf, F=0, E=1⟩], ε⟩

时序链:

  1. put(a,v):要求槽空 → 写 payload → flip 到 full(在 full mbarrier 上 arrive)→ 数据对 consumer 可见
  2. get(a):要求槽满 → 读 buffer → 进入 borrowed 状态(F=E=0,值在使用中但槽不可重用)
  3. consumed(a):consumer 不再需要值 → 在 empty mbarrier 上 arrive → 恢复 empty credit → 启用下一次 put

aref 是类型泛型的 <T>,支持 tensor/tuple 等结构化 payload;多个 aref 可分组为深度 D 的环形缓冲区,支持深层流水线。

与 OpenCL pipe 等构造不同,aref 专为 GPU warp 间通信设计,语义根植于硬件 mbarrier 同步,提供清晰的排序模型。

3.2 任务感知分区(§III-C)

从 MLIR 计算图出发,两步完成分区:

Step 1:语义标记(Partition Annotation)

反向遍历 use-def 链(从 Store 等 side-effecting sink 出发),按效果标记节点:

  • Iteration statements(橙色):贡献地址计算(如 TMA 的指针算术)
  • Tile statements(蓝色):转换/消费 tile 进行实际计算(如 WGMMA)

据此做图割:iteration statements + 其支配的 TMALoad → producer partition;tile statements + 其依赖 → consumer partition。跨 partition 共享节点(如地址计算被两者共用)→ 复制计算,确保每个 partition 自包含。

Hopper 上典型配置:Producer = WG0(load warp group),Consumer = WG1(compute warp group),epilogue 附属于 WG1。

Step 2:循环分发(Loop Distribution)

对每个跨 partition 边,创建大小为 D 的 aref 环形缓冲(D 选择以最大化 TMA 传输与 TC 计算的重叠)。在 producer 侧插入 put(slot index = k mod D),consumer 侧插入 get,计算完成后插入 consumed。

Figure 5. 任务感知分区:(a) 计算图 (b) 分区后 (c) 实现的 warp 特化 Figure 5. 分区计算图 Figure 5. 实现的 warp 特化(设 D=2)

分发后产生两个 WG 区域,各自携带等距 scf.for 循环。跨 warp 通信由 aref 完成。

3.3 多级软件流水线(§III-D)

细粒度流水线(Fine-Grained Pipeline)

重叠 CUDA 核心上的地址计算与 Tensor Core 上的 MMA 执行,深度为 P:

  • 每迭代异步发射下一个 MMA(WGMMA.issue(k))
  • 当挂起操作达最大深度 P 时阻塞(WGMMA.wait(pendings=P))
  • 一旦填充,释放迭代 k-P 的结果引用(aref.consumed(k-P))
  • 末迭代后 epilogue 排空流水线

Figure 6. 细粒度流水线:重叠 MMA 地址计算与计算

粗粒度流水线(Coarse-Grained Pipeline)

当循环含 CUDA Core 计算时,形成三阶段 producer-transform-(optional)consumer 装配线:

Algorithm 1: 粗粒度 CUDA 与 Tensor Core 流水线
输入: Tile 数 N; 布尔 USE_U
Prologue;
MAYBEAREFGET(T₀); ISSUEANDCOMMIT(T₀); DOTWAIT(T₀); // 物化 T₀ 输出
MAYBEAREFCONSUMED(T₀); COMPUTE(C₀);
Steady state;
for j ← 1 to N - 1 do
   MAYBEAREFGET(Tⱼ); ISSUEANDCOMMIT(Tⱼ);
   if USE_U then MAYBEAREFGET(Uⱼ₋₁); ISSUEANDCOMMIT(Uⱼ₋₁);
   DOTWAIT(Tⱼ₋₁); // 确保 Tⱼ₋₁ 结果可见
   MAYBEAREFCONSUMED(Tⱼ₋₁); COMPUTE(Cⱼ₋₁);
   if USE_U then DOTWAIT(Uⱼ₋₁); MAYBEAREFCONSUMED(Uⱼ₋₁)
Epilogue; DOTWAIT(Tₙ₋₁); MAYBEAREFCONSUMED(Tₙ₋₁); COMPUTE(Cₙ₋₁); ...

每迭代 j 有:TC 阶段 TjT_j(产中间 tile)、CUDA Core 阶段 CjC_j(变换中间 tile,如 softmax/activation)、可选下游 TC 阶段 UjU_j(消费变换结果)。

  • Stage 识别:从 MLIR 图中按 dialect/type 线索切分——TC micro-tiles 及其胶水 → T(可能有 U 如果第二 TC 阶段),算术/归一化/激活/规约/布局变换 → C。
  • 例如 Attention:QKTQK^T → T,softmax → C,第二 GEMM PVPV → U。

3.4 aref 降级(§III-E)

将高层 aref 变换为 GPU 上直接执行的显式同步和内存搬运指令:

  • create_aref:声明 buffer + 分配 mbarriers
  • put → 异步 TMA load + empty/full barrier 保护
  • get → 阻塞等待对应 full barrier
  • consumed → 在 empty barrier 上 arrive

**关键:奇偶校验机制(parity mechanism)**避免死锁——每次操作交替使用两套 barrier(由迭代奇偶索引)。奇偶切换时,若数据已生产,consumer 可跳过等待;producer 可安全重用 buffer slot。

3.5 额外优化(Section IV)

Figure 7. (a) 协作 warp group; (b) 持久化 kernel

协作计算 warp group(§IV-A):WS 执行的限制是每个 warp group 寄存器预算有限,限制最大 tile 大小和计算强度。优化:多个 consumer warp group 协作计算同一 tile(如图 7a,WG1+WG2 共同消费 WG0 产生的数据)。通过池化寄存器形成更大 tile → 提高算术强度、改善数据复用、减少访存。无需修改 aref 抽象。

持久化 kernel(§IV-B):重复 kernel 发射引入显著 CTA launch 开销。优化:仅发射等于 SM 数的 CTAs 并保持驻留,由驻留 CTA 负责迭代处理多个 tile(如图 7b)。消除重发射延迟,重叠 TMA 加载、TC 计算、CUDA Core epilogue。

四、实验结果(Section V)

对比基线:cuBLAS (v12.7)、CUTLASS (v4.0.0)、Triton(同 commit)、ThunderKittens、TileLang。所有基线用固定 tile size 组合 {64, 128, 256} 手工调优。Tawa 的 aref 大小和 MMA 深度手动选择以最大化性能。

4.1 GEMM(§V-B)

M=N=8192,K 从 256 扫到 16384。

精度vs cuBLASvs Tritonvs TileLangvs ThunderKittens
FP16+1.01×+1.13×+1.15×+1.09×
FP8+1.06×+1.02×+1.22×+1.24×
  • 最高达 79% 硬件利用率(FP16/FP8 均如此)。
  • FP8 收益更大:小 tile 使 TC 计算极快,访存和同步成为瓶颈;aref 自动平衡 producer/consumer 并加深预取。
  • 小 K 时落后 cuBLAS:Triton 开销占比相对显著。

Figure 8. GEMM 性能结果

4.2 GEMM 变体(§V-C)

Batched GEMM(batch=8,M/N/K 1K~16K)和 Grouped GEMM(可变形状)——MoE 模型中常见。

  • Batched GEMM:Tawa 持续优于 Triton(最高 +7%),比 TileLang 快高达 50%。
  • Grouped GEMM:TileLang 在小 group 表现好但随 group 增大退化。

Tawa 的 aref 分区和自动 WS 允许一个 GEMM 的数据搬运与另一个 GEMM 的计算重叠。

Figure 9. FP16 batched GEMM 和 grouped GEMM 结果

4.3 多头注意力(§V-D)

L ∈ [1024, 16384],batch=4,head_dim=128。

精度vs FA3 (CUTLASS C++)vs Tritonvs TileLangvs ThunderKittens
FP1696%+1.21×——
FP889%+1.11×+1.48×无法运行
  • FP16 优势在 L≥4K 后明显(内存流量和同步占主导);短序列时 prologue/epilogue/barrier 成本未摊销,WS 优势不明显。
  • ThunderKittens 无法运行 FP8 attention 配置——表明其内核主要调优于 FP16。

Figure 10. FP16/FP8 MHA 性能结果

4.4 超参数分析(§V-E)

Figure 11. aref 和 MMA 流水线大小的影响

  • aref 大小 D:性能随 D 增大而提升(更多预取、平滑延迟变化、更好隐藏 global→shared 传输)。但 D 过大需更多 shared memory,与大型 tile 不可兼得。
  • MMA 深度 P:经典过流水线权衡。P=1→2 通常有益(减少 accumulator 可用性等待);P=3 降低吞吐(更深计算流水线增加 live fragment 和 accumulator 寄存器,压低 WG 占用率)。
  • 持久化 kernel:始终更快(+5~10%),消除 grid 调度和尾部效应,改善缓存局部性。

4.5 消融实验(§V-F)

Figure 12. 不同优化对 FP16 kernel 的影响

以 baseline Triton(无 WS)= 104 TFLOPs/s 为起点:

优化GEMM 提升MHA 提升
+Auto WS(单 warp group)3.78× → 393 TFLOPs/s2.84×
+Cooperative WGs(两 compute WG)同 tile 不变;但可增大 tile—
+Large Tile Size(128×256×64)1.46×—
+Persistent Kernel10%—
+Better Aref Size(调优 D)718 TFLOPs/s(~7× baseline)654 TFLOPs/s

渐进改进凸显了 Tawa 精心整合 warp 特化、协作 warp group 和流水线的威力。

五、与相关系统的比较

系统分区方式通信抽象流水线形式化保证用户标注
Triton无 WS无Ampere cp.async无无
TileLang隐式无有限 MMA 流水线无需 T.pipelined / T.copy
Cypress手动管理层级逻辑计算描述有无需手动映射
Gluon无显式通信操作有无需显式插入
TwillSMT 求解无(直接 PTX)模调度最优性保证无
Tawa语义标记自动分区aref(形式化语义)多级自动流水线aref 语义保证无标注

Tawa 的独特定位:全自动、无需标注、有形式化 aref 语义保证,直接面向实际 GPU 编程模型(Triton 前端)。

六、总结

核心贡献

  1. 提出 aref——具有形式化语义保证的 warp 级通信抽象,封装 TMA/mbarrier 底层细节。
  2. 开发 Tawa——首个面向现代 NVIDIA GPU 的全自动 warp 特化编译流程:从无标注 Triton 程序 → 任务感知分区 → aref 数据流 → 多级流水线 → PTX。
  3. 实证:H100 上 GEMM 达 cuBLAS 水平(FP16/FP8 最高 79% 硬件利用率),Attention 达 FA3 手工内核的 96%,超 Triton 1.21×。

技术影响

  • 将 warp 特化从专家手工编排(FA3 的 CUTLASS C++、ThunderKittens 的 16×16 tile 抽象)降维到一键开启(enable_warp_specialization=True)。
  • aref 抽象为 warp 间通信提供了类型安全的、有形式化语义保证的一等 IR 值,避免了手动 PTX 的错误风险。
  • 与 Twill 形成互补:Twill 用 SMT 求解器自动发现最优调度(理论最优),Tawa 用 aref + 自动分区/流水线自动编排实际代码(工程可用)。

局限性

  • aref 大小 D 和 MMA 深度 P 需手动调优(虽比手工调 kernel 简单得多)。
  • 目前主要面向 producer-consumer 双缓冲模式;ping-pong 和 multicast 等高级模式留作未来工作。
  • 对 Blackwell 的 Tensor Memory(tmem)支持尚需扩展。

七、参考资源