clpeak

“compute latency peak”

A synthetic micro-benchmark for measuring the peak achievable compute performance of CPUs and GPUs. It exercises tight vector, MAD and MMA kernels, together with vendor-optimized GEMM libraries, to expose what the silicon can actually reach — not what the spec sheet claims.

Originally an OpenCL benchmark, clpeak now drives OpenCL, Vulkan, CUDA, ROCm/HIP, Metal, oneAPI/SYCL and a native CPU backend from one codebase, so the same tests can be compared across APIs on the same machine.

clpeak desktop app showing Metal results on an Apple M1 Pro: single-precision compute expanded into per-vector-width readings, plus bandwidth and latency sections.
Results for one device, grouped by category. Every reading expands into the per-vector-width numbers behind it.

What it measures

Every test carries a description of what it does and how to read the number, both in the app (the info glyph beside each row) and on the CLI (clpeak --describe).

Backends

Backend Runs on
OpenCL Any conformant CPU/GPU/accelerator
Vulkan Any Vulkan 1.1+ GPU, including cooperative-matrix paths
CUDA NVIDIA GPUs
ROCm/HIP AMD GPUs
Metal Apple silicon and Intel Macs
oneAPI/SYCL Intel GPUs
CPU x86-64 and AArch64, runtime-dispatched per ISA

The desktop app

The GUI and the CLI are the same benchmark engine — one Flutter app for macOS, Linux and Windows (and Android/iOS from the same codebase), talking to the native backends over a C ABI. It detects every device on the machine, streams results in as they land, and saves each run to a history you can rename and export as clpeak’s XML, JSON or CSV.

CPU backend results: NEON floating-point, divide and sqrt rates, Accelerate GEMM and BNNS matmul, integer and crypto sections.
The native CPU backend, with the detected ISA and cache topology.
Custom run screen: per-backend device toggles, six test-category chips, and per-backend time-budget sliders.
Custom runs narrow the devices, categories and per-test time budget.

Download

Prebuilt binaries for each tagged release. The cuda, rocm and oneapi variants add the backends that need a vendor SDK present at build time; everything else is in the plain archive for the platform. Where a macOS .dmg is listed, it is the desktop app — drag it to Applications.

See the latest release for downloads.

Older versions are on the releases page.

macOS builds are ad-hoc signed, so a downloaded copy starts out quarantined — right-click the app and choose Open the first time, or clear the attribute:

xattr -dr com.apple.quarantine /Applications/clpeak-gui.app

From a store

On Linux the snap uses classic confinement, so it can reach the GPU drivers and device nodes the benchmarks need:

sudo snap install clpeak --classic

Build from source

git clone https://github.com/krrishnarraj/clpeak
cd clpeak
git submodule update --init --recursive
cmake -S . -B build
cmake --build build -j
./build/clpeak

Optional backends are auto-detected and enabled when their SDK is found; each one can be turned off at configure time (-DCLPEAK_ENABLE_CUDA=OFF and friends). The desktop app builds alongside the CLI whenever the Flutter SDK is on PATH, landing in build/clpeak-gui/.

Command line

The CLI is uniform across backends — the same selection and output flags work whichever API is doing the work.

./clpeak                            # every test, every available backend
./clpeak --metal                    # one backend
./clpeak --cuda --vulkan            # or several
./clpeak --single-precision-compute # one test, everywhere
./clpeak --describe                 # explain what each reading measures
./clpeak --json-file out.json       # save results (also --xml-file / --csv-file)
./clpeak --compare baseline.json    # diff this run against a saved baseline

Contributing

The repository is documented for both people and coding agents: AGENTS.md files map the tree level by level, starting at the root one, with the architecture, directory map and the conventions for adding a benchmark or a backend. Reference runs for known hardware live in results/, which is where a suspicious number gets checked first.

Bug reports and pull requests go to the issue tracker.