GPU-Programmierung

In CUDA wurde __syncthreads() innerhalb von „if (threadIdx.x < 16)“ geschrieben, sodass nur ein Teil der Threads es durchläuft. Was kann geschehen?

  1. ADie Synchronisation gelingt allein mit den 16 Threads, und es funktioniert korrekt
  2. BDa die anderen Threads nie ankommen, bleibt der Block hängen, oder das Ergebnis ist unbestimmt
  3. C__syncthreads() wird automatisch ignoriert, es passiert nichts
Antwort und Erläuterung anzeigen

Antwort: B. Da die anderen Threads nie ankommen, bleibt der Block hängen, oder das Ergebnis ist unbestimmt

__syncthreads() wartet auf das Eintreffen aller Threads des Blocks; steht es in einer Verzweigung, die nur ein Teil der Threads durchläuft, warten diese auf Threads, die nie kommen. Das Verhalten ist laut Spezifikation nicht definiert: In der Praxis bleibt das Programm hängen, oder es liefert, selbst wenn es zufällig läuft, falsche Ergebnisse. Grundsatz ist, die Synchronisation außerhalb von Verzweigungen an einer Stelle zu schreiben, die alle Threads sicher durchlaufen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Welche Aussage zum Bank Conflict im Shared Memory von CUDA ist richtig?
  2. Eine 32×32-float-Tabelle liegt im Shared Memory, und die 32 Threads eines Warps lesen in Spaltenrichtung (vertikal), wodurch Bank Conflicts entstehen. Welche Gegenmaßnahme ist üblich?
  3. Warum wird beim Berechnen eines großen Matrixprodukts auf der GPU die Matrix in kleine Tiles unterteilt und in den Shared Memory geladen?
  4. Was kann in einem GPU-Kernel geschehen, wenn jeder Thread zu viele Register verwendet?
  5. Welche Aussage zur Auslastung (Occupancy) der GPU ist richtig?

Vergleiche zu diesem Thema