mirror of
https://github.com/luxfi/gpu.git
synced 2026-10-30 16:23:49 +00:00
Standalone microbenchmarks for the deterministic CLOB matcher (one thread per book, sequential price-time priority, parity-checked vs OpenMP CPU) across all three GPU makers: CUDA, HIP, Metal. Optimization: order-major SoA layout coalesces warp reads (adjacent books read contiguous words instead of DEPTH-strided). Pure memory-access change; identical deterministic fills (parity MATCH at every N). Measured, tuned per backend (taker orders/sec): - AMD Radeon 8060S (HIP, SoA preload TPB=64): 12.76B (1.94B baseline, 6.6x) - NVIDIA GB10 (CUDA, SoA lowreg TPB=32): 9.13B (1.54B baseline, 5.9x) - Apple M4 Max (Metal, AoS TPB=256): 5.60B (SoA neutral on unified mem) - Apple M1 Max (Metal): 2.80B Findings: coalescing is a discrete/APU-memory win (neutral-to-negative on Apple unified memory); NVIDIA is occupancy-bound (prefers lowreg/small blocks) while AMD is bandwidth-rich (prefers register-resident preload) — opposite optima. Includes dex_tune.cu (TPB x variant sweep) + per-backend build/tune scripts. Co-authored-by: Hanzo Dev <[email protected]>
19 lines
1013 B
Bash
Executable File
19 lines
1013 B
Bash
Executable File
#!/bin/bash
|
|
# tune_cuda.sh — occupancy/register sweep of the SoA matcher on NVIDIA (CUDA).
|
|
# Sweeps threads-per-block x kernel variant; prints M orders/sec + CPU speedup + parity.
|
|
# variant 0 = preload (rp/rq/rs register-resident) variant 1 = lowreg (only rem[] in regs)
|
|
# GB10 tuned optimum: variant=1 (lowreg), TPB=32.
|
|
set -e
|
|
CUDA_ROOT=${CUDA_ROOT:-$(dirname "$(dirname "$(command -v nvcc)")")}
|
|
[ -x "$CUDA_ROOT/bin/nvcc" ] || CUDA_ROOT=/usr/local/cuda
|
|
NVCC=$CUDA_ROOT/bin/nvcc
|
|
TGT=$(ls -d "$CUDA_ROOT"/targets/*/include 2>/dev/null | head -1)
|
|
INCF=""; LIBF=""; [ -n "$TGT" ] && INCF="-I$TGT" && LIBF="-L${TGT%/include}/lib"
|
|
here=$(cd "$(dirname "$0")" && pwd)
|
|
$NVCC -O3 -arch=native $INCF $LIBF -Xcompiler -fopenmp -o /tmp/dex_tune "$here/dex_tune.cu"
|
|
set +e
|
|
echo "=== NVIDIA sweep (N=4M) — var0=preload var1=lowreg ==="
|
|
for V in 0 1; do for T in 32 64 128 256 512; do /tmp/dex_tune 4000000 "$T" "$V"; done; done
|
|
echo "--- tuned optimum confirm @N=16M (lowreg, TPB=32) ---"
|
|
/tmp/dex_tune 16000000 32 1
|