warp 分歧仍线性放大:五代 GPU 实测,32 路分裂约慢 32 倍

Characterizing Warp Divergence from Pascal to Blackwell

Alpin Dale

cs.AR, cs.PF

2026-07-26

实测五代 NVIDIA GPU:warp 分歧代价始终线性,32 路分裂约 32 倍,高 occupancy 压不住,只有 predication 能消掉。

这篇在解决什么

NVIDIA GPU 把 32 个线程绑成一个 warp 一起跑。一旦 warp 里的线程在同一条 if/else 上走了不同分支,硬件就「分歧(divergence)」了:它得把每条分支路径单独跑一遍,空闲线程掩掉,这叫串行化(serialization)。代价是公认会变慢,但慢多少、随分支数怎么涨、跨架构有没有变,一直没有一份干净的实测。

2017 年 Volta 引入独立线程调度(Independent Thread Scheduling,ITS),给每个线程单独的程序计数器,废掉了 Pascal 那套基于立即后支配点(IPDom)的重汇合栈。之后业界基本默认「分歧处理在 Volta 之后已经定型」,Ampere 上的结论直接套到 Hopper、Blackwell 上用。这篇要查的就是这件事:ITS 之后这几代,分歧成本和处理机制到底有没有动。

方法

作者(Alpin Dale,单作者,无机构挂名)把三代之后的主流卡凑齐做横评:Pascal GTX 1080、Ampere RTX A6000/3090、Hopper H100、Blackwell 服务端的 Jetson AGX Thor、Blackwell 消费端的 RTX 5080。四路手段交叉验证:

这套组合的价值在于:动态测给「真实代价」,静态分析给「机制是怎么变的」,位翻转给「新 ISA 字段是不是真生效」。

结果

第一组结论是分歧成本几乎冻在原地:

代次每条路径斜率(周期)32 路分裂代价
Pascal70.1k约 31.9 倍
Ampere54.1k约 31.7 倍
Hopper58.1k约 31.8 倍
Blackwell(两型)46.1k约 31.9 倍

代价严格随路径数线性增长,T(k) ≈ s·k + c,和理想的「k 倍串行」线几乎重合,没有任何超线性的重汇合惩罚。注意 Blackwell 的单路径斜率(46.1k)比 Hopper(58.1k)还低,但满 32 路分裂时仍然是约 32 倍:绝对周期数变了,代价的形状没变。硬件计数器也吻合,k=1/2/4/8/16/32 时每条指令的活跃线程数是 31.9/16.2/8.3/4.25/2.23/1.21,正好是 32/k。

两条对写 kernel 直接有用的结论。一是把两路分歧的 if/else 改写成 predication(谓词执行,无分支代码),串行化惩罚在 ITS 后的卡上从 2.00 倍降到 1.00 倍(误差 0.5%),Pascal 上也是 1.94 倍降到 1.00 倍。二是 32 路分歧的代价对 occupancy 不敏感,从轻载到过载一路都是 2831 倍,Pascal 也在 29.930.9 倍。换句话说,提高 occupancy 只是藏延迟,藏不掉多出来的指令数。

而机制层面,变化是实打实的。延迟汇合(晚于 IPDom 的汇合)在收缩:Ampere 有 29 处、72.7% 汇合在 IPDom;Hopper 缩到 7 处、90.8%;Blackwell 2 处、83.2%。Blackwell 还上新了一套两档汇合屏障:.RECONVERGENT(真后支配点汇合,不会被 BREAK 打断)和 .RELIABLE(允许部分提前重汇合)。它新增了 BRA.U(uniform branch)指令,Blackwell 上出现 23 次,前几代都是 0;最大屏障嵌套从 4 层降到 3 层。但位翻转实验显示 .RELIABLE 在测试里没有任何可观测的运行时效果,它更像是编译器和汇编器的静态分类标记。

为什么重要

写 CUDA 的人可以拿走两个确定的事:分歧代价随分支数线性涨,且 occupancy 救不了它,所以热路径上的条件分支该拍平就拍平、该 predication 就 predication;做性能模型的人可以放心假设 32/k 的理想串行,这套规律从 Ampere 到 Blackwell 都成立,不用每代重新测。

代价稳定不代表底层没变。Blackwell 的控制流 ISA 已经和 Ampere 差出形态,这件事的分量主要落在写编译器、profiler、debugger 的人头上,他们得按新的汇合屏障和 BRA.U 去适配。旧的成本模型假设还能用,但工具链不能再假装 ISA 没动。对只调 kernel 的应用开发者影响不大;对做 GPU 工具和底层性能分析的人,这是近几年关于分歧机制少有的横评,值得当成基线。

局限与存疑

作者自己列了几条:前向推进(forward-progress)测试在 Pascal 上没有触发经典栈死锁所需的「无界 warp 内互等」;.RELIABLE 的结论只建立在 sm110 单 warp 的位翻转上,样本窄;实验刻意隔离了路径串行化,真实 kernel 里分歧和访存分歧(memory divergence)是交织的,后者这篇没碰;也没有覆盖多 warp 调度的边界情况和新字段被 profiler、debugger 消费时的行为。

存疑的是:这是单作者、无机构挂名的测量型研究,结论全压在作者自己的微基准和 38 个 kernel 上,可复现性依赖公开代码与原始数据。位翻转说 .RELIABLE 没有运行时效果,但测试只在单 warp、单一架构上做,这个负结论的置信度别看太高。

术语

原文与代码

社区讨论

相关论文

全部论文解读