GPU-Programmierung

Auf einer GPU mit einer Obergrenze von 1024 Threads pro Thread-Block wird ein CUDA-Kernel mit blockDim.x = 2048 gestartet. Was passiert im Allgemeinen?

  1. ADie GPU teilt ihn automatisch in zwei Blöcke zu je 1024 Threads auf und führt sie aus
  2. BNur die ersten 1024 Threads werden ausgeführt, der Rest wird ignoriert
  3. CDie Startkonfiguration wird als ungültig behandelt, der Kernel wird nicht ausgeführt und ein Fehler zurückgegeben
Antwort und Erläuterung anzeigen

Antwort: C. Die Startkonfiguration wird als ungültig behandelt, der Kernel wird nicht ausgeführt und ein Fehler zurückgegeben

Alle Threads in einem Thread-Block müssen gleichzeitig auf einem SM liegen und über Shared Memory und __syncthreads() zusammenarbeiten können, daher ist die Zahl der Threads pro Block begrenzt. Wird ein Kernel mit einer Konfiguration über der Grenze gestartet, läuft kein einziger Thread, und der Start schlägt mit einem Fehler fehl, der eine ungültige Konfiguration meldet. Da ein Kernel-Start keinen Wert zurückgibt, übersieht man leicht, dass das Array mit den Ergebnissen nie aktualisiert wurde, wenn der Fehler nicht mit cudaGetLastError() o. Ä. geprüft wird. Die Arbeit für 2048 Threads wird auf mehrere Blöcke mit höchstens 1024 Threads verteilt.

Dieses Thema üben Zur Themenseite

Passende Rechner

Weitere Fragen zu GPU-Programmierung

  1. Ein SM einer GPU habe eine Ausgabeeinheit, die pro Zyklus Befehle eines Warps ausgeben kann. Jeder Warp gibt wiederholt 20 Zyklen lang Befehle aus und wartet dann 400 Zyklen auf das Ergebnis eines Speicherladevorgangs. Wie viele Warps sind mindestens nötig, um Leerlauf durch Speicherwartezeiten zu vermeiden (Latenzverdeckung), wenn der Warp-Wechsel keine Zeit kostet?
  2. Welche Aussage zum Unterschied in der Entwurfsphilosophie von CPU und GPU ist richtig?
  3. Welches Merkmal beschreibt Aufgaben, die sich auf der GPU schnell verarbeiten lassen, am besten?
  4. Welche Verarbeitung läuft auf der GPU tendenziell ineffizient?
  5. Welche Aussage zum „Kernel“ in der GPU-Programmierung, etwa mit CUDA, ist richtig?

Vergleiche zu diesem Thema