Skip to content

Replace the benchmarks with a suite for the JuliaGPU benchmark history - #932

Merged
maleadt merged 2 commits into
mainfrom
tb/perf-suite
Oct 27, 2026
Merged

maleadt merged 2 commits into
mainfrom
tb/perf-suite

Conversation

@maleadt

@maleadt maleadt commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

This replaces benchmark/ and its AirspeedVelocity workflow with a perf/ suite like CUDA.jl's, Metal.jl's and AMDGPU.jl's. Its results are published to the history at https://juliagpu.org/perf/, and pull requests get a comment comparing them with it.

The old suite measured steady-state kernel times, mostly saxpy over a grid of sizes, on shared GitHub runners. It missed the regressions of the 0.10 cycle:

Each benchmark in the new suite isolates one mechanism. There are 50, in three categories:

How it measures:

  • Fresh processes: each group runs in a fresh process with one Julia thread, and one PoCL worker (serial) or one per physical core (parallel).
  • No tuning: fixed sample counts instead of tune!.
  • Latency: every sample is its own process, with an empty PoCL kernel cache.
  • Checks: every kernel's result is checked before it's measured. Launches that don't allocate today are required to stay that way, because the history compares values by their ratio and can't flag a change from zero. A run that fails a check writes no results, so nothing gets published.

It runs on Buildkite, on gpuci1 (i7-9700K, the CUDA benchmark machine), with Julia 1.13, for commits on main and non-draft PRs ([only benchmarks]/[skip benchmarks]). A run takes about 10.5 minutes there. Three consecutive runs with nothing else on the machine took 623, 624 and 622 s. Across those runs, the minimum of 33 of the 50 rows varied by less than 3%, and every latency row except the launches by less than 2%. A few parallel kernels vary much more: dgsem/fluxdiff-node by 45%, and indexing/linear3d and localmem/transpose-tiled by 27%. The history learns each benchmark's own noise, so those will only flag larger changes. I dropped three launch benchmarks that varied by 11–17%.

Some numbers from gpuci1, as a baseline:

precompile KernelAbstractions 34 s
using KernelAbstractions 0.50 s
first kernel, cold / warm PoCL cache 2.0 s / 0.36 s
compile a new kernel: simple / local memory / @groupreduce 0.12 s / 0.81 s / 2.0 s
launch 3.8 µs (0 allocations); 18.8 µs and 93 allocations with a collective

The old suite (AirspeedVelocity on GitHub runners) only measured steady-state kernel
times, mostly saxpy over a grid of sizes, and missed the regressions of the last
releases: time to the first kernel (#816), load time (#889), launch overhead, 4-d
ranges (#913) or state across barriers (#893).

perf/ follows CUDA.jl's: a BenchmarkTools suite run in fresh processes, whose results
(every statistic, and the environment) are published to the benchmark history at
juliagpu.org/perf. Every benchmark isolates one mechanism, in three categories:

- latency: Julia start-up, precompiling and loading the package, the first kernel with
  a cold and a warm PoCL cache, compiling further kernels, and launch overhead;
- performance: streaming, indexing, narrow workgroups, scheduling, `@Const`, math
  functions and contraction, local memory, private state across barriers, collectives,
  atomics and utilities, plus serial Julia loops for reference;
- applications: three of the DGSEM volume integrals and a stencil time-stepping loop.

Benchmarks run with one PoCL worker (serial) or one per physical core (parallel), with
fixed sample counts instead of tuning, so that runs are comparable.
The benchmarks run on the benchmark agent, which runs one job at a time, for every commit
on main and every non-draft pull request (`[only benchmarks]` and `[skip benchmarks]`
select them). When the job has succeeded, the Benchmarks workflow publishes its results
with JuliaGPU/benchmark-action: commits on main go into the history on gh-pages, pull
requests get a comment comparing them with it.

This replaces the AirspeedVelocity workflow, which benchmarked pull requests and their
base on a shared GitHub runner.
@maleadt
maleadt merged commit d2ada37 into main Oct 27, 2026
46 of 47 checks passed
@maleadt
maleadt deleted the tb/perf-suite branch October 27, 2026 10:32
@codecov

codecov Bot commented Oct 27, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.17%. Comparing base (5dd8a01) to head (b06ff1e).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #932      +/-   ##
==========================================
+ Coverage   83.13%   83.17%   +0.03%     
==========================================
  Files          31       31              
  Lines        2568     2568              
==========================================
+ Hits         2135     2136       +1     
+ Misses        433      432       -1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant