lumbda/www/bend.html
russell@unturf.com 05fa922d42
bend form G — cuda-radix-sort lands live (CUB DeviceRadixSort u64)
Thin CUDA binary wrapping cub::DeviceRadixSort::SortKeys on a 64-bit
key stream. One op wired day-1 (0x01 sort-u64-asc); 0x02/0x03/0x04
slots reserved (desc, u32, key-value) for future builds.

Wire stays distinct from existing forms:
  request:  BSRT | u32 op_id | u32 n | u64[n]
  response: BSRR | u32 status | u32 n | u64[n] sorted asc

Validated on 3090-ai.foxhop.net byte-identical to Python sorted() at
n ∈ {32, 1k, 100k, 1M, 10M}. Bench at sustained throughput:

  n           kernel_ms   Gkeys/s
  100,000     0.142       0.706
  1,000,000   0.265       3.767
  10,000,000  1.817       5.504

~4x over the published Titan baseline (1.4 Gkeys/s) at saturation,
matching CUB's expected Ampere scaling.

gpu-worker.lsp learns handle-binary-sort + BSRT magic dispatch +
maybe-register-daemon! for cuda-radix-sort (overridable via
RADIX_SORT_WORKER env). Both 3090-ai (:9091) & ai (:9092) workers
restarted; both log `ready cuda-radix-sort <- ./radix-sort`.

4090 (ai.foxhop.net) standalone --binary run OOMs on cudaMalloc when
all four daemons are co-resident (secp256k1 daemon parks ~24 GiB on
startup, leaving 47 MiB free). Pre-existing capacity constraint of
the ai host, not a form-G defect; tracked in form-G-progress.md.

CATALOG.md & www/bend.html live-forms table updated with measured
3090 numbers; Wave 1 surveyed row for G marked as promoted.
2026-06-05 21:50:05 -04:00

265 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>bend — Lumbda's GPU dispatch primitive</title>
<meta name="description" content="bend is Lumbda's GPU dispatch primitive: cost-routed local-vs-remote execution over a wire protocol, with a catalog of CUDA forms each backed by published speedup benchmarks.">
<link rel="stylesheet" href="style.css">
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</head>
<body>
<header>
<h1 aria-label="lumbda."><a href="index.html" style="color:inherit;text-decoration:none">lumbda<span class="period" aria-hidden="true">.</span></a></h1>
<img class="lambda-mark" src="lumbda-logo-green.png?v=2" alt="" aria-hidden="true">
<p class="tagline">bend &mdash; dispatch to a GPU without rewriting your code</p>
</header>
<main>
<section id="what">
<p class="lead">
<code>bend</code> is a Lumbda primitive that decides per call whether to evaluate locally or ship to a CUDA worker over our wire protocol. Tiny inputs stay local; heavy inputs bend to a worker that holds a warm CUDA context across requests. The decision uses a cost estimator on the argument shape, not the operation name.
</p>
</section>
<section id="start">
<h2>Start a GPU worker</h2>
<pre><code># On any host with nvcc + a CUDA-capable GPU:
make gpu-worker
# → builds examples/cuda-fanout/shake256-fanout
# → builds the C tier (~10× faster wire orchestration than Python)
# → launches gpu-worker.lsp on port 9091
# Override tier or port:
make gpu-worker LUMBDA=python PORT=9001 # easier debugging
make gpu-worker LUMBDA=asm # smallest footprint</code></pre>
</section>
<section id="call">
<h2>Call it from any tier</h2>
<pre><code>;; bend works on every tier — Python, C, asm — through the same
;; tcp-* + portal primitives lumbda already ships.
(load "examples/cuda-fanout/wire.lsp")
(load "examples/cuda-fanout/bend.lsp")
(load "examples/cuda-fanout/bend-macros.lsp") ; Python/C only — asm uses bend-call
;; Tiny — cost below threshold, evaluates locally
(bend (cuda-shake-fanout '("00" "01" "deadbeef") 32))
;; Heavy — cost above threshold, ships to the GPU worker
(bend (cuda-shake-fanout one-million-inputs 32))</code></pre>
</section>
<section id="protocol">
<h2>Wire protocol</h2>
<p>Two modes: <strong>S-expression text</strong> (the default) and <strong>binary</strong> (magic <code>BSHK</code> header + raw bytes). Binary mode bypasses S-expression parsing entirely.</p>
<table>
<thead><tr><th>workload</th><th>Py S-exp</th><th>Py binary</th><th>C S-exp</th><th>C binary</th></tr></thead>
<tbody>
<tr><td>100 × 16 B</td><td>3.43 ms</td><td>0.74 ms</td><td>0.40 ms</td><td><strong>0.15 ms</strong></td></tr>
<tr><td>1k × 16 B</td><td>23.24 ms</td><td>0.76 ms</td><td>2.77 ms</td><td><strong>0.22 ms</strong></td></tr>
<tr><td>10k × 16 B</td><td>218.82 ms</td><td>1.27 ms</td><td>CLIFF</td><td><strong>0.88 ms</strong></td></tr>
<tr><td>100k × 16 B</td><td>2,219 ms</td><td>10.18 ms</td><td>CLIFF</td><td><strong>10.35 ms</strong></td></tr>
<tr><td>1M × 16 B</td><td>23,811 ms</td><td>159 ms</td><td>CLIFF</td><td><strong>157 ms</strong></td></tr>
</tbody>
</table>
<p>Binary mode wins by 30&ndash;200&times; over S-expression at scale; at 1 M × 16 B inputs C tier binary is 157 ms vs 23,811 ms for S-exp, and bend beats host hashlib by ~12&times;. The CUDA toolchain stays isolated to the leaf binary the worker spawns &mdash; no tier links libcudart; asm tier hosts workers through hand-written <code>pipe2 + fork + execve</code> syscalls.</p>
</section>
<section id="fleet">
<h2>Fleet</h2>
<p>bend runs on a 2-host LAN cluster; round-robin selection lives in <code>bend.lsp</code> via <code>*bend-workers*</code> + <code>BEND_WORKERS</code> env.</p>
<table>
<thead><tr><th>host</th><th>GPU</th><th>arch</th><th>port</th><th>coexists with</th></tr></thead>
<tbody>
<tr><td><code>3090-ai.foxhop.net</code></td><td>RTX 3090 (24 GB)</td><td>sm_86</td><td>9091</td><td>idle</td></tr>
<tr><td><code>ai.foxhop.net</code></td><td>RTX 4090 (24 GB)</td><td>sm_89</td><td>9092</td><td>qwen LLM (llama.cpp) on GPU</td></tr>
</tbody>
</table>
<p>The 4090 box shares its GPU with a qwen LLM &mdash; bend kernels burn SMs for milliseconds then release; qwen keeps its weights resident; 24 GB VRAM holds both. Cluster aggregate (sequential round-robin dispatcher): 1.6&times; at 200 × <code>n=1k</code> mod-mul, 1.2&times; at 6 × <code>n=100k</code>; an async dispatcher unlocks the remaining 2&times; headroom.</p>
</section>
<section id="catalog">
<h2>Form catalog</h2>
<p>A form earns a slot here only after we have published a benchmark or measured one on our hardware. "I think this would be fast" does not earn a slot &mdash; the form-status column says <code>planned</code> until numbers exist.</p>
<h3>Status legend</h3>
<ul>
<li><code>live</code> &mdash; binary built, worker dispatches it, numbers recorded on our hardware</li>
<li><code>surveyed</code> &mdash; published benchmark cited, prototype binary not yet wrapped</li>
</ul>
<h3>Live forms</h3>
<table>
<thead><tr><th>form</th><th>hardware</th><th>throughput</th><th>wire shape</th></tr></thead>
<tbody>
<tr>
<td><code>cuda-shake-fanout</code></td>
<td>RTX 3090</td>
<td>12&times; host hashlib at 1 M × 16 B inputs</td>
<td><code>(cuda-shake-fanout '(hex ...) out-bytes)</code> + <code>BSHK</code> binary</td>
</tr>
<tr>
<td><code>cuda-sim-ops-bin</code></td>
<td>RTX 3090</td>
<td>1.07&times; at 128 batches; crossover ~115 batches</td>
<td><code>(cuda-sim-ops-bin "path/to/ops.bin" n-batches)</code></td>
</tr>
<tr>
<td><code>cuda-sim-axis-flip</code></td>
<td>RTX 3090</td>
<td>217 Mops/s @ K=32 M=4 (many-candidates × few-shots)</td>
<td><code>(cuda-sim-axis (variant-paths ...) n-shots)</code></td>
</tr>
<tr>
<td><code>cuda-bignum-cgbn</code></td>
<td>RTX 3090</td>
<td>1.28 Gops/s kernel mod-mul @ n=1M (256-bit, ~256&times; GMP CPU); 9 ops</td>
<td><code>BCGB</code> binary: op_id + bitwidth + n + modulus + a + b</td>
</tr>
<tr>
<td><code>cuda-secp256k1-batched-mul</code></td>
<td>RTX 3090</td>
<td>13.83 Mkeys/s @ n=1M (~309&times; coincurve CPU; windowed-G ladder w=4)</td>
<td><code>BSCP</code> binary: scalars + base-point &rarr; <code>BSCR</code> points</td>
</tr>
<tr>
<td><code>cuda-radix-sort</code></td>
<td>RTX 3090</td>
<td>5.50 Gkeys/s @ n=10M (kernel 1.82 ms); 3.77 Gkeys/s @ n=1M; CUB DeviceRadixSort u64 ascending</td>
<td><code>BSRT</code> binary: op_id + n + u64[n] &rarr; <code>BSRR</code> sorted u64[n]</td>
</tr>
</tbody>
</table>
<h3>Surveyed forms (Wave 1)</h3>
<table>
<thead><tr><th>form</th><th>throughput</th><th>hardware</th><th>ref</th></tr></thead>
<tbody>
<tr><td><code>cuda-secp256k1-batched-mul</code></td><td>6.5 Gkeys/s VanitySearch RTX 4090; 8.6 Gkeys/s RTX 5090; 2.65 Gkeys/s RTX 3080</td><td>(promoted &mdash; see Live)</td><td><a href="https://arxiv.org/pdf/2501.03245">gECC</a> &middot; <a href="https://github.com/FixedPaul/VanitySearch-Bitcrack">Bitcrack</a></td></tr>
<tr><td><code>cuda-bignum-cgbn</code></td><td>100&times;+ on dense mul vs Xeon-20c + GMP + OpenMP</td><td>V100</td><td><a href="https://github.com/NVlabs/CGBN">NVlabs CGBN</a> &middot; <a href="https://arxiv.org/pdf/2405.14642">midsize-int</a></td></tr>
<tr><td><code>cuda-rho-pollard-walk</code></td><td>87.7 M ops/sec for ECCp79</td><td>RTX 2070 Super</td><td><a href="https://github.com/atlomak/CUDA-rho-pollard">atlomak</a> &middot; <a href="https://github.com/oritwoen/kangaroo">oritwoen</a></td></tr>
<tr><td><code>cuda-clifford-stabilizer</code></td><td>186&times; over Stim (CPU SOTA) on equivalence-checking</td><td>STABSim</td><td><a href="https://arxiv.org/abs/2507.03092">STABSim</a> &middot; <a href="https://arxiv.org/abs/2505.03307">Qimax</a></td></tr>
<tr><td><code>cuda-bernstein-yang-inv</code></td><td>3&ndash;10&times; per inversion over Fermat on CPU; novel territory on GPU</td><td>&mdash;</td><td><a href="https://eprint.iacr.org/2019/266">safegcd</a> &middot; <a href="https://eprint.iacr.org/2024/644">Jumping</a></td></tr>
<tr><td><code>cuda-ntt-poly</code></td><td>up to 123&times; over CPU; 21&times; on RTX 3070</td><td>RTX 3070</td><td><a href="https://arxiv.org/pdf/2405.11353">NTTSuite</a> &middot; <a href="https://eprint.iacr.org/2021/124.pdf">FHE NTT</a></td></tr>
<tr><td><code>cuda-radix-sort</code></td><td>1.4 G keys/sec; 20&ndash;50&times; over CPU merge sort; 257&times; vs Xeon Phi for scan</td><td>(promoted &mdash; see Live)</td><td><a href="https://github.com/NVIDIA/cub">CUB</a> &middot; <a href="https://gpuopen.com/learn/boosting_gpu_radix_sort/">Onesweep</a></td></tr>
</tbody>
</table>
<h3>Surveyed forms (Wave 2)</h3>
<p>Sorted by reported speedup descending.</p>
<table>
<thead><tr><th>form</th><th>throughput</th><th>hardware</th><th>ref</th></tr></thead>
<tbody>
<tr><td><code>cuda-minhash-weighted</code></td><td>600&ndash;1000&times; vs numpy+MKL</td><td>Titan X vs Xeon E5-1650</td><td><a href="https://github.com/src-d/minhashcuda">src-d/minhashcuda</a></td></tr>
<tr><td><code>cuda-cuckoo-filter</code></td><td>378&times; insert, 258&times; delete</td><td>A100</td><td><a href="https://arxiv.org/pdf/2603.15486">arXiv:2603.15486</a></td></tr>
<tr><td><code>cuda-aes-ctr-chacha20</code></td><td>211&ndash;400 GB/s</td><td>single GPU</td><td><a href="https://dl.acm.org/doi/fullHtml/10.1145/3605573.3605620">AsyncGBP</a></td></tr>
<tr><td><code>cuda-suffix-array-skew</code></td><td>30&ndash;242&times; vs CPU SA-IS</td><td>Tesla K20</td><td><a href="https://escholarship.org/content/qt83r7w305/qt83r7w305_noSplash_842edf05a7f4e9ecfb1a477bdf9318d3.pdf">Liu/Luo</a></td></tr>
<tr><td><code>cuda-kdtree-build</code></td><td>30&ndash;242&times; build, 1.6&ndash;200&times; kNN</td><td>RTX (RT cores)</td><td><a href="http://www.kunzhou.net/2008/kdtree.pdf">Zhou et al.</a></td></tr>
<tr><td><code>cuda-sat-paraFROST-elim</code></td><td>93&times; peak, 48&times; avg variable elim</td><td>NVIDIA + Kissat baseline</td><td><a href="https://github.com/muhos/ParaFROST">ParaFROST</a></td></tr>
<tr><td><code>cuda-aho-corasick-pfac</code></td><td>~50&ndash;100&times; IDS pkt-inspect</td><td>GTX-class</td><td><a href="https://www.cise.ufl.edu/~sahni/papers/multipatternGPU.pdf">PFAC</a></td></tr>
<tr><td><code>cuda-dilithium-pqsig</code></td><td>57.7&times; keygen+sign+verify vs single CPU thread</td><td>RTX 3090 Ti</td><td><a href="https://eprint.iacr.org/2024/1365.pdf">IACR 2024/1365</a></td></tr>
<tr><td><code>cuda-mc-options-pricing</code></td><td>25&ndash;152&times;</td><td>Tesla C1060 / modern</td><td><a href="https://developer.nvidia.com/gpugems/gpugems2/part-vi-simulation-and-numerical-algorithms/chapter-45-options-pricing-gpu">GPU Gems Ch.45</a></td></tr>
<tr><td><code>cuda-cuFFT-batched-1D</code></td><td>8&ndash;32&times; vs MKL; tcFFT 1.1&ndash;3.2&times; vs cuFFT</td><td>V100 / A100</td><td><a href="https://arxiv.org/pdf/2104.11471">tcFFT</a></td></tr>
<tr><td><code>cuda-blake3-tree</code></td><td>~5&ndash;20&times; tree mode</td><td>Blaze-3 CUDA</td><td><a href="https://github.com/Blaze-3/BLAKE3-gpu">Blaze-3</a></td></tr>
<tr><td><code>cuda-bloom-filter-modern</code></td><td>~6&times; CPU; 3.4 B inserts/s</td><td>B200 / Perlmutter</td><td><a href="https://arxiv.org/pdf/2512.15595">arXiv:2512.15595</a></td></tr>
<tr><td><code>cuda-gemm-batched-FP8</code></td><td>4.8&times; FP8 vs A100; 716 TFLOPS H100</td><td>H100 SXM</td><td><a href="https://developer.nvidia.com/blog/new-cublas-12-0-features-and-matrix-multiplication-performance-on-nvidia-hopper-gpus/">cuBLAS 12.0</a></td></tr>
<tr><td><code>cuda-batched-matrix-inverse</code></td><td>4.3&ndash;16.8&times; vs MAGMA</td><td>P100</td><td><a href="https://www.superfri.org/index.php/superfri/article/download/178/598">Superfri 2018</a></td></tr>
<tr><td><code>cuda-hash-join-radix</code></td><td>4 B tuples/s single; 1.8 T tuples/s on 1024 A100</td><td>A100 cluster</td><td><a href="https://adms-conf.org/2021-camera-ready/gao_adms21.pdf">ADMS-21</a></td></tr>
<tr><td><code>cuda-kmer-count</code></td><td>4&ndash;6&times; vs KMC2</td><td>RapidGKC, Gerbil</td><td><a href="https://www.researchgate.net/publication/382499333_RapidGKC_GPU-Accelerated_K-Mer_Counting">RapidGKC</a></td></tr>
<tr><td><code>cuda-cgraph-traversal</code></td><td>38 B TEPS</td><td>DGX2</td><td><a href="https://medium.com/rapids-ai/rapids-cugraph-multi-gpu-pagerank-363aed1a2503">cuGraph</a></td></tr>
<tr><td><code>cuda-triangle-count-TRUST</code></td><td>~1 T TEPS</td><td>multi-A100</td><td><a href="https://arxiv.org/pdf/2103.08053">TRUST</a></td></tr>
<tr><td><code>cuda-ldpc-bp-decoder</code></td><td>10 Gbps with early-termination</td><td>GPGPU</td><td><a href="https://www.mdpi.com/2079-9292/11/21/3447">MDPI Electronics 2022</a></td></tr>
<tr><td><code>cuda-nvcomp-zstd</code></td><td>2.2&times; zstd; 1.4&times; LZ4; 1.9&times; snappy</td><td>H100 / A100</td><td><a href="https://docs.nvidia.com/cuda/nvcomp/">nvCOMP</a></td></tr>
</tbody>
</table>
<h3>Surveyed forms (Wave 3)</h3>
<table>
<thead><tr><th>form</th><th>throughput</th><th>hardware</th><th>ref</th></tr></thead>
<tbody>
<tr><td><code>cuda-fluidx3d-lbm</code></td><td>100&ndash;200&times; vs ANSYS Fluent; 8,799 MLUPS single A100</td><td>A100</td><td><a href="https://github.com/ProjectPhysX/FluidX3D">FluidX3D</a></td></tr>
<tr><td><code>cuda-mfcc-spectral</code></td><td>~97&times; CPU MFCC; STFT ~75&times; via cuSignal</td><td>GTX 580 / RTX 30-series</td><td><a href="https://developer.nvidia.com/blog/accelerated-signal-processing-with-cusignal/">cuSignal</a></td></tr>
<tr><td><code>cuda-batched-lp-simplex</code></td><td>95&times; over CPLEX; 5&times; over GLPK</td><td>GTX 980-class</td><td><a href="https://arxiv.org/pdf/1802.08557">arXiv 1802.08557</a></td></tr>
<tr><td><code>cuda-betweenness-centrality-weighted</code></td><td>30&ndash;150&times; warp-centric weighted BC</td><td>GTX onwards</td><td><a href="https://arxiv.org/pdf/1701.05975">arXiv 1701.05975</a></td></tr>
<tr><td><code>cuda-cudasift-orb-ransac</code></td><td>~60&times; SIFT CPU&rarr;GPU; ORB 11.3&times;</td><td>GTX 1060+</td><td><a href="https://github.com/Celebrandil/CudaSift">CudaSift</a></td></tr>
<tr><td><code>cuda-cudasw-gasal2</code></td><td>CUDASW++4.0 16.2&times;; 5.71 TCUPS on H100</td><td>H100</td><td><a href="https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-024-05965-6">CUDASW++4.0</a></td></tr>
<tr><td><code>cuda-loopy-bp-mrf</code></td><td>45&times; over CPU LBP for stereo MRF</td><td>GTX 280+</td><td><a href="https://arxiv.org/pdf/2509.22337">arXiv 2509.22337</a></td></tr>
<tr><td><code>cuda-sgm-stereo</code></td><td>42 fps @ 640×480, 128 disparities</td><td>Tegra X1 / discrete</td><td><a href="https://arxiv.org/abs/1610.04121">arXiv 1610.04121</a></td></tr>
<tr><td><code>cuda-hungarian-lap</code></td><td>10&ndash;50&times;; 400 M-variable LAP in ~13 s</td><td>NVIDIA GPU</td><td><a href="https://www.sciencedirect.com/science/article/abs/pii/S016781911630045X">ScienceDirect</a></td></tr>
<tr><td><code>cuda-msm-bls12-381</code></td><td>27.86&times; over Pippenger AVX baseline</td><td>A100 / RTX 4090</td><td><a href="https://tches.iacr.org/index.php/TCHES/article/download/12061/11906/13930">SimdMSM TCHES</a></td></tr>
<tr><td><code>cuda-pdwt-lifting</code></td><td>15.9&times; over best optimized CPU DWT</td><td>GTX / Tesla</td><td><a href="https://github.com/pierrepaleo/PDWT">PDWT</a></td></tr>
<tr><td><code>cuda-tensornet-contract</code></td><td>8&ndash;20&times; vs CuPy; tensor QR ~100&times; vs Xeon</td><td>A100</td><td><a href="https://docs.nvidia.com/cuda/cuquantum/latest/cutensornet/index.html">cuTensorNet</a></td></tr>
<tr><td><code>cuda-ega-gpu-aggregation</code></td><td>6.45&ndash;29.12&times; multi-pass; group-by 19.4&times;</td><td>NVIDIA GPU</td><td><a href="https://www.vldb.org/pvldb/vol17/p644-siddiqui.pdf">VLDB Top-k EGA</a></td></tr>
<tr><td><code>cuda-bicgstab-ilu-spmv</code></td><td>SpTRSV 10.7&times;; BiCGSTAB 3.2&times; vs cuSPARSE</td><td>V100 / MI210</td><td><a href="https://arxiv.org/pdf/2508.04917">arXiv 2508.04917</a></td></tr>
<tr><td><code>cuda-icicle-snark-groth16</code></td><td>fastest Groth16 today; NTT 91% of prover</td><td>RTX 4090 / A100</td><td><a href="https://www.ingonyama.com/post/icicle-snark-the-fastest-groth16-implementation-in-the-world">ICICLE-Snark</a></td></tr>
</tbody>
</table>
<h3>Surveyed forms (Wave 4)</h3>
<table>
<thead><tr><th>form</th><th>throughput</th><th>hardware</th><th>ref</th></tr></thead>
<tbody>
<tr><td><code>cuda-kalman-batched</code></td><td>1386&times; for 5000-component measurements</td><td>various</td><td><a href="https://github.com/inganesa/CUDAkalmanFilter">CUDAkalmanFilter</a></td></tr>
<tr><td><code>cuda-g6k-tensor-sieve</code></td><td>1230&times; vs G6K CPU sieve at dim 120; SVP record dim 180 on 4 Turing GPUs</td><td>4 Turing</td><td><a href="https://eprint.iacr.org/2021/141.pdf">Ducas/Stevens/van Woerden EC 2021</a></td></tr>
<tr><td><code>cuda-zkspeed-sumcheck-hyperplonk</code></td><td>801&times; geomean over CPU; sumcheck 8.4 s &rarr; 9.5 ms</td><td>full-chip accelerator</td><td><a href="https://arxiv.org/pdf/2504.06211">zkSpeed HPCA 2025</a></td></tr>
<tr><td><code>cuda-kyber-batched-ntt</code></td><td>~451&times; batched (B=65k); HI-Kyber 6.47&times; over prior GPU SOTA</td><td>RTX 3080</td><td><a href="https://eprint.iacr.org/2023/1194.pdf">HI-Kyber</a></td></tr>
<tr><td><code>cuda-ironman-ote</code></td><td>237&times; OT throughput vs full-thread CPU</td><td>near-memory variant</td><td><a href="https://arxiv.org/pdf/2507.16391">Ironman arXiv 2507.16391</a></td></tr>
<tr><td><code>cuda-cudss-cholesky</code></td><td>&gt;100&times; vs QDLDL; 20&times; vs CHOLMOD factor</td><td>NVIDIA</td><td><a href="https://developer.nvidia.com/blog/solving-large-scale-linear-sparse-problems-with-nvidia-cudss/">NVIDIA cuDSS</a></td></tr>
<tr><td><code>cuda-particle-filter</code></td><td>~150&times; absolute (5000 particles @ 170 Hz)</td><td>GPGPU</td><td><a href="https://asp-eurasipjournals.springeropen.com/articles/10.1186/1687-6180-2013-148">EURASIP J ASP 2013</a></td></tr>
<tr><td><code>cuda-rk-stiff-chemkin</code></td><td>126&times; vs single-core; 25&times; vs 6-core for hydrogen RKCK 524k ODEs</td><td>GPGPU</td><td><a href="https://arxiv.org/pdf/1309.2710">Niemeyer &amp; Sung</a></td></tr>
<tr><td><code>cuda-fem-assembly-jit</code></td><td>87&times; assembly vs serial CPU; 126&times; peak numerical integration</td><td>GPGPU</td><td><a href="https://arxiv.org/pdf/1802.03433">Mironov et al.</a></td></tr>
<tr><td><code>cuda-cufalcon-sign</code></td><td>201k sig/s Falcon-512 on A100; verify 2.72M sig/s, 29.5&times; vs AVX2</td><td>A100</td><td><a href="https://eprint.iacr.org/2025/249.pdf">cuFalcon eprint 2025/249</a></td></tr>
<tr><td><code>cuda-cudahull-3d</code></td><td>30&ndash;40&times; over Qhull CPU</td><td>NVIDIA</td><td><a href="https://www.sciencedirect.com/science/article/abs/pii/S0097849312000350">CudaHull CAG 2012</a></td></tr>
<tr><td><code>cuda-fastplay-garbled</code></td><td>35&ndash;40&times; over serial garbling on GPU cluster</td><td>GPU cluster</td><td><a href="https://eprint.iacr.org/2011/097">Fastplay eprint 2011/097</a></td></tr>
<tr><td><code>cuda-air-fri</code></td><td>~22.8&times; avg end-to-end ZK speedup; FRI commitment</td><td>GPGPU</td><td><a href="https://sacworkshop.org/SAC25/preproceedings/sac2025-1-paper8.pdf">Air-FRI SAC 2025</a></td></tr>
<tr><td><code>cuda-rabin-fingerprint</code></td><td>16&times; over single-thread CPU; 40 Gbps absolute</td><td>GTX 780 (HARENS)</td><td><a href="https://ipapapa.github.io/Files/cloudcom2016.pdf">HARENS CloudCom 2016</a></td></tr>
<tr><td><code>cuda-gdel3d</code></td><td>10&times; over CGAL 3D Delaunay; 70&times; Voronoi/jump-flood at 10M points</td><td>NVIDIA</td><td><a href="https://www.comp.nus.edu.sg/~tants/gdel3d_files/gDel3D.pdf">gDel3D I3D 2014</a></td></tr>
<tr><td><code>cuda-perasure-crs</code></td><td>10&times; vs multithread Jerasure; 10 GB/s on GTX780 absolute</td><td>GTX 780</td><td><a href="https://ieeexplore.ieee.org/document/7248360/">PErasure IEEE Cluster 2015</a></td></tr>
<tr><td><code>cuda-piranha-mpc</code></td><td>4&times; vs CryptGPU on VGG16 private inference; full 3/4-party stacks single-GPU</td><td>single GPU</td><td><a href="https://www.usenix.org/system/files/sec22-watson.pdf">Piranha USENIX Sec 2022</a></td></tr>
<tr><td><code>cuda-scamp-matrix-profile</code></td><td>quintillion pairwise comparisons / day (absolute)</td><td>GPGPU</td><td><a href="https://github.com/zpzim/SCAMP">SCAMP</a></td></tr>
<tr><td><code>cuda-cudtw-subseq</code></td><td>2&ndash;3 orders of magnitude over UCR-Suite CPU; soft-DTW up to 5000&times;</td><td>Volta</td><td><a href="https://link.springer.com/chapter/10.1007/978-3-030-57675-2_37">cuDTW++ Euro-Par 2020</a></td></tr>
<tr><td><code>cuda-terachem-dft</code></td><td>1&ndash;2 orders of magnitude over CPU; 8&ndash;50&times; vs GAMESS on 256-core cluster</td><td>4&times; Tesla</td><td><a href="https://en.wikipedia.org/wiki/TeraChem">TeraChem</a></td></tr>
</tbody>
</table>
<p><strong>Wave 4 filter-outs</strong>: MAFFT MSA (11&ndash;20&times;, surpassed), RAxML likelihood (32&times; kernel only, ~3&ndash;10&times; end-to-end), AmgX CG (3&ndash;4&times; vs AmgX baseline), BVH Karras LBVH (2&ndash;3&times; over prior GPU LBVH), LDPC decode (40&ndash;160 Mbps, not &ge;10&times; over modern SIMD CPU), mesh decimation (application-dependent), discrete Gaussian sampler (single-digit % gains; fold into Kyber NTT). Revisit when the published number changes.</p>
<h3>Why a form earns its slot</h3>
<p>A form is GPU-worth-it when at least one of:</p>
<ol>
<li><strong>Embarrassingly parallel.</strong> N independent items, no cross-item dependency.</li>
<li><strong>Dense, branch-free inner loop.</strong> Same operation on every element.</li>
<li><strong>Reduction-friendly.</strong> Tree-reduce / prefix-sum / parallel-scan patterns.</li>
<li><strong>Big batch amortizes fixed kernel overhead.</strong></li>
</ol>
<p>When none of these hold, find a different decomposition: parallelize on a different axis, or stay on CPU &amp; fan out across fleet hosts.</p>
</section>
<section id="source">
<h2>Source &amp; specs</h2>
<p>
<a href="https://git.unturf.com/engineering/unturf/lumbda/-/blob/master/examples/cuda-fanout/">examples/cuda-fanout/</a> &mdash; wire contract, daemon protocol, bench data, per-tier integration.<br>
<a href="https://git.unturf.com/engineering/unturf/lumbda/-/blob/master/examples/cuda-fanout/CATALOG.md">CATALOG.md</a> &mdash; canonical source for form metadata.
</p>
</section>
</main>
<footer>
<p>
<a href="index.html">lumbda.com</a>
&middot;
<a href="https://git.unturf.com/engineering/unturf/lumbda">source</a>
&middot;
<a href="lumbda-whitepaper.html">whitepaper (HTML)</a>
&middot;
<a href="lumbda-whitepaper.pdf">whitepaper (PDF)</a>
&middot;
<a href="https://unturf.com">unturf.com</a>
</p>
</footer>
</body>
</html>