5 Punkte von GN⁺ 2023-10-22 | 1 Kommentare | Auf WhatsApp teilen
  • Ein grundlegendes Verständnis von GPU-Computing ist für alle Softwareingenieure unerlässlich.
  • Dieser Artikel konzentriert sich hauptsächlich auf Nvidia-GPUs und verwendet die Terminologie von Nvidia.
  • GPUs sind für massive Parallelverarbeitung und hohen Durchsatz konzipiert, etwa bei Grafik, numerischen Berechnungen und Deep Learning.

Vergleich von CPU und GPU

  • CPUs sind für die sequenzielle Ausführung von Anweisungen ausgelegt und enthalten verschiedene Funktionen zur Verringerung der Latenz bei der Befehlsausführung.
  • GPUs sind für massive Parallelverarbeitung und hohen Durchsatz ausgelegt und weisen eine mittlere bis hohe Latenz bei der Befehlsausführung auf.
  • GPUs können weitaus mehr Operationen als CPUs in deutlich kürzerer Zeit verarbeiten.

# GPU-Architektur

GPU-Compute-Architektur

  • Eine GPU besteht aus einem Array von Streaming Multiprocessors (SMs).
  • Jeder SM enthält mehrere Streaming-Prozessoren (Kerne oder Threads).
  • Ein SM verfügt über eine begrenzte Menge an On-Chip-Speicher (Shared Memory oder Scratchpad), der von allen Kernen gemeinsam genutzt wird.

GPU-Speicherarchitektur

  • Eine GPU besitzt mehrere Ebenen unterschiedlicher Speichertypen.
  • Jeder SM verfügt über eine große Anzahl von Registern, die zwischen den Kernen gemeinsam genutzt werden.
  • Der Constant Cache wird zum Zwischenspeichern konstanter Daten verwendet, die bei der Codeausführung benötigt werden.
  • Shared Memory ist ein schneller programmierbarer On-Chip-SRAM mit geringer Latenz.
  • Der L1-Cache speichert häufig genutzte Daten aus dem L2-Cache zwischen.
  • Der L2-Cache wird von allen SMs gemeinsam genutzt und speichert häufig genutzte Daten aus dem globalen Speicher zwischen.
  • Global Memory ist ein DRAM mit hoher Kapazität und hoher Bandbreite, der weit von den SMs entfernt liegt und daher eine hohe Latenz aufweist.

# Das Ausführungsmodell von GPUs verstehen

Kurze Einführung in CUDA-Kernel und Thread-Blöcke

  • CUDA ist eine Programmierschnittstelle zum Schreiben von Programmen für Nvidia-GPUs.
  • Ein Kernel ist eine Berechnung, die in einer Form ausgedrückt wird, die einer C/C++-Funktion ähnelt und parallel auf der GPU ausgeführt wird.
  • Für die Ausführung eines Kernels wird eine Anzahl von Threads gestartet, die als Grid bezeichnet wird.

Schritte der Kernel-Ausführung auf der GPU

  1. Daten vom Host auf das Device kopieren
  2. Thread-Blöcke auf SMs planen
  3. Single Instruction, Multiple Threads (SIMT) und Warps
  4. Warp-Scheduling und Tolerierung von Latenz
  5. Ergebnisdaten vom Device zurück in den Host-Speicher kopieren

# Konzepte von Ressourcenaufteilung und Occupancy

  • Die Auslastung der GPU-Ressourcen wird mit der Kennzahl „Occupancy“ gemessen; sie bezeichnet das Verhältnis der zugewiesenen Warps zur maximalen Anzahl an Warps, die ein SM unterstützen kann.
  • Die Occupancy wird durch die Ausführungsressourcen eines SM, Register, Shared Memory, Thread-Block-Slots und Thread-Slots begrenzt.
  • Es ist wichtig, durch Code-Optimierung eine hohe Occupancy aufrechtzuerhalten und gleichzeitig die Latenz zu minimieren.

# Zusammenfassung

  • Eine GPU besteht aus mehreren SMs, und jeder SM besitzt mehrere Verarbeitungskerne.
  • Global Memory befindet sich weit entfernt auf dem Chip und hat eine hohe Latenz.
  • L1- und L2-Caches arbeiten ähnlich wie die L1/L2-Caches einer CPU.
  • Jeder SM verfügt über Shared Memory, das zwischen den Kernen gemeinsam genutzt wird.
  • Um einen Kernel auf der GPU auszuführen, wird ein Grid aus Threads gestartet.
  • Die GPU weist SMs Blöcke zur Ausführung zu, und alle Threads laufen auf demselben SM.
  • Die einem SM zugewiesenen Threads werden zusätzlich in Gruppen von 32 zusammengefasst, die als Warps bezeichnet werden.
  • Die GPU führt eine dynamische Ressourcenaufteilung zwischen Threads durch, abhängig von den Anforderungen der Threads und den Grenzen des SM.

# Fazit

  • GPUs werden heute breit eingesetzt, und ihre Architektur sowie ihr Ausführungsmodell unterscheiden sich grundlegend von CPUs.
  • Dieser Artikel behandelt verschiedene Aspekte von GPUs und vermittelt Einblicke darin, warum GPUs so breit eingesetzt werden und wie sie funktionieren.

Meinung von GN⁺

  • GPUs sind eine unverzichtbare Technologie für Deep Learning und komplexe numerische Berechnungen, und dieser Artikel hilft dabei, die grundlegende Architektur und das Ausführungsmodell von GPUs zu verstehen.
  • Er enthält besonders wichtige Inhalte für Einsteiger unter Softwareingenieuren, die sich für Parallelverarbeitung und High-Performance Computing interessieren.
  • Der Artikel vermittelt grundlegendes Wissen über GPU-Programmierung und ist eine interessante Lektüre, die die Neugier auf dieses Gebiet weckt.

1 Kommentare

 
GN⁺ 2023-10-22
Hacker-News-Kommentare
  • Dieser Artikel steht in der Kritik, weil er stark auf Nvidia fokussiert ist und andere valide Alternativen wie Sycl, Sapphire Rapids und AMDs MI300 ignoriert.
  • Es wird angemerkt, dass ein Hinweis auf asynchrone Kopien fehlt, die verhindern, dass die GPU während der Datenübertragung untätig bleibt.
  • Der Artikel wird als gute Einführung in die GPU-Programmierung gelobt, zugleich wird angeregt, auch fortgeschrittenere Techniken zu behandeln.
  • Einige Leser stellen die Genauigkeit der Behauptung des Artikels infrage, dass Littles Gesetz aus der Warteschlangentheorie auf GPUs anwendbar sei.
  • Die Erklärung des Artikels zur Speicherarchitektur wird dafür kritisiert, nicht zu erwähnen, dass Caches keine Kohärenzgarantie zwischen Threads bieten.
  • Es gibt den Vorschlag, GPUs in PPU (Parallel Processing Units) umzubenennen, um ihre Fähigkeiten besser widerzuspiegeln.
  • Der Artikel wird als eine der besseren Erklärungen zur GPU-Programmierung gelobt und für den Einsatz im Mentoring empfohlen.
  • SIMD-Programmierung wird als „wild“ beschrieben: einfache Berechnungen für alle Pixel sind möglich, bei Verzweigungsbedingungen wird es jedoch schwierig.
  • Es wird die Frage nach der Effizienz aufgeworfen, GPUs für bestimmte Array-Berechnungen zu verwenden, wobei die Notwendigkeit berücksichtigt wird, Daten zur GPU zu übertragen und wieder von ihr zurückzuholen.