GPU-Programmierung
In CUDA soll mitten im Kernel gewartet werden, bis die Berechnung aller anderen Blöcke abgeschlossen ist, bevor die nächste Phase beginnt. Welche Methode ist üblich?
- A__syncthreads() aufrufen
- BDen Kernel an dieser Stelle in zwei teilen und den zweiten starten, nachdem der erste beendet ist
- CIn einer Schleife auf ein von anderen Blöcken geschriebenes Flag warten
Antwort und Erläuterung anzeigen
Antwort: B. Den Kernel an dieser Stelle in zwei teilen und den zweiten starten, nachdem der erste beendet ist
Blöcke werden unabhängig und in beliebiger Reihenfolge ausgeführt; es ist daher nicht gesichert, dass alle Blöcke gleichzeitig auf der GPU platziert sind. Hat der Block, auf den gewartet wird, noch nicht begonnen, endet die Schleife, die auf das Flag wartet, nie. Üblich ist deshalb, die Eigenschaft zu nutzen, dass im selben Stream gestartete Kernel erst nach Ende des vorherigen beginnen, und die Gesamtsynchronisation durch Aufteilen des Kernels herzustellen.