十个单元测试换一款新芯片的软件栈——agent 在训练数据里几乎没有的 Blackwell 上,写出了比专家手写 Triton 更快的算子
Hawkeye: Hardware-Aware GPU Kernel Optimization with Minimal Supervision
这是 8 月 20 日挂到 alphaXiv 的一篇系统论文,九位作者来自哈佛、斯坦福、Together AI 和 Caltech。它问的问题很窄,答案却出人意料:要让 coding agent 在一款刚出的芯片上写出接近专家水平的 GPU kernel,人类需要提供的知识量,大约是十个单元测试。不是十万行厂商文档,不是几百个示例算子,是十个——每个只演示一种优化手法,配一段最小的参考实现和一个可以量出来的性能指标。
值得读的地方在于它同时证伪了一个很多人正在做的事。把文档整本塞进 agent 的上下文,效果不是打了折,而是不如不塞。论文把几种给 agent 喂硬件知识的方式摆在一起比——原始文档、Triton 这类 DSL 写的样例、CUTLASS 那种生产级 kernel 的 few-shot 示例——结果只有 Hawkeye 这套结构能让性能随着 agent 的迭代轮数持续上涨,其余几种都会在某处撞到天花板。这和本栏第 53 篇是同一个调子:模型没换,换的是它周围那副脚手架,而脚手架决定了上限。
「硬件感知」缺的不是聪明,是没见过
作者给「硬件感知」下了个很具体的定义:知道这块芯片上存在哪些专属优化,并且知道怎么把它正确写进 kernel 里。前沿模型在这件事上普遍不行,而且越新的硬件越不行。作者自己列的原因很朴素——训练数据少得多、语法更难更啰嗦、架构更复杂。Blackwell 的新指令、AMD MI350 的写法,在模型见过的公开代码里几乎不存在,于是它退回自己熟悉的老套路,把矩阵核心和共享内存大片晾在那儿不用。
这不是个学术问题。每出一款新加速器,软件栈的适配都要专家花几个月手写,而工作量是按「算子 × 精度」的组合数长的。芯片一年一代,低精度格式(FP8、NVFP4、MXFP4)又在快速分化,硬件能力和软件实现之间那道缝正在变宽——芯片流片了,却没人能在第一天把它喂饱。
一张二维表,把知识切到最小单位
Hawkeye 的核心是一张表:行是优化手法(向量化访存、异步数据流水、生产者/消费者切分、warp 级归约这类反复出现的套路),列是架构(Ampere、Hopper、Blackwell、AMD MI350)。每个格子里放四样东西:一个刻意不用该硬件特性的朴素 kernel、一个专家手写的最小优化版、一份指明该看哪个 profiling 指标的配置、一段简短的说明。
关键在「最小」两个字。专家的工作量因此从 O(算子 × 精度) 降到了 O(优化手法数)——支持一款新芯片,不是重写一遍所有算子,而是写十个单元测试。论文对「这个单元测试算不算数」还定了硬标准:它必须既让对应的硬件利用率指标上升,又带来端到端的加速,光看着像用上了不算。
agent 拿到的不是这张表本身,而是一个能编译、能跑、能 profile 的沙箱。它的循环是:改代码 → 编译 → 在真卡上跑一遍、和 PyTorch 的结果对数值 → 用 Nsight Compute 或 rocprof 量硬件利用率 → 跟表里的理想值比,找出还没吃到的那个特性 → 翻到对应格子读那个单元测试,把它拼进去。整个过程里 agent 不需要「懂」硬件,它只需要能看出自己还差哪一格。
数字:18.9 倍、1.22 倍,和一句「还有很大空间」
在 torch.compile 能直接派发到 cuBLAS、cuDNN、FlashAttention 的标准算子上,Hawkeye 打平或略胜,包括几种 PyTorch 根本跑不了的低精度格式。真正拉开差距的是没有现成库可用的新型注意力变体(线性注意力、DeltaNet、Forgetting Attention 这类):torch.compile 融不了它们那些非标准的 scan 和 gate,Hawkeye 在这里拿到约 18.9 倍的几何平均加速。更值得看的是另一条线——和专家手写的 Triton FLA 库比,Hawkeye 在每个架构上都接近或超过它,Blackwell 上 1.22 倍、MI350 上打平。
Blackwell 和 MI350 这两列尤其说明问题——这两款芯片的专属指令基本不在模型的训练数据里,agent 是靠那十个单元测试现学的(扩展实验用的是 Gemini 3.1 Pro 和 GPT-5.4 这个级别的模型)。作者自己补了一句:还有很大空间。这话应该当真——这套东西是把专家水平变便宜,不是把专家取消掉。
论文还记了一个容易被忽略的观察:kernel 优化的收益是不连续的。性能会长时间纹丝不动,直到某条架构专属指令被正确写出来,然后突然跳一级。这也解释了为什么光让 agent 多迭代没用——平台期上它拿不到任何反馈,只有 profiling 指标能告诉它「你以为用上了,其实没有」。
为什么塞文档反而更差
这是全文最有迁移价值的一段,哪怕你这辈子不会碰 CUDA。原始文档信息量最大,但相关的那几页淹在无关内容里,agent 找不着北;CUTLASS 那种生产级示例质量最高,但算法逻辑和硬件细节死死缠在一起,拆不出可迁移的部分;Triton 这类 DSL 最省事,但对新硬件特性的支持总要滞后一截。三者都会随迭代轮数增加停在天花板上,只有拆成独立最小单元的那种能一直往上爬。换句话说,喂给 agent 的知识,可组合性比完备性重要。
最后一句实话:这套框架没把人从环里拿掉。给一款全新芯片写出那张表的第一列,仍然需要真懂硬件的人,而且要懂到能把一种优化手法剥离成最小的、可验证的样例。变的是这活儿只用干一次,之后所有算子、所有精度的适配都由 agent 接手。论文称框架会开源,作者说代码即将放出。
本文为 AKL AI Club 原创撰写的导读,不是原文翻译;著作权归原文作者所有。 篇目由编辑独立选取,来源均经人工核实。