核心问题:让模型绕过传统编译器后端直接生成 PTX,究竟消除了编译复杂性,还是把领域知识与正确性责任转移到了另一套系统?
论文卡片
- 原题: AI as a Compiler: Compiling Triton kernels without the Triton compiler
- 作者与机构: François Costa、Azalia Mirhoseini(Stanford);Charly Castes、Thomas Bourgeat(EPFL)。
- 日期与版本: 2026-09-29,arXiv v1;分类 cs.AI。以下依据该版本全文,不把作者的未来展望当成已验证结论。
- 定位: AI 参与编译器 lowering、GPU kernel 优化与 PTX 等价检查的交叉研究;核心是从既定 Triton 程序搜索低层实现,而不是从自然语言猜测算子。
- 阅读入口: arXiv · HTML 全文(v1) · PDF(v1) · alphaXiv
简短导读:不沿既有 lowering 路线走
传统编译器通过中间表示与变换规则,逐步把 Triton 程序变成 PTX。论文中的 Triton AI Compiler(TAIC)改为让 LLM 直接提出 PTX,再依据汇编、数值检查、计时和性能剖析反馈修改。配套环境 TCEnv 负责执行与筛选;主实验使用 GPT-6 Astra。
这不是一次性、确定性的翻译。Agent 持续提出候选,只有通过检查且改善性能的实现才能进入下一轮。输入也不是任意程序:张量尺寸、步长、编译期常量、启动配置、参数 ABI 与目标 GPU 都已固定。它绕过的是 Triton 的优化与 lowering 后端,仍依赖 PTX 汇编、GPU 执行和参考计算。
这种自由度的价值在于可以一起重想指令选择、数据布局和同步,而非只调整既定变换的参数。例如 BitDelta 的生成实现直接构造打包的 FP16 正负一表示,并减少中间存取;收益来自表示与数据流的重组,不是“写成汇编就更快”。
实验支持什么
基线为 Triton 3.6.0:按目标 GPU 自动调优,选最快的正确配置,部分源码还经过优化或去除不必要的边界掩码;但不使用实验性功能或手写内联汇编。因此比较对象是这套标准 Triton 路径,不是所有专家可能写出的实现。
作者报告:12 类常用 kernel 在 L40S、H100、B200 上的性能比为 0.83–2.23×,其中不少逐元素算子与基线几乎持平。另选的 10 个论文 kernel 在 B200 上,BitDelta 达到 3.34×,FlashAttention 为 1.37×,Dion 则为 0.97×。比值是 Triton 延迟除以候选延迟,低于 1 表示更慢,不能把最好个案当作普遍加速。
重复性结果也有区别:B200 上四项任务各独立运行五次,FlashAttention 每次保留最佳候选后的加速比均值为 1.236、标准差 0.106,最佳为 1.366。复杂任务设置每次独立运行 15 美元 API 预算门槛,SwiGLU 为 1 美元;门槛在发起请求前检查,最后一次请求可能使实际费用超限。这是有搜索预算的最佳产物成绩,不是一次调用即可稳定得到的代码。以上为作者实验,导读未独立重跑。
最重要的对照:更自由的代码,更难验证
启用原版 Volta 后,候选不仅要通过数值检查,还必须通过等价检查。不支持的模式会反馈给 Agent,促使它改写。论文表 2 在 B200、FP16 下给出:
| Kernel | 原版 Volta 验证通过的最佳实现 | 数值检查通过的最佳实现 |
|---|---|---|
| ReLU | 1.00× | 1.00× |
| GEMM | 0.24× | 1.03× |
| FlashAttention | 0.78× | 1.37× |
这里不能推断“形式验证必然拖慢程序”。检查限制了能被接受的程序集合:部分有利的新指令与执行模式不在原版验证器支持范围内。慢的是受限搜索得到的产物,不是验证过程给运行中的 kernel 添加了开销。
作者随后扩展 Volta,加入异步操作、现代 Tensor Core 指令、tensor memory 等支持,可信计算基础由约 4.2 万行增长到 6 万行。扩展能够检查更多无约束生成的产物,但附录 B 明确未声称这些扩展是健全(sound)或完备的,其形式化仍是未来工作。不能把“扩展返回通过”写成所有高性能结果都获得了同等强度的证明。
此外,Volta 将浮点运算抽象为实数运算;这个层次的等价并不等于 IEEE-754 位精确等价。原子操作、输入相关控制流和利用浮点位表示的技巧仍有限制。随机数值测试也只能提供有限输入上的证据。论文的性能、抽象语义检查与真实机器数值行为,需要分开阅读。
重点读哪里
先读 §3.1–3.3,看固定编译契约与候选筛选定义;再读 §4.2–4.3,区分单次搜索、五次重复和最佳成绩。随后对照 §4.5 表 2 与附录 B,辨认原版验证器和扩展的保证范围。最后读 附录 A.2 的 BitDelta,理解为什么性能机会与验证难点会出现在同一种低层表示技巧上。
思想启发
以下是导读者的推论,不是作者额外验证的结果。
编译器既承担“找到好实现”,也承担“解释为何允许这样变换”。这项工作让前一项更开放,却没有让后一项消失:源语义、ISA 文档、验证器模型和数值容差仍在约束搜索。知识可以不再以一条条 lowering pass 存在,但仍需要某种可审查的表达。
作者展望 AI lowering 能降低新硬件的软件支持成本;本文没有测量完整后端开发与维护的净成本。验证器新增的语义建模提醒我们:代码生成成本下降,不足以单独证明可信软件栈的总成本下降。
三个思考问题
1. 编译器的身份取决于翻译方式,还是保证范围?
一个系统为固定尺寸和目标机器反复搜索,再保存最佳实现,与传统编译器的区别只是耗时与随机性,还是它们对输入范围和正确性作出的承诺也不同?
展开思考线索
“编译器”可以描述源到目标的功能,也可以隐含跨程序、跨输入的可靠性期待。逐实例搜索当然能够实现翻译,但某些实例上的成功尚未覆盖后一种承诺。区分固定特化实例、任意合法运行时输入和整个源语言,能避免把三个不同范围的成功混为一谈。
2. 验证器不支持一种优化,应被理解为谁的能力不足?
当同一个候选数值测试通过、性能更好,却无法进入形式检查支持的语义子集时,我们知道它不正确,还是只知道现有工具无法证明它?
展开思考线索
“错误”“反例尚未发现”“当前不可证明”是不同状态。拒绝未知可以维护保证边界,却会隐藏可实现的性能;放行未知则扩大能力范围,同时改变证据强度。问题不必被压成安全或性能二选一,而在于不同保证等级的结果是否被清楚标识。
3. 若生成器越来越自由,验证器还能保持小而可信吗?
新指令、新同步模式和位级技巧不断进入候选程序时,独立验证是否会逐渐承担与传统后端相似的复杂性?
展开思考线索
验证一个候选通常可以比寻找候选更容易,但“检查容易”不表示硬件语义可以省略。关键区别可能是复杂性是否更集中、规则是否更可组合、信任边界是否更明确,而非代码行数必然更少。论文展示了生成与检查之间的重新分工,尚未证明复杂性已被整体消除。