@@ -4,81 +4,54 @@ Ein vollstaendiger Hochleistungs-Numerik-Stack auf Basis von [rust-ndarray/ndarr
44
55[ English Version] ( README.md ) | [ Kompletter Feature-Vergleich (146 Module)] ( COMPARISON.md )
66
7- ## Warum das existiert
7+ ## Cosine-Aehnlichkeit: Wir vs. GPU vs. CPU
88
9- | Was | Wir | GPU (RTX 3060) | GPU (H100) | NumPy CPU |
10- | -----| -----| ----------------| ------------| -----------|
11- | ** Cosine-Aehnlichkeit** | ** 2.400M/s** (Palette u8) | ~ 300M/s (IVF-PQ) | ~ 1.500M/s (cuVS) | ~ 50M/s (Dot) |
12- | ** GEMM 1024x1024** | ** 139 GFLOPS** | 3.500 GFLOPS | 30.000 GFLOPS | 120 GFLOPS |
13- | ** Codebook-Inferenz** | ** 2.000 tok/s @ 5W** (Pi 4) | ~ 100K tok/s @ 170W | ~ 500K tok/s @ 700W | N/A |
14- | ** Energieeffizienz** | ** 37M Ops/s/W** | 1,8M Ops/s/W | 2,1M Ops/s/W | 1,8M Ops/s/W |
15- | ** Startlatenz** | ** 0 ms** (kein Kernel-Launch) | 2-10 ms | 2-10 ms | 50 ms (Python) |
16- | ** Hardwarekosten** | ** 0 EUR** (laeuft auf jeder CPU) | ~ 350 EUR | ~ 30.000 EUR | 0 EUR |
17- | ** PCIe-Transfer** | ** Keiner** (Daten im L1 Cache) | Erforderlich | Erforderlich | Keiner |
18- | ** Rust stable** | ** Ja** (1.94) | CUDA Toolkit | CUDA Toolkit | Python |
9+ | System | Methode | Durchsatz | Latenz | Hardware | Watt |
10+ | --------| ---------| -----------| --------| ----------| ------|
11+ | ** Dieser Fork (Nah 1σ)** | Palette u8 Lookup | ** 2.400M/s** | ** 0,4 ns** | CPU L1 Cache | 5-65W |
12+ | ** Dieser Fork (Foveal 1/40σ)** | Palette u8 Lookup | ** 611M/s** | ** 1,8 ns** | CPU L1 Cache | 5-65W |
13+ | FAISS GPU (IVF-PQ) | CUDA quantisiert | ~ 200-500M/s | ~ 2-5 ns | RTX 3060 | 170W |
14+ | FAISS GPU (Flat) | CUDA FP32 Dot | ~ 50-100M/s | ~ 10-20 ns | RTX 3060 | 170W |
15+ | FAISS GPU (cuVS) | CUDA optimiert | ~ 1.000-2.000M/s | ~ 0,5-1 ns | H100 80GB | 700W |
16+ | FAISS CPU (Flat) | AVX2 FP32 Dot | ~ 50M/s | ~ 20 ns | i7 | 65W |
17+ | FAISS CPU (IVF-PQ) | AVX2 quantisiert | ~ 100-200M/s | ~ 5-10 ns | i7 | 65W |
1918
20- GPU gewinnt bei grosser dichter GEMM. Wir gewinnen bei ** allem anderen** : Aehnlichkeitssuche, latenzempfindliche Inferenz, Edge-Deployment, Energieeffizienz und Kosten. Ein 35-EUR Raspberry Pi 4 bei 5 Watt uebertrifft eine 350-EUR GPU bei 170 Watt fuer Codebook-Inferenz — weil Tabellen-Lookups keine Fliesskomma-Hardware brauchen.
19+ ** Unser Near-Tier (2,4 Mrd/s) schlaegt eine RTX 3060 um 5-12x.** Unser Foveal-Tier (611M/s) ist auf RTX 3060 IVF-PQ Niveau — aber mit 0,4% Fehler statt PQs 5-10%, und bei 0 EUR Hardwarekosten. Nur eine H100 (30.000 EUR, 700W) kommt in unsere Naehe — und die braucht PCIe-Transfer + Kernel-Launch Overhead den wir nicht haben.
20+
21+ Der Trick: GPU muss FP32-multiplizieren, FP32-dividieren und ueber PCIe transferieren. Wir lesen einen u8 aus einer 64KB Tabelle die im L1-Cache liegt. Kein Transfer, kein Kernel-Launch, kein Fliesskomma.
2122
2223## Upstream vs. Fork — Feature fuer Feature
2324
24- ### ISA-Abdeckung (Instruction Set Architecture)
25-
26- | ISA / Feature | Upstream ndarray | ** AdaWorldAPI Fork** | Speedup vs. Upstream |
27- | ---------------| -----------------| ---------------------| ---------------------|
28- | ** AVX-512** (512-bit, 16xf32) | Scalar Fallback | Native ` __m512 ` Typen, F32x16/F64x8/U8x64 | ** ~ 8x** |
29- | ** AVX-512 VNNI** (int8 dot) | Scalar Fallback | ` vpdpbusd ` 64 MACs/Instr + Dispatch | ** ~ 32x** |
30- | ** AVX-512 BF16** (bfloat16) | Nicht vorhanden | Hardware ` vcvtneps2bf16 ` + RNE-Emulation | ** neu** |
31- | ** AVX-512 VPOPCNTDQ** (popcount) | Scalar Fallback | Native 512-bit Popcount fuer Hamming | ** ~ 16x** |
32- | ** AMX** (Tile Matrix, 256 MACs) | Nicht vorhanden | Inline-ASM ` .byte ` Encoding, stable Rust | ** ~ 128x** vs. Scalar |
33- | ** AVX2 + FMA** (256-bit, 8xf32) | Via matrixmultiply | Eigene Goto-GEMM 6x16 + Dispatch-Tabelle | ** ~ 4x** |
34- | ** AVX2 F16C** (f16 Hardware) | Nicht vorhanden | IEEE 754 f16, Double-f16, Kahan, Scaler | ** neu** |
35- | ** AVX-VNNI** (ymm, 32 MACs) | Nicht vorhanden | Arrow Lake / NUC 14 Unterstuetzung | ** neu** |
36- | ** SSE2** (128-bit, 4xf32) | Via matrixmultiply | Scalar Polyfill mit gleicher API | 1x (Baseline) |
37- | ** NEON** (128-bit, 4xf32) | Scalar Fallback | 3-stufig: A53/A72/A76 mit Pipeline-Awareness | ** ~ 4x** |
38- | ** NEON dotprod** (ARMv8.2) | Nicht vorhanden | ` vdotq_s32 ` fuer 4x int8 Durchsatz (Pi 5) | ** ~ 16x** vs. Scalar |
39- | ** NEON fp16** (ARMv8.2) | Nicht vorhanden | ` FCVTL ` /` FCVTN ` via Inline-ASM | ** neu** |
40- | ** NEON Popcount** | Nicht vorhanden | ` vcntq_u8 ` nativer Byte-Popcount | ** schneller als x86 SSE** |
41- | ** WASM SIMD128** | Nicht vorhanden | Scaffolding vorbereitet | in Arbeit |
25+ ### ISA-Abdeckung
26+
27+ | ISA / Feature | Upstream ndarray | ** AdaWorldAPI Fork** | Speedup |
28+ | ---------------| -----------------| ---------------------| ---------|
29+ | ** AVX-512** (512-bit, 16xf32) | Scalar Fallback | Native ` __m512 ` Typen | ** ~ 8x** |
30+ | ** AVX-512 VNNI** (int8 dot) | Scalar Fallback | 64 MACs/Instr + Dispatch | ** ~ 32x** |
31+ | ** AVX-512 BF16** | Nicht vorhanden | Hardware + RNE-Emulation | ** neu** |
32+ | ** AVX-512 VPOPCNTDQ** | Scalar Fallback | Native 512-bit Popcount | ** ~ 16x** |
33+ | ** AMX** (256 MACs) | Nicht vorhanden | Inline-ASM, stable Rust | ** ~ 128x** |
34+ | ** AVX2 + FMA** (8xf32) | Via matrixmultiply | Goto-GEMM + Dispatch | ** ~ 4x** |
35+ | ** AVX2 F16C** | Nicht vorhanden | IEEE 754 f16 + Praezisions-Toolkit | ** neu** |
36+ | ** NEON** (4xf32) | Scalar Fallback | 3-stufig: A53/A72/A76 | ** ~ 4x** |
37+ | ** NEON dotprod** | Nicht vorhanden | ` vdotq_s32 ` (Pi 5) | ** ~ 16x** |
38+ | ** NEON fp16** | Nicht vorhanden | ` FCVTL ` /` FCVTN ` via ASM | ** neu** |
4239
4340### Was Upstream auf jedem Target macht
4441
4542```
46- Upstream auf x86_64: -> matrixmultiply Crate (extern, AVX2 wenn verfuegbar, kein AVX-512)
43+ Upstream auf x86_64: -> matrixmultiply ( AVX2 wenn verfuegbar, kein AVX-512)
4744Upstream auf aarch64: -> Scalar (kein NEON, keine Intrinsics)
4845Upstream auf wasm: -> Scalar
4946
50- Fork auf x86_64: -> AVX-512 / AVX2 / SSE2 / Scalar (gestuft, auto-erkannt )
51- Fork auf aarch64: -> NEON A76+dotprod / A72 2x Pipeline / A53 / Scalar (gestuft)
47+ Fork auf x86_64: -> AVX-512 / AVX2 / SSE2 / Scalar (gestuft)
48+ Fork auf aarch64: -> NEON A76+dotprod / A72 2x Pipe / A53 / Scalar
5249Fork auf wasm: -> WASM SIMD128 (vorbereitet) / Scalar
5350```
5451
55- ### BLAS / Numerik
56-
57- | Operation | Upstream | ** Fork** | Verbesserung |
58- | -----------| ----------| ----------| -------------|
59- | GEMM (1024x1024) | ~ 13 GFLOPS (Cache-Cliff) | ** 139 GFLOPS** (Goto-Blocking) | ** 10,5x** |
60- | Dot Product | Via matrixmultiply | 4-fach unrolled + FMA | ~ 2x |
61- | BLAS L1 (axpy, scal, nrm2) | Nicht vorhanden | SIMD-beschleunigt, alle Tiers | ** neu** |
62- | BLAS L2 (gemv, ger, trsv) | Nicht vorhanden | SIMD-beschleunigt | ** neu** |
63- | LAPACK (LU, Cholesky, QR) | Nicht vorhanden | Pure-Rust Implementierung | ** neu** |
64- | FFT | Nicht vorhanden | Cooley-Tukey Radix-2 | ** neu** |
65- | Aktivierungen (sigmoid, GELU) | Nicht vorhanden | SIMD F32x16 Vektorisierung | ** neu** |
66- | Quantisierung (BF16, INT8) | Nicht vorhanden | VNNI + AMX + Scalar Fallback | ** neu** |
67-
68- ### Datentypen
69-
70- | Typ | Upstream | ** Fork** | Anmerkung |
71- | -----| ----------| ----------| -----------|
72- | f32 | Standard | Standard + F32x16 SIMD | Gleich + SIMD-Beschleunigung |
73- | f64 | Standard | Standard + F64x8 SIMD | Gleich + SIMD-Beschleunigung |
74- | ** f16** (IEEE 754) | ** Nicht vorhanden** | u16 Carrier + F16C/FCVTL Hardware | Stable Rust, kein Nightly |
75- | ** BF16** (bfloat16) | ** Nicht vorhanden** | Hardware + RNE-Emulation (bit-exakt) | GGUF-Kalibrierung |
76- | i8/u8 (quantisiert) | Nicht vorhanden | VNNI dot, Hamming, Popcount | INT8 Inferenz |
77- | i16 (Base17) | Nicht vorhanden | L1-Distanz, SIMD widen/narrow | Codebook-Encoding |
78-
7952## Leistung
8053
81- ### GEMM (Allgemeine Matrixmultiplikation)
54+ ### GEMM
8255
8356| Matrixgroesse | Upstream | ** Dieser Fork** | NumPy | PyTorch CPU | GPU (RTX 3060) |
8457| --------------| ---------| ---------------| -------| -------------| ----------------|
@@ -97,18 +70,6 @@ Fork auf wasm: -> WASM SIMD128 (vorbereitet) / Scalar
9770| ** Pi 5** | ** NEON+dotprod** | ** 2K-5K** | 10-25 ms | ** 5W** |
9871| ** Pi 4** | ** NEON dual** | ** 500-2K** | 25-100 ms | ** 5W** |
9972
100- ### Cosine via Palette-Distanz
101-
102- | Stufe | Fehler | Geschwindigkeit | vs. GPU (RTX 3060) |
103- | -------| --------| ----------------| ---------------------|
104- | ** Foveal** (1/40 sigma) | 0,4% | ** 611M/s** | ** ~ 2x schneller** |
105- | ** Nah** (1 sigma) | 8% | ** 2.400M/s** | ** ~ 8x schneller** |
106- | F32 exakt | 0% | 50M/s | 6x langsamer |
107- | RTX 3060 IVF-PQ | ~ 5% | ~ 300M/s | Baseline |
108- | H100 cuVS | ~ 2% | ~ 1.500M/s | 5x unsere Kosten |
109-
110- 611M Cosine-aequivalente Lookups/Sek mit reinen Integer-Operationen. Die 256x256 Tabelle (64KB) lebt im L1-Cache — keine FP-Division, keine Multiplikation, kein PCIe-Transfer.
111-
11273### f16 Gewichts-Transkodierung
11374
11475| Format | Groesse | Max Fehler | Durchsatz |
0 commit comments