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?

  1. A__syncthreads() aufrufen
  2. BDen Kernel an dieser Stelle in zwei teilen und den zweiten starten, nachdem der erste beendet ist
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Beim Erstellen eines Histogramms von Pixelwerten auf der GPU kann es langsam sein, wenn alle Threads direkt mit atomicAdd auf die 256 Bins im Global Memory addieren. Welche Verbesserung ist richtig?
  2. Warum wird beim Berechnen der Summe vieler Werte auf der GPU eine baumförmige Reduktion verwendet (wiederholtes Addieren benachbarter Werte, wobei sich die Zahl halbiert)?
  3. Wie viele Stufen sind nötig, wenn 1024 Werte mit einer baumförmigen Reduktion summiert werden?
  4. Was gilt im Allgemeinen für CPU-seitigen und GPU-seitigen Speicher bei einem Programm, das eine einzelne diskrete GPU nutzt?
  5. Bei einer leichten Verarbeitung, die jedes Array-Element nur einmal addiert, kann das Senden der Daten an die GPU langsamer sein als die Berechnung auf der CPU. Was ist der Hauptgrund?

Vergleiche zu diesem Thema