AgentKernelArena: Benchmarking AI Coding Agents for GPU Kernel Optimization on AMD Instinct GPUs AMD released AgentKernelArena, an open-source benchmarking framework for AI coding agents on GPU kernel optimization tasks using AMD Instinct GPUs. In tests on a 44-task subset, AMD's GEAKv3 agent achieved average speedups of 9.04× on HIP2HIP tasks, outperforming general-purpose agents like Claude Code and Cursor. The framework provides standardized evaluation across 214 tasks to enable fair comparison and reproducible results. AgentKernelArena: Benchmarking AI Coding Agents for GPU Kernel Optimization on AMD Instinct GPUs agentkernelarena-benchmarking-ai-coding-agents-for-gpu-kernel-optimization-on-amd-instinct-gpus AI coding agents such as Cursor Agent https://cursor.com/ , Claude Code https://www.anthropic.com/claude-code , and OpenAI Codex https://openai.com/codex/ are improving fast, and people increasingly trust them with specialized, high-stakes work, including GPU kernel optimization. But most of the public evidence is still a cherry-picked demo on a single kernel, not a controlled, head-to-head comparison on the same tasks, the same hardware, and the same scoring rules. On AMD Instinct™ GPUs https://www.amd.com/en/products/accelerators/instinct/mi300/mi300x.html , where every percentage point of kernel performance translates directly into training and inference cost, that gap matters. AgentKernelArena AKA closes that gap. It is an open-source benchmarking arena, built by AMD, that measures how well AI coding agents perform on real GPU kernel optimization tasks. You drop an agent into AKA — Cursor Agent, Claude Code, Codex, GEAK https://github.com/AMD-AGI/GEAK , a single-LLM call, or your own — and the framework runs it in an isolated workspace, on the same task definitions every other agent sees, and scores it through one shared automated pipeline: compile, correctness, performance. In this blog we walk through how AKA works, how to run it yourself, and what we found when we benchmarked six agent/model configurations on a 44-task subset on AMD Instinct™ MI300X. The lineup includes GEAKv3 , AMD’s in-house GPU kernel optimization agent. If you are new to the GPU side of this problem, the AMD Instinct™ MI300X https://www.amd.com/en/products/accelerators/instinct/mi300/mi300x.html product page and the AMD ROCm™ documentation https://rocm.docs.amd.com/ are good starting points, and our GEAK family blog https://rocm.blogs.amd.com/artificial-intelligence/geak-agents-family/README.html covers the agent side in depth. Key Takeaways key-takeaways AgentKernelArena is an open-source arena for benchmarking AI coding agents on GPU kernel optimization on AMD Instinct™ GPUs. It ships with 214 tasks across four categories: triton2triton , hip2hip , torch2hip , and repository-scale tasks. One unified evaluator scores every agent the same way : 20 points for compilation, 100 for correctness, and 100× the measured speedup over baseline. Per-test-case metrics, medians, and P25/P75/P90 percentiles come out of the box. We evaluated 6 agent/model configurations on a 44-task subset on MI300X. On this subset, GEAKv3 recorded average speedups of 9.04× on 20 HIP2HIP tasks, 2.75× on 20 Triton2Triton tasks, and 1.20× on 4 repository-scale rocPRIM tasks — ahead of the other five configurations in every category. Among the frontier general-purpose agents, Claude Code Opus 4.6 and Cursor Opus 4.6 reached 6.08× and 5.03× average speedup on HIP2HIP. Triton2Triton was the most challenging category for every agent we tested. AKA is built for fair, reproducible comparison — and for A/B testing agent-side changes such as new tools, MCP servers, or prompt tweaks. Timestamped runs and resumable evaluation let you attribute any score change to a real change in the agent. Figure 1, below, summarizes these results at a glance — the average speedup each agent recorded in each task category. Figure 1. AgentKernelArena results at a glance: average speedup over baseline by agent and task category on AMD Instinct™ MI300X, evaluated on a representative subset of 44 tasks. Why a Standardized Arena for Kernel Agents? why-a-standardized-arena-for-kernel-agents GPU kernel optimization is hard for an AI agent. A good kernel agent has to reason about tiling and block sizes, memory coalescing, occupancy, LDS https://rocm.docs.amd.com/projects/HIP/en/latest/ usage, asynchronous copies, MFMA/WMMA matrix operations, numerical stability, and correctness on edge-case shapes — often all at once. A flashy result on one kernel tells you very little about how the same agent will handle the next one. Most public kernel benchmarks today evaluate single LLM calls or fixed-shape correctness, not full agent workflows. They typically do not measure: kernel-to-kernel optimization , where the agent starts from a working baseline and has to make it faster without breaking correctness; repository-level optimization , where the agent has to navigate and edit a real upstream codebase; real GPU performance on AMD Instinct™ hardware , measured under controlled, reproducible conditions; the effect of agent-side machinery — prompts, tools, MCP servers, planners, profilers — on the final score. AKA closes exactly these gaps. We built it as an arena , not a single benchmark, so the evaluation logic, task definitions, scoring, and reporting all live outside the agent. New agents and new tasks plug into the same evaluator and produce comparable scores by construction. What Is AgentKernelArena? what-is-agentkernelarena AgentKernelArena runs AI coding agents on GPU kernel optimization tasks inside isolated, reproducible workspaces, and scores them with a single, centralized evaluator. Figure 2 shows the end-to-end pipeline. Figure 2. AgentKernelArena end-to-end pipeline. Task definitions, cheatsheets, and agent configuration feed into a workspace-setup and baseline-measurement stage. The agent then gets a configurable number of iterations read → edit → compile → test → profile . Once it finishes, a centralized evaluator — identical for every agent — runs compilation, correctness, and performance measurement, and computes the final score. The per-task loop is straightforward: Pick an agent, a model, and a task. AKA spins up an isolated workspace, copies in the source kernel and task scripts, and measures the baseline performance. The agent reads the task and iterates on the kernel inside its workspace. The unified evaluator compiles the optimized kernel , runs the correctness suite across every configured test shape, measures performance with warmup and benchmark iterations, and computes the final score. AKA writes per-task results , per-test-case speedup plots, and aggregate reports CSV, JSON, text into a timestamped run directory you can compare or resume later. A key design choice is the separation of optimization from evaluation : the agent only optimizes the kernel, while the framework owns all measurement. This removes a real fairness problem — otherwise every agent would time execution slightly differently and scores would stop being comparable. Supported Agents and Models supported-agents-and-models AKA ships with first-class integrations for a range of frontier and AMD agents: Cursor Agent via the cursor-agent CLI Claude Code via the claude CLI OpenAI Codex via the codex CLI SWE-agent GEAKv3 , AMD’s in-house GPU kernel optimization agent Single-LLM-call agents for clean single-shot baselines Your own agent , registered via a single launcher function You select the model through the agent layer. The runs in this blog use Anthropic Claude Opus 4.6 and Sonnet 4.6, OpenAI GPT-5.3 Codex, and Cursor Composer 2. You can also point AKA at other models through OpenRouter or a vLLM https://github.com/vllm-project/vllm endpoint. Task Categories task-categories AKA currently includes 214 task configurations across four categories, listed in Table 1. Together they cover the kinds of GPU kernel work an agent faces in practice — from optimizing existing Triton https://triton-lang.org/ and HIP https://rocm.docs.amd.com/projects/HIP/ kernels, to translating PyTorch operators, to editing real upstream repositories. Category | Tasks | Description | |---|---|---| | 148 | Optimize existing Triton kernels e.g., vLLM, ROCmBench, TritonBench-modified . | | 36 | Optimize HIP kernels gpumode-style ops, MMCV-style ops . | | 26 | Convert PyTorch operators into optimized HIP kernels. | | 4 | Optimize kernels inside full upstream repositories such as rocPRIM. | Table 1. AgentKernelArena task categories and counts. What the Agent Sees: Prompts, Cheatsheets, and Instructions what-the-agent-sees-prompts-cheatsheets-and-instructions AKA assembles a structured prompt for every task from the same set of sections, so every agent — frontier or custom — gets the same information in the same shape. As Figure 3 illustrates, the sections cover the task-type role, the source files and target functions, a GPU architecture pre-check, the task-specific optimization instructions, a completion directive, the cheatsheet block, and the workspace path. Figure 3. The shared prompt pipeline. Cursor Agent, Claude Code, and Codex all receive the identical prompt for a given task; only the CLI binary, its flags, and the backend model differ. Two pieces of this prompt are worth calling out, because they meaningfully change agent behavior: Domain cheatsheets. Each task type and GPU architecture can attach a verbatim cheatsheet to the prompt: an MI300X architecture guide CDNA3 topology, memory hierarchy, MFMA instructions , a HIP best-practices document, and a Triton best-practices document. The cheatsheets live in src/prompts/cheatsheet/ and are selected automatically from target gpu model . Adding a new GPU architecture is a small change: add an arch entry, drop in a markdown guide, and the prompt picks it up. Task-specific instructions. Each task’s config.yaml can override the auto-generated instructions with a prompt.instructions field. This is how we tell the agent exactly what to optimize — for example, “Optimize the Triton When omitted, AKA generates instructions automatically from the compile, correctness, and performance commands. fused moe kernel for maximum GPU throughput; keep the fused moe signature; output must match the reference within atol=5e-2, rtol=5e-2 for float16.” One more deliberate choice: max iterations is delivered as a natural-language directive “you must iterate up to 3 versions” appended to the prompt, not as a hard cap on tool calls. Agents are free to make as many internal tool calls per version as they need. This keeps the task prompt and iteration directive consistent across different agent runtimes, while allowing each agent to use its native tool-calling workflow. Unified Evaluator and Scoring unified-evaluator-and-scoring The unified evaluator does five things: Compiles the optimized code with the task’s declared compile command hipcc for HIP, Triton for Triton, and so on . Runs correctness checks on every configured test shape, not just one. Measures performance with configurable warmup and benchmark iterations, computes per-test-case speedup, and aggregates into median, standard deviation, and P25/P75/P90 percentiles. Produces per-test-case speedup plots and a structured task result.yaml per task. Writes run-level reports overall report.txt , overall summary.csv , task type breakdown.json inside a timestamped run {YYYYMMDD HHMMSS}/ workspace. Each task contributes to a per-task score, summarized in Table 2: Metric | Points | Description | |---|---|---| Compilation | 20 | Code compiles successfully without errors. | Correctness | 100 | Code produces correct output across all configured test shapes. | Speedup | ratio × 100 | Measured performance improvement over the baseline kernel. | Table 2. AgentKernelArena scoring system default . Figure 4, below, visualizes how these three dimensions stack into a single cumulative score. Figure 4. The cumulative scoring system rewards each dimension of kernel quality. A submission that compiles, passes correctness, and lands a 1.5× speedup scores 270 points on that task. Correctness is weighted heavily on purpose: a fast but incorrect kernel is useless in practice, while a correct kernel that merely matches the baseline is still a valid replacement. If you prefer a different policy, swap the scoring function — the evaluator stays the same. Walk Through AgentKernelArena Yourself walk-through-agentkernelarena-yourself The best way to understand AKA is to run it. In this section we take one real task — the vLLM Triton https://triton-lang.org/ RMS-norm kernel — all the way from its baseline to an agent-optimized version, and read the score the evaluator produces. Everything here runs on a single AMD Instinct™ MI300X inside the official ROCm PyTorch container, and every command is copy-paste ready. Follow along in your own terminal as you read. Step 0 — Set up the environment step-0-set-up-the-environment Start the official ROCm PyTorch container, clone the repo, and install the lightweight Python dependencies PyTorch and Triton already ship in the container : Start the official ROCm PyTorch container on your MI300X host docker run -it --rm \ --device /dev/kfd --device /dev/dri \ --group-add video --ipc host --shm-size 16G \ rocm/pytorch:rocm7.1.1 ubuntu24.04 py3.12 pytorch release 2.10.0 Inside the container git clone https://github.com/AMD-AGI/AgentKernelArena.git cd AgentKernelArena pip install -r requirements.txt AKA launches agents through their official CLIs, so install the one you want to drive and export its API key. We will use Claude Code https://www.anthropic.com/claude-code : npm install -g @anthropic-ai/claude-code export ANTHROPIC API KEY="your anthropic key" Step 1 — Look at a single task step-1-look-at-a-single-task Every task is a self-contained folder under tasks/ . Open the RMS-norm task and you will find three files that fully define it: tasks/triton2triton/vllm/triton rms norm/ ├── source/triton rms norm.py the baseline kernel the agent will optimize ├── scripts/task runner.py how the kernel is compiled, checked, and timed └── config.yaml what the agent is told, and which commands to run The source file holds the starting kernel — a straightforward, correct, two-pass Triton RMS norm. This is the agent’s “before”: python @triton.jit def rms norm kernel input ptr, weight ptr, output ptr, ... : Pass 1: accumulate sum of squares in float32 Pass 2: normalize and apply weight ... The task runner is the contract for “is this kernel correct and how fast is it.” It defines the test shapes and the timing protocol, so every agent is measured the same way — note the five input shapes, the float32 reference, and the warmup/benchmark iteration counts: TEST SHAPES = 32, 128 , 64, 512 , 128, 1024 , 256, 2048 , 512, 4096 WARMUP ITERATIONS = 10 BENCHMARK ITERATIONS = 100 correctness checks torch.allclose result, ref, atol=1e-2, rtol=1e-2 The task config is what ties it together — the kernel symbol to optimize, the compile/correctness/performance commands, and the natural-language instructions the agent actually reads: target kernel functions: - rms norm kernel compile command: - python3 scripts/task runner.py compile correctness command: - python3 scripts/task runner.py correctness performance command: - python3 scripts/task runner.py performance task type: triton2triton prompt: instructions: | Optimize the Triton RMS normalization kernel rms norm kernel for maximum GPU throughput while maintaining numerical correctness. ... Constraints: - Must maintain the same function signature for rms norm - Output must match reference within atol=1e-2, rtol=1e-2 for float16 Before any agent touches the kernel, you can run the exact same measurement the framework uses to establish the baseline. From the task directory: cd tasks/triton2triton/vllm/triton rms norm python3 scripts/task runner.py compile python3 scripts/task runner.py correctness python3 scripts/task runner.py performance You will see the baseline compile, pass correctness on all five shapes, and report a per-shape execution time. That time is the denominator of every speedup AKA will report. Now let’s hand the kernel to an agent. Step 2 — Run an agent on the task step-2-run-an-agent-on-the-task Drive the whole framework from a single config.yaml at the repository root. A minimal config that points one agent at our one task looks like this: agent: template: claude code or: cursor, codex, geak optimagentv2, single llm call, ... tasks: - triton2triton/vllm/triton rms norm - triton2triton/vllm/ run every Triton kernel under vllm - all run every task in the suite target gpu model: MI300 maps to the gfx942 architecture log directory: logs workspace directory prefix: workspace Per-agent runtime settings — the backing model, the iteration budget, and the timeout — live in agents/