SIMD vs. SIMT: Unterschiede im Überblick

SIMD und SIMT führen beide mit einem Befehl dieselbe Operation auf vielen Daten aus, unterscheiden sich aber darin, wie sie sich dem Programm darstellen. SIMD sind die Vektorbefehle der CPU: Programmierer oder Compiler legen Daten in Vektorregister fester Breite und verwenden die Befehle explizit. SIMT ist das Verfahren der GPU: Man schreibt die Verarbeitung eines einzelnen Threads ganz normal, und die Hardware bündelt z. B. 32 Threads zu einem Warp, der mit demselben Befehl ausgeführt wird. Verzweigungen lassen sich pro Thread schreiben, doch wenn sie innerhalb eines Warps auseinanderlaufen, werden beide Pfade nacheinander ausgeführt, was die Effizienz senkt.

MerkmalSIMDSIMT
AusführungsmodellEin Befehl verarbeitet gleichzeitig mehrere in einem Vektorregister angeordnete ElementeEin Befehl wird gleichzeitig von vielen zu einem Warp gebündelten Threads ausgeführt. Jeder Thread hat eigene Register
Sicht des ProgrammsMan schreibt mit Blick auf die Vektorbreite. Intrinsics, Assembler oder automatische Vektorisierung des CompilersMan schreibt die Verarbeitung eines Threads als skalaren Code. Die Bündelung übernimmt die Hardware
ParallelitätsbreiteDurch die Registerbreite bestimmt. Beispiel: Bei 512 Bit sind es 16 Zahlen à 32 BitWarp-Breite (z. B. 32). Der ganze Chip hält gleichzeitig einige zehntausend Threads
VerzweigungenVerzweigungen pro Element sind nicht möglich. Beide Seiten werden berechnet und über eine Maske aus dem Vergleichsergebnis ausgewähltPro Thread möglich. Laufen sie im Warp auseinander, werden beide Pfade nacheinander ausgeführt und nicht betroffene Threads pausieren (Divergenz)
Verwaltung aktiver ElementeExplizit durch Programmierer oder Compiler mittels maskierter Befehle oder Blend-BefehleDie Hardware verwaltet die aktiven Threads automatisch
SpeicherzugriffStark beim gebündelten Lesen zusammenhängender Adressen. Verstreute Adressen werden mit Gather/Scatter-Befehlen behandelt, was langsam istJeder Thread kann Adressen frei angeben. Lesen benachbarte Threads benachbarte Adressen, werden die Zugriffe zusammengefasst (Coalescing)
Verbergen der SpeicherlatenzGroße Caches, Out-of-Order-Ausführung, PrefetchingWechsel zwischen vielen Warps: Während ein Warp wartet, läuft ein anderer
Einordnung in Flynns KlassifikationSIMD selbstEine Form von SIMD, die in Gestalt von Threads dargestellt wird
Typischer EinsatzCPU-Vektorbefehle. Schleifen in Bild- und Audioverarbeitung, Kryptografie, Matrixoperationen usw.GPU-Warps. Massiv parallele Berechnungen wie Grafik, KI-Training und -Inferenz sowie wissenschaftlich-technisches Rechnen

Die Zahlenwerte sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.

Wann welche Variante?

SIMD
Wenn auf der CPU Schleifen beschleunigt werden sollen, die für jedes Array-Element dieselbe Berechnung ausführen. Am wirksamsten bei zusammenhängend angeordneten Daten ohne Abhängigkeiten zwischen den Iterationen; auch über die automatische Vektorisierung des Compilers nutzbar.
SIMT
Massiv parallele Berechnungen, die dieselbe Verarbeitung auf Tausende bis Millionen unabhängiger Elemente anwenden. Auf der GPU schreibt und startet man ein Programm pro Thread. Die Effizienz steigt, wenn Verzweigungen und Speicheradressen innerhalb eines Warps einheitlich sind.
Kombination
In der GPU erfolgt die SIMT-Ausführung in Warp-Einheiten auf SIMD-Recheneinheiten. In Systemen mit CPU und GPU übernimmt die CPU-SIMD Vorverarbeitung und Steuerung, die GPU die großen parallelen Berechnungen.

Häufige Fragen

Ist SIMT ein völlig anderer Mechanismus als SIMD?

In der Hardware sind sie sich ähnlich. Jeder Thread eines Warps entspricht einer Lane der SIMD-Recheneinheit und läuft mit demselben Befehl. Der Unterschied liegt in der Darstellung: Bei SIMT verwaltet die Hardware Register, Adressen und Verzweigungen pro Thread, sodass Programmierer die Vektorbreite nicht beachten müssen.

Wie lässt sich Warp-Divergenz verringern?

Threads desselben Warps sollten möglichst dieselbe Seite einer Verzweigung nehmen. Möglich ist etwa, Daten so umzusortieren, dass die Bedingungsergebnisse einheitlich sind, Thread-Nummern so zuzuweisen, dass die Bedingung an Warp-Grenzen wechselt, oder kurze Verzweigungen durch Auswahloperationen zu ersetzen.

Wie schreibt man bei SIMD eine Verarbeitung mit if-Anweisung?

Man erzeugt mit Vergleichsbefehlen eine Maske der Bedingung pro Element, berechnet beide Ergebnisse und wählt sie dann elementweise gemäß der Maske aus. In Befehlssätzen mit maskierten Befehlen lassen sich nur die Elemente berechnen und speichern, die die Bedingung erfüllen. Da beide Pfade berechnet werden, sinkt die Effizienz bei aufwendigem Verzweigungsinhalt – ähnlich wie bei der Divergenz in SIMT.

Wann scheitert die automatische Vektorisierung des Compilers?

Etwa wenn Abhängigkeiten zwischen den Iterationen bestehen (ein Ergebnis wird in der nächsten Iteration verwendet), wenn Zeiger möglicherweise auf denselben Bereich zeigen, wenn die Daten nicht zusammenhängend angeordnet sind oder wenn die Schleife komplexe Verzweigungen oder Funktionsaufrufe enthält. Angaben, die dem Compiler die Abhängigkeitsfreiheit mitteilen, oder eine geänderte Datenanordnung können die Vektorisierung ermöglichen.

Verständnis prüfen

Welches Verfahren führt mit einem Befehl dieselbe Operation gleichzeitig auf mehreren Daten aus?

  1. ASISD
  2. BSIMD
  3. CMISD
Antwort und Erläuterung anzeigen

Antwort: B. SIMD

SIMD führt mit einem Befehl dieselbe Operation parallel auf mehreren Daten aus; ein 512-Bit-Register kann z. B. 16 Zahlen zu je 32 Bit auf einmal berechnen. Beispiele sind SSE und AVX bei x86 sowie NEON und SVE bei ARM; bei Bildverarbeitung, Videokompression und Matrixoperationen sind Beschleunigungen um ein Mehrfaches erzielbar. In der Flynnschen Klassifikation gibt es außerdem SISD (gewöhnliche sequenzielle Verarbeitung) und MIMD (Multicore).

Wie heißt bei NVIDIA-GPUs die Einheit, in der 32 Threads zu einem Bündel zusammengefasst werden und dieselbe Anweisung gleichzeitig ausführen?

  1. AWarp
  2. BGrid
  3. CPage
Antwort und Erläuterung anzeigen

Antwort: A. Warp

Die Threads eines Blocks werden in der Hardware in Warps zu je 32 Threads aufgeteilt, und die 32 Threads eines Warps führen dieselbe Anweisung gleichzeitig auf unterschiedlichen Daten aus. Diese Methode, als Threads geschriebene Programme in Bündeln mit derselben Anweisung auszuführen, heißt SIMT. Bei AMD-GPUs heißt eine ähnliche Einheit Wavefront und umfasst 64 oder 32 Threads. Grundsätzlich sollte die Blockgröße ein Vielfaches von 32 sein.

Welche Aussage zum Unterschied zwischen dem SIMT-Verfahren (Single Instruction, Multiple Threads) der GPU und SIMD-Befehlen der CPU ist richtig?

  1. ASIMT führt mehrere Anweisungen gleichzeitig auf einem Datum aus, SIMD wendet eine Anweisung auf ein Datum an
  2. BSIMT und SIMD sind genau dasselbe und unterscheiden sich nur im Namen
  3. CBei SIMT lässt sich jeder Thread als unabhängiges Programm schreiben, und die Hardware übernimmt auch Verzweigungen, während bei SIMD Programmierer oder Compiler explizit Vektorbefehle fester Breite verwenden
Antwort und Erläuterung anzeigen

Antwort: C. Bei SIMT lässt sich jeder Thread als unabhängiges Programm schreiben, und die Hardware übernimmt auch Verzweigungen, während bei SIMD Programmierer oder Compiler explizit Vektorbefehle fester Breite verwenden

Bei SIMD der CPU wird eine Anweisung auf ein Vektorregister angewendet, das z. B. 4 oder 8 Daten bündelt; das Programm wird daher mit Blick auf die Vektorbreite geschrieben. Bei SIMT der GPU schreibt der Programmierer die Verarbeitung eines einzelnen Threads ganz normal, und die Hardware bündelt je 32 Threads zur Ausführung mit derselben Anweisung. Threads dürfen verzweigen, und die Hardware führt die verzweigten Pfade nacheinander aus, wobei die Effizienz sinkt.

  1. Innerhalb eines Warps teilt sich durch eine bedingte Verzweigung eine Hälfte der Threads auf die if-Seite und die andere Hälfte auf die else-Seite auf (Warp Divergence). Wie wird dies im Allgemeinen ausgeführt?
  2. Welche Aussage zum Memory Coalescing der GPU ist richtig?
  3. Welche Befehlsart wird bei der automatischen Vektorisierung des Compilers verwendet?

Übungsfragen zu GPU-Programmierung

Wichtige Begriffe erklärt

SIMD
Abkürzung für Single Instruction, Multiple Data. Verfahren, bei dem ein einziger Befehl dieselbe Operation gleichzeitig auf mehreren Daten ausführt. Beschleunigt Bildverarbeitung und KI-Berechnungen.
SIMT
Verfahren mit einem Befehl und mehreren Threads. Programme werden pro Thread geschrieben, die Hardware bündelt die Threads jedoch zu Warps (bei NVIDIA 32 Threads) und führt sie mit demselben Befehl aus.
Warp Divergence
Phänomen, dass sich innerhalb eines Warps die Wege der Threads durch bedingte Verzweigungen trennen. Die getrennten Pfade werden nacheinander ausgeführt, wodurch die Effizienz sinkt.
Memory Coalescing
Zusammenfassen der Speicherzugriffe benachbarter Threads eines Warps auf benachbarte Adressen zu wenigen Zugriffen. Auch „zusammengefasster Zugriff“ genannt.
Vektorisierung
Optimierung, die gleiche Berechnungen je Element in einer Schleife mit SIMD-Befehlen für mehrere Elemente zusammenfasst. Voraussetzung ist, dass zwischen den Iterationen keine Datenabhängigkeit besteht.

Verwandte Vergleiche