Skip to content

2.1.0

Choose a tag to compare

@krrishnarraj krrishnarraj released this 18 Aug 08:30
· 3 commits to master since this release
397a335

clpeak 2.1.0

The GUI release: clpeak now ships a real app for macOS, Linux and Windows alongside the CLI, built from the same benchmark engine. This release also corrects several kernels that were understating hardware — some numbers will be higher than 2.0.19 on the same machine (see Measurement corrections).

Desktop, Android and iOS app

  • New clpeak-gui Flutter app for macOS, Linux and Windows, sharing one codebase with the Android and iOS apps and driving the C++ engine over a new clpeak_ffi C ABI (src/ffi).
  • Device detection, live-streaming results as they land, saved run history, and XML export. Custom… narrows a run to specific devices, categories and per-test time budgets.
  • Monochrome instrument-console theme with Auto/Light/Dark, wrapping device and test names, persisted device properties and test display names so saved runs read correctly.
  • Desktop run history moved to $HOME/.clpeak.
  • The native Kotlin Android and Swift iOS apps are retired in favour of this one.

New tests

Test Flag Measures
Apple Accelerate / BNNS GEMM --accelerate sgemm/dgemm + BNNS fp16/bf16 through Apple's matrix coprocessor — ~1.8–2.5 TFLOPS sgemm on M1 Pro vs 760 GFLOPS for the NEON row
MPS attention --mps-attention MPSGraph SDPA at a fixed llama-class fp16 shape (macOS 15 / iOS 18+)
Texture sample rate --texture-sample Bilinear filtered-fetch throughput in GTexels/s (rgba8, rgba16f)
Store-to-load forwarding --store-forward STLF latency cost probe in ns
SMT scaling --smt-scaling fp32 throughput at one thread/physical core vs all logical threads (Linux/Windows)

Measurement corrections

These change reported numbers, for the better:

  • Compute MAD chains rebuilt as a single accumulator instead of a two-register ping-pong, across all six backends. The old shape halved fp32 throughput at 5–8 live chains on Apple GPUs (float8: 2402 → 5100+ GFLOPS on M1 Pro). The OpenCL int24 path was fixed along the way.
  • OpenCL mad() replaced with a contracted expression in the fp kernels. Apple's CL-on-Metal compiler never lowered mad() to hardware FMA: fp32 on M1 Pro goes 2.2 → 4.5 TFLOPS, now within 1–2% of Metal.
  • CPU cache-bandwidth loop shape fixed for read, write and copy — L1 read 112 → 153 GB/s — plus aligned bandwidth buffers and a clock-settle before multi-threaded timing.
  • AVX-512 FP16 chain no longer collapses under fast-math, and every cpu_simd wrapper is force-inlined (GCC was emitting real calls).
  • MPS GEMM is now sized by measurement, not gpuCoreCount — fixes identical sizes on all iPhones/iPads and a 50 ms → 550 ms spread across Macs.
  • MPSGraph-based tests are gated off on simulators.

CLI

  • --describe prints what each test and each reading actually measures, inline under the results. Every test in every backend — CPU, Metal, Vulkan, OpenCL, CUDA, ROCm, oneAPI — is documented; the GUI shows the same text behind an info glyph.

Build and packaging

  • Release archives now carry clpeak-gui alongside the CLI; macOS additionally ships a drag-to-Applications .dmg. GUI builds cover Linux x86_64, Windows x86_64 and macOS arm64, including the CUDA/ROCm/oneAPI variants.
  • CLPEAK_ENABLE_GUI (default ON, auto-skipped without a Flutter SDK); cmake --build build --target clpeak-gui.
  • Fixes -flto distro builds: per-ISA translation units are now excluded from LTO, which was dropping their -m/-march flags at LTRANS time (Arch's tmmultf32ps is not supported on x86_64 link failure) and could have inlined ISA-specific code into the baseline dispatcher.
  • Version is derived once at configure time from git describe, and Flutter's generated-file churn no longer stamps releases -dirty.
  • Snap permission fix, Flatpak desktop entries, Linux window icon, and a new project page at krrishnarraj.github.io/clpeak.

Other fixes

  • Overlapping TestScopes no longer silently drop result rows from the text output.
  • docs and AGENTS.md trimmed; refreshed reference results.

Full changelog: 2.0.19...2.1.0