How the benchmark works
Phases
Before the run, the server issues a challenge: a nonce, the time, and an HMAC over both and your address. Everything after depends on it.
Kernels
Matmul. A tiled fp32 matrix multiply in WGSL. Each 16 × 16 workgroup computes a 64 × 64 block of C; A and B tiles of 64 × 16 go through workgroup memory and every thread keeps a 4 × 4 accumulator in registers with fma. The peak phase runs 2048 × 2048 for 8 seconds and keeps the best one-second window. TFLOPS = 2 × N³ × dispatches ÷ seconds. Batches are sized to about 120 ms so the page stays responsive.
Memory. Three kernels stream 64 MiB storage buffers as vec4<f32>: read (a running sum), write, and copy (counted as read plus write). Three seconds each, GB/s over the whole phase.
Sustain. The same matmul for 40 seconds, sampled once a second. The sustained value is the mean of the last ten samples, so a GPU that throttles under heat scores what it holds, and the result shows it as a percent of peak.
Score
score = round(100 x sustained_tflops + copy_GBs / 2)A GPU that sustains 8 TFLOPS with 400 GB/s of copy bandwidth scores 1,000, which is Bin 2.
Server checks
- Challenge matrices. A and B of a 512 × 512 verify matmul are filled from the challenge nonce with xorshift32. The browser reads back 16 entries of C at positions derived from the nonce; the server recomputes those 16 dot products and rejects the run if one is off.
- Time. At least 50 seconds between the challenge and the submission, and one run per challenge.
- Run signature. sha256 of the canonical JSON of address, adapter, nonce, results and payout address. Your wallet signs a message that contains it, the score and the bin, and the server verifies the signature against the address.
- Plausibility per device class. Upper bounds for what a browser run reaches, for example 110 TFLOPS and 1900 GB/s for NVIDIA, 35 TFLOPS and 820 GB/s for Apple. Sustained above peak, or a sustained value that does not match its own samples, is rejected.
- Variance. A score more than 1.6 times the median of the address's earlier runs on the same device class is held back until the address confirms it with more runs. Six runs an hour per address.
Accepted runs are signed by the HyperWafer ed25519 key over sha256(canon({runId, address, score, bin, runSig, acceptedAt})).
Fallback
Without WebGPU the test page says so and leaves the start button off. The leaderboard and the terminal work in any browser, and an address without a run trades at 0.05%.