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?
- ADie GPU teilt ihn automatisch in zwei Blöcke zu je 1024 Threads auf und führt sie aus
- BNur die ersten 1024 Threads werden ausgeführt, der Rest wird ignoriert
- 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.