Begriff
SIMD (Single Instruction, Multiple Data)
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Normalerweise rechnet eine CPU so (SISD):
1 + 1 = 2. (Ein Befehl, ein Datenpaar).
Wenn du 1000 Zahlen addieren musst, brauchst du 1000 Befehle.
SIMD macht Vektor-Rechnung.
Die CPU hat extrabreite Register (z. B. 256 Bit bei AVX2).
Da passen acht 32-Bit Zahlen rein.
Der Befehl VADDPS sagt: "Addiere diese 8 Zahlen mit jenen 8 Zahlen."
In einem einzigen Takt.
Das ist 8x schneller.
Wird genutzt für Bildbearbeitung (Pixel), Audio, Krypto und Physik-Simulationen.
Merksatz: Ein paralleles Architekturkonzept (Flynn'sche Klassifikation), bei dem ein einziger Befehl gleichzeitig auf mehrere Datenelemente angewendet wird, um die Rechenleistung bei vektorisierbaren Aufgaben zu vervielfachen.
- Compiler: Moderne Compiler (
gcc -O3) versuchen automatisch, deine Loops zu vektorisieren ("Auto-Vectorization"). - Intrinsics: Du schreibst C++ Code mit speziellen Funktionen (
_mm256_add_ps), die direkt zu Assembly werden. - Java Vector API: Neu in Java. Erlaubt SIMD ohne C++.
- C#:
System.Numerics.Vector<T>.
1. Befehlssätze (x86)
- MMX (1997): 64 Bit. Nur Integer. (Veraltet).
- SSE (1999): 128 Bit. (4x float). Standard in jeder 64-Bit CPU.
- AVX (2011): 256 Bit. (8x float).
- AVX-512: 512 Bit. (16x float). Extrem mächtig, aber verbraucht so viel Strom, dass die CPU oft runtertakten muss ("AVX Offset").
2. Data Alignment
SIMD mag es, wenn Daten an 16/32/64-Byte Grenzen ausgerichtet sind (Aligned Memory).
Unaligned Load (MOVUPS) war früher langsam, heute meist okay, aber Aligned (MOVAPS) ist sicherer.
Structure of Arrays (SoA) ist für SIMD besser als Array of Structures (AoS).
x[0], x[1], ... liegt schön hintereinander. p[0].x, p[0].y, ... ist schlecht (Strided Access).
1. AVX-512 Power Throttling & Offsets
AVX-512 ist ein Monster. Ein einziger Befehl nutzt so viele Transistoren gleichzeitig, dass die CPU punktuell extrem heiß wird. Bei Intel-CPUs führt das zum sogenannten AVX-Downclocking: Die CPU senkt ihren Takt um z. B. 200 MHz, sobald sie AVX-Befehle sieht, um nicht zu verglühen. Das Fatale: Wenn du nur gelegentlich einen SIMD-Befehl in einer normalen Routine nutzt, wird deine gesamte App (auch der Nicht-SIMD-Teil) langsamer, weil die CPU im niedrigen Takt verharrt. Moderne Architekturen (wie AMD Zen 4 oder Intel Sapphire Rapids) haben dieses Problem durch effizientere Pipelines fast gelöst, aber in älteren Cloud-Instanzen ist das ein klassisches Performance-Capture-Gotcha.
2. AOS vs. SOA: Cache-Friendliness am Limit
Wie du deine Daten im RAM sortierst, entscheidet, ob SIMD 8x oder 0x schneller ist.
- AOS (Array of Structures):
[{x,y,z}, {x,y,z}, ...]– Das ist der natürliche Weg (OOP). Aber für SIMD ist es schrecklich. Du willst allexaddieren, aber sie liegen im RAM verstreut (immer einyundzdazwischen). Die CPU muss "Gather"-Befehle nutzen, was den Speedvorteil killt. - SOA (Structure of Arrays):
{xxxx...}, {yyyy...}, {zzzz...}– Das ist "data-oriented". Du hast ein Array nur fürx. Die CPU kann jetzt einfach 8xam Stück in ein Register laden (LOD). Profis programmieren im OOP-Stil, lassen aber das Layout im Hintergrund als SOA rendern (Entity Component Systems), um den SIMD-Durchsatz zu maximieren.
3. Auto-Vectorization & Compiler-Beweise
Ein moderner Compiler wie Clang oder GCC versucht, deine for-Schleife automatisch in SIMD-Befehle zu übersetzen.
Aber er ist vorsichtig. Wenn er nicht beweisen kann, dass sich die Daten nicht überschneiden (Pointer Aliasing), lässt er es sein.
Beispiel: a[i] = b[i] + c[i]. Was, wenn a und b auf den exakt gleichen Speicherbereich zeigen? Dann würde ein SIMD-Schritt das Ergebnis für den nächsten Schritt verfälschen.
Mit dem Keyword restrict (in C) oder durch das Vermeiden von Index-Abhängigkeiten hilfst du dem Compiler, den "Vektorisierungs-Beweis" zu führen. Wer es ernst meint, nutzt Tools wie Intel Advisor, um zu prüfen, warum eine Schleife nicht vektorisiert wurde.
Quick-Check
Unterschied zu GPU?
GPUs sind SIMD-Maschinen ("SIMT"). Sie haben tausende kleine Kerne, die alle das Gleiche tun. CPU-SIMD ist "die kleine GPU in der CPU" (für niedrige Latenz).SWAR?
SIMD within a Register. Ein alter Trick, um 64-Bit Integer Register als 8x 8-Bit zu nutzen, bevor es echte SIMD-Hardware gab.Masking?
Was, wenn ich in der SIMD-Loop einifhabe? AVX-512 hat "Mask Register". Man rechnet beide Pfade und "blendet" das falsche Ergebnis aus (Merge).