Skip to content

Commit 2d7e804

Browse files
committed
README-DE: replace summary table with focused cosine vs GPU comparison
1 parent 144cab0 commit 2d7e804

1 file changed

Lines changed: 31 additions & 70 deletions

File tree

README-DE.md

Lines changed: 31 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
4744
Upstream auf aarch64: -> Scalar (kein NEON, keine Intrinsics)
4845
Upstream 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
5249
Fork 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

Comments
 (0)