Measuring the Checker: Mutation Analysis for GPU-Kernel Benchmark Oracles
Organizations: National University of Singapore · Nanyang Technological University · CAIR, VinUniversity
Abstract
Benchmarks for LLM-generated GPU kernels decide correctness with a few random inputs and a loose floating-point tolerance, and their verdicts now feed leaderboards and reinforcement-learning rewards. Recent work agrees these checkers are weak and patches them by hand---extra input distributions, fuzzing recipes, tighter tolerances---with no way to measure whether any patch suffices. We introduce mutation analysis as an adequacy metric for kernel-benchmark oracles: deterministic rules inject 10{,}303 compilable faults into verified CUDA implementations of 188 KernelBench problems, 7{,}384 of them with an independent kill witness; any test protocol is scored by the fraction it detects. The official check misses one in six witnessed faults (16.9%), deterministically, and the misses are skewed by family: 8.7% of arithmetic faults escape, but 78.6% of precision faults do. The metric explains why (a tolerance blind band growing with reduction size; a measured ceiling on input aggressiveness set by legitimate floating-point variance), audits the strongest existing patch (KernelBench-Verified's gain splits into points from hidden inputs and from tighter tolerance, a split its authors could not compute), and exposes a published fuzzing recipe that rejects correct kernels 107 times. Optimizing suites over the kill matrix reaches 98.0% detection with two inputs per problem (94.8% held-out), and the measurement's fault taxonomy teaches a test generator more than the raw faults themselves. Across 48 whole architectures, the blindness grows with scale, concentrating in deep homogeneous pipelines, and two problems prove unrefereeable: their official references violate the benchmark's own tolerance against fp64. We release everything as KernelBench-M.
Figures & tables
| Operators (levels 1–2) | Architectures (level 3) | |
| Problems (substrates) | 189 | 48 |
| Mutation rules | 124 | 124 |
| Mutants generated | 10,303 | 12,589 |
| non-compiling | 1,594 | 38 |
| duplicate compiled image | 279 | 155 |
| equivalent to original | 177 | 35 |
| Family | Rules | Witnessed | Missed | Example operators |
|---|---|---|---|---|
| Arithmetic | 5 | 3,349 | 8.7% | , , off-by-one constant |
| Indexing | 13 | 749 | 14.4% | axis swap, stride confusion, transposed access |
| Semantic | 18 | 858 | 14.9% | tie-breaking, fused-op reordering, flag flips |
| Boundary | 27 | 1,735 | 22.9% | guard deletion, ceil floor grid, tail drop |
| Synchronization | 6 | 400 | 27.8% | barrier removal, __syncwarp weakening |
| Precision | 27 | 271 | 78.6% | fp16 accumulators, no-stabilizer, fast-math |
| Optimized, budget | Official | ||||
|---|---|---|---|---|---|
| Scored on | 5 random | ||||
| Full pool | 87.1% | 98.0% | 99.5% | 100.0% | 83.1% |
| Held-out mutants | 84.5% | 94.8% | 96.4% | 96.6% | 82.9% |
| Rung | Generator knows | Survivors killed | Validity |
|---|---|---|---|
| R0 random fuzz | nothing | 21.6% | 107 false kills |
| R1 naive prompt | “tests may miss subtle bugs” | 42.9% | 60/60 |
| R2 taxonomy & ceiling | fault families, safe magnitudes | 61.0% | 94% (accum.) |
| R3 white-box diffs | the mutated source sites | 57.3% | 55/56 |
| Scale | Problems | Distinct | Survival (distinct) | Missed (witnessed) |
|---|---|---|---|---|
| Operators (levels 1–2) | 189 | 8,253 | 25.7% | 16.9% |
| Architectures (level 3) | 48 | 12,361 | 43.0% | 17.3% |
Appendix figures & tables3 assets
Supplementary material from the paper’s appendix.
Appendix
| Operator | Family | Missed / witnessed | Rate | Example site |
|---|---|---|---|---|
| store-fp16 | precision | 169 / 183 | 92% | out[i] = (half)acc |
| mul2plus | arithmetic | 99 / 990 | 10% | delta * delta |
| loop-start-1 | boundary | 82 / 417 | 20% | for (int i = 0; |
| mul2div | arithmetic | 78 / 968 | 8% | value * norm_weight[c] |
| loop-bound-minus1 | boundary | 77 / 384 | 20% | i < hidden_size; i++ |
| plus2minus | arithmetic | 75 / 1,173 | 6% | variance + 1.0e-5 |
| Rule | Description |
|---|---|
| Arithmetic (4 rules) | |
| minus2plus | AOR: - + |
| mul2div | AOR: * / |
| negate-store | UOI: negate stored expression |
| plus2minus | AOR: + - |
| Indexing (14 rules) | |
| Rung | Killed | Evaluated | Rate |
|---|---|---|---|
| R0 random fuzz | 249 | 1,154 | 21.6% |
| R1 naive prompt | 495 | 1,154 | 42.9% |
| R2 taxonomy & ceiling | 704 | 1,154 | 61.0% |
| R3 white-box diffs | 626 | 1,092 | 57.3% |