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?
- ADie Synchronisation gelingt allein mit den 16 Threads, und es funktioniert korrekt
- BDa die anderen Threads nie ankommen, bleibt der Block hängen, oder das Ergebnis ist unbestimmt
- 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.