GPU-Programmierung

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?

  1. ABeide Seiten werden gleichzeitig ausgeführt, die Geschwindigkeit ändert sich nicht
  2. BDie Threads der else-Seite werden nicht ausgeführt und verworfen
  3. Cif-Seite und else-Seite werden nacheinander ausgeführt, wobei die jeweils nicht betroffenen Threads pausieren, sodass die Effizienz sinkt
Antwort und Erläuterung anzeigen

Antwort: C. if-Seite und else-Seite werden nacheinander ausgeführt, wobei die jeweils nicht betroffenen Threads pausieren, sodass die Effizienz sinkt

Die 32 Threads eines Warps führen dieselbe Anweisung aus; bei einer Verzweigung werden zunächst die Anweisungen der if-Seite nur für die Threads der if-Seite aktiv ausgeführt und dann die else-Seite für die übrigen Threads. Das Ergebnis ist korrekt, doch da jeweils die Hälfte der Threads nichts tut, ergibt sich als Zeit die Summe beider Pfade. Die Effizienz steigt, wenn Daten und Thread-Anordnung so gewählt werden, dass die Verzweigungen innerhalb eines Warps übereinstimmen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Beide Varianten (1) und (2) oben lassen eine Hälfte der Threads A und die andere Hälfte B ausführen. Welche Aussage zur Warp-Effizienz ist richtig (ein Warp habe 32 Threads)?
  2. Welche Aussage zum Memory Coalescing der GPU ist richtig?
  3. Wird, wie oben gezeigt, mit der Thread-Nummer i ein Array in Abständen von 32 Elementen gelesen, ist dies langsamer als das Lesen von a[i]. Was ist der Hauptgrund?
  4. Welche Anordnung ist unter dem Gesichtspunkt des Memory Coalescing vorteilhaft, wenn Daten mit den Partikelpositionen x, y, z auf der GPU verarbeitet werden?
  5. Welche Aussage zum Shared Memory von CUDA ist richtig?

Vergleiche zu diesem Thema