KernelBench 官方检查漏掉六分之一故障,精度类漏 78.6%

Measuring the Checker: Mutation Analysis for GPU-Kernel Benchmark Oracles

Mingzhe Du, Anh Tuan Luu, Dong Huang, See-Kiong Ng

cs.LG, cs.PL

2026-09-02

对 188 道 KernelBench 题注入 10303 个 CUDA 故障并打分:官方五组随机输入漏掉 16.9% 有见证故障,精度类漏 78.6%;两输入优化套件检测到 98.0%。

这篇在解决什么

KernelBench 这类 GPU 核生成基准,用几组随机输入加宽松浮点容差判定对错。这个判定现在喂排行榜,也喂写核的强化学习奖励。检查器瞎,模型学的就不是「写对」,是「能过」。

社区已经在补。KernelBench-Verified 加了四组隐藏分布、把容差收紧,公开速度从 1.43× 掉到 0.88×;Correctness Illusion 手种九个 bug 再配一套 fuzz;robust-kbench 改形状和计时。每家都在打补丁,没有人能量补丁盖住了哪些故障、还剩哪些。手种十个 bug 看起来能打,整族故障可以在构造上不可达。

新加坡国立大学和南洋理工大学把软件工程里用了五十年的变异分析,改造成给核基准判分器打分的尺度。

方法

变异分析问的是:测试集能抓住多少故意注入的小故障。搬到 GPU 核上有四道坎。判定是带容差的数值比较,不是精确相等;输入太猛会因为合法的浮点累加次序差,把正确的核判成错;等价变异和判定器看不见的变异会污染分母;按常规 torch 扩展路径编译一个变异大约 200 秒,一万个就是 GPU 年。

流水线针对这四件事。每个题目维护一份过官方参考的 CUDA 实现当变异底物,判定器仍然是基准自己的参考实现。124 条确定性规则覆盖六族故障:算术、索引、语义、边界、同步、精度。NVRTC 把编译压到 84 毫秒(大约 500 倍);编译镜像哈希去掉重复和空操作;崩溃和挂起隔离。只有找到「击杀见证」(一组过合法性门的输入,能让这个变异确定失败)的变异才进分母,其余隔离。协议分数是它在 7384 个有见证变异上的击杀比例。官方容差默认 atol = rtol = 10⁻²。

两个机制解释为什么会漏。容差真空带随归约长度变宽:softmax 在 d=393216 时参考输出每元素大约 2.5×10⁻⁶,官方 atol=10⁻² 是信号的四千倍,全零输出能过。合法性天花板:符号混杂、尺度到 300 的输入,会让两个正确的 fp32 核因为累加次序差而超出官方容差。过了这道线的「更猛输入」不是更严,是无效。

结果

官方协议(每题自带 getinputs(),五个种子)在 7384 个有见证故障里抓住 6136 个,83.1%。漏掉 16.9%,每六个里一个,bootstrap 说明这是整套基准的性质,不是抽样噪声。中位题目漏 10%,转置卷积和归约那条尾巴漏 40–73%。

故障族有见证官方漏检
算术33498.7%
索引74914.4%
语义85814.9%
边界173522.9%
同步40027.8%
精度27178.6%
合计736216.9%

教科书式算术几乎都能抓住。真核常踩的边界、同步、精度,漏检是算术的三到九倍。精度族 78.6% 漏掉,容差在构造上就原谅了它们。

KernelBench-Verified 相对官方 +8.5 分,拆开是隐藏分布 +4.0、更紧容差 +4.5。四组变换全是幅度缩放,形状和结构不变,余数块边界故障和索引故障在构造上够不着。按 Correctness Illusion 复原的 fuzz 报到 86.2%,其中用无效输入把正确核拒了 107 次。

在击杀矩阵上做集合覆盖:每题中位两个输入就覆盖全部有见证变异,最多六个。两输入套件全池 98.0%、留出 94.8%,官方五输入只有 83.1%。给测试生成器的知识阶梯上,只知道「测试可能漏细 bug」杀 42.9%;加上故障族分类和合法性天花板到 61.0%;直接给变异源码位点反而掉到 57.3%。族级抽象比白盒实例更有用。

48 个整网(level-3)上,有见证漏检的下界是 17.3%,行为可区分变异的存活上界 43.0%(算子级 25.7%)。深而同质的管道近乎不透明:VGG-19 和 SqueezeNet 90%,LSTM 堆 77–87%;归一化和分支密的网络即使很深也还能查,ResNet-18(51 个核)11%,SwinMLP(71 个核)14%。两个题目无法裁判:48Mamba2ReturnY 的参考在 352 个位置上相对自身 fp64 超出容差,输出到 10²⁰;45UNetSoftmax 最多偏 0.74,9379 处违规。没有 fp32 实现能在这两题上被判定。

为什么重要

写核的 RL 现在拿这个检查器当奖励。奖励在精度和同步上是瞎的,策略就会往容差真空带里钻。KernelBench-Verified 已经演示过:检查器一硬,公开加速比从 1.43× 变成 0.88×。缺的是一把尺。这篇把尺做出来,还能把套件设计收成集合覆盖。

维护基准的人可以按故障族补,而不是再加几组随机种子。两输入优于官方五输入,说明问题是选什么,不是选多少。发布物 KernelBench-M 含规则、底物、见证和套件。下一次补丁可以带着覆盖率出门,不必口头保证。

局限与存疑

尺度相对于故障模型。124 条规则打在朴素底物上,表达不了 tensor-core 路径、双缓冲流水、部分 warp 惯用法,也表达不了多点耦合。它支持比较(A 套件抓住了 B 漏的)和存在性(这个协议漏了这些有见证故障),不能给过关的核发正确证书,作者也没用它发。

底物是 LLM 写、过自动门的 CUDA,不是从提交里抽样。实验在一块 H100 上。level-3 的见证搜索比算子级浅,17.3% 是下界。现实探针让 LLM 给 60 题写排行榜风格的优化核,三份是错的,两份运行时错误落在边界/保护与累加/语义族里,样本很小。容差按基准自己的 10⁻² 固定,换容差的效果单独在 Verified 审计里拆过。

术语

原文与代码

相关论文

全部论文解读