Skip to content

KernelBench-Hard × Hermes Agent

Five open and frontier models, driven by Hermes Agent, writing real GPU kernels for all six KernelBench-Hard problems on an RTX PRO 6000.

Runs: 13–14 October 2026 · plain Hermes Agent, no extra skills

All 30 kernels, the harness and raw results on GitHub ↗

Models
5
Problems
6
Agent sessions
30
Correct kernels
29/30

Leaderboard

Score = fraction of the RTX PRO 6000's roofline peak that the kernel reaches (KernelBench's own benchmark.py), geometric mean over the problems the model solved. Higher is better.

  1. 1. DeepSeek V4.1 Flash 6/6 solved · 160 min agent time · $0.87
    9.8%

    deepseek/deepseek-v4.1-flash via OpenRouter · kernels

  2. 2. Qwen 3.8 Max 6/6 solved · 244 min agent time · $3.58
    9.6%

    qwen/qwen3.8-max-0902 via OpenRouter · kernels

  3. 3. Kimi K3 6/6 solved · 80 min agent time · $5.70
    9.5%

    moonshotai/kimi-k3 via OpenRouter · kernels

  4. 4. GPT 6.1 6/6 solved · 36 min agent time · subscription
    9.4%

    gpt-6.1-sol via Codex subscription · kernels

  5. 5. GLM 5.3 5/6 solved · 74 min agent time · $2.83
    6.6%

    z-ai/glm-5.3 via OpenRouter · kernels

The top four are within 0.4 points of each other. With one attempt per problem, that gap is noise, not a ranking. GLM 5.3's lower score comes from failing one problem.

Per-problem results

% of peak for the final, hidden-graded kernel. Bold = best on that problem. † = the agent hit the 45-minute cap (its last saved solution.py was graded). ✗ = failed the hidden grade. Click a score to read that kernel.

How each agent got faster

Every point is one practice run on the GPU (max 6 per problem), in order, rebuilt from Hermes Agent's own session log. Runtime is the geometric mean over the problem's shapes. The line is each model's best so far; numbered points are runs that beat it by more than 5%, and the list under the chart says what the agent changed to get there, read from its edits to solution.py. Pick a model to highlight it.

failed 50µs 70µs 100µs 150µs 1 2 3 4 5 6 graded practice run → typical runtime (log) · lower is better DeepSeek V4.1 Flash · run 1 · 99.4 µs · 13.23% of peak · fused int4 unpack + dequant + GEMM DeepSeek V4.1 Flash · run 2 · 127 µs · 10.36% of peak DeepSeek V4.1 Flash · run 3 · 104 µs · 12.68% of peak ✕ DeepSeek V4.1 Flash · run 4 · wrong output ✕ DeepSeek V4.1 Flash · run 5 · wrong output DeepSeek V4.1 Flash · run 6 · 64.5 µs · 20.37% of peak · split-K decode + CUDA graph, self-validated DeepSeek V4.1 Flash · hidden grade · 66.4 µs · 19.76% of peak 1 2 Qwen 3.8 Max · run 1 · 88.8 µs · 14.8% of peak · fused int4 dequant GEMM + split-K ✕ Qwen 3.8 Max · run 2 · runtime error Qwen 3.8 Max · run 3 · 85.1 µs · 15.44% of peak ✕ Qwen 3.8 Max · run 4 · runtime error Qwen 3.8 Max · run 5 · 74.9 µs · 17.55% of peak · int32-word loads (16B vectorized) + split-K reduce ✕ Qwen 3.8 Max · run 6 · wrong output Qwen 3.8 Max · hidden grade · 74.2 µs · 17.67% of peak 1 2 Kimi K3 · run 1 · 127 µs · 10.33% of peak · GEMV for decode + tl.dot GEMM Kimi K3 · run 2 · 88.1 µs · 14.92% of peak · split-K, wider tiles Kimi K3 · run 3 · 91.5 µs · 14.36% of peak ✕ Kimi K3 · run 4 · wrong output ✕ Kimi K3 · run 5 · wrong output Kimi K3 · run 6 · 55.7 µs · 23.61% of peak · autotuned split-K GEMV + CUDA graph Kimi K3 · hidden grade · 55.6 µs · 23.7% of peak 1 2 3 ✕ GPT 6.1 · run 1 · runtime error GPT 6.1 · run 2 · 161 µs · 8.15% of peak · split-K decode + tiled GEMM GPT 6.1 · run 3 · 77.5 µs · 16.96% of peak · one scale/zero load per group, smaller N tiles GPT 6.1 · run 4 · 73.8 µs · 17.8% of peak GPT 6.1 · run 5 · 75.8 µs · 17.34% of peak GPT 6.1 · run 6 · 73.5 µs · 17.88% of peak GPT 6.1 · hidden grade · 84.9 µs · 15.49% of peak 1 2 GLM 5.3 · run 1 · 93.8 µs · 14.01% of peak · fused int4 dequant GEMM GLM 5.3 · run 2 · 140 µs · 9.39% of peak ○ GLM 5.3 · run 3 · GPU service error (not counted) ✕ GLM 5.3 · run 4 · runtime error GLM 5.3 · run 5 · 87.2 µs · 15.08% of peak · tile-contiguous weight repack GLM 5.3 · run 6 · 82.4 µs · 15.95% of peak · fused split-K reduce + cast GLM 5.3 · hidden grade · 84 µs · 15.67% of peak 1 2 3

Kimi K3 on W4A16 GEMM · 127 µs → 55.7 µs (2.3× faster across practice)

  1. 1 run 1 · 127 µs · 10.3% of peak GEMV for decode + tl.dot GEMM
  2. 2 run 2 · 88.1 µs · 14.9% of peak · 1.44× split-K, wider tiles
  3. 3 run 6 · 55.7 µs · 23.6% of peak · 1.58× autotuned split-K GEMV + CUDA graph
● passing run ⬤ new best (>5% faster), numbered — running best ◆ hidden grade of the submitted kernel ✕ failed run ○ GPU-service error (not counted)

Did anyone cheat?

Rules catch the cheats they were written for. To catch the rest, every final kernel was also read by a judge model (Claude) against a fixed rubric: cheat = the answer isn't computed from the current inputs (hard-coded or cached outputs, skipped work, a library doing the core math, touching the harness); benchmark-aware = real work every call, but part of the speed comes from how this benchmark measures; clean = neither.

Cheats
0
Benchmark-aware
5
Clean
25

Three of the five are the same trick: a CUDA graph keyed on the input tensors' addresses. It re-reads the inputs on every replay, so the answers stay right, and serving engines use static-buffer graphs the same way. But it only pays off because the benchmark calls the kernel with the same tensors every time. KernelBench's timing loop does exactly that. Timing on fresh inputs would close the gap. All 30 verdicts ↗

What stood out

The six problems

How it was run

  1. Each model runs inside Hermes Agent with a terminal, a task folder (the problem's prompt, reference.py, shapes) and no GPU.
  2. A practice tool sends solution.py to a remote RTX PRO 6000 (Blackwell, sm_120), runs KernelBench's check.py and benchmark.py, and prints the result. Budget: 6 runs and 45 minutes per problem.
  3. When the agent stops, a hidden grader re-runs the final kernel: KernelBench's correctness check (every shape, 3 seeds, numeric and property stress cases, banned-op grep) plus a runtime op recorder that flags any banned PyTorch op (matmul, softmax, topk…) actually executed, even if hidden behind getattr or a CUDA graph. The grader was itself tested on known good, wrong and cheating solutions before any model ran.
  4. One attempt per model per problem. Same prompt, tools and limits for every model.
  5. Afterwards every final kernel was read by a judge model against a fixed cheating rubric, and each practice run was rebuilt from Hermes Agent's session log (status, speed, and the edit that produced it).

Caveats

Problems from KernelBench-Hard by Elliot Arledge (MIT), problems-rtxpro6000. GPU access via Modal.