GPU-Programmierung

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)?

  1. AWeil die Zahl der Additionen gegenüber einem einzelnen, der Reihe nach addierenden Thread stark sinkt
  2. BWeil in jeder Stufe viele Threads gleichzeitig addieren können und n Werte in log2 n Stufen summiert werden
  3. CWeil der Gleitkommafehler stets 0 wird
Antwort und Erläuterung anzeigen

Antwort: B. Weil in jeder Stufe viele Threads gleichzeitig addieren können und n Werte in log2 n Stufen summiert werden

Addiert ein einzelner Thread der Reihe nach, sind n-1 Schritte nötig; in Baumform addieren in der ersten Stufe n/2 Threads benachbarte Werte, in der zweiten n/4 usw., und nach log2 n Stufen ist die Summe fertig. Die Gesamtzahl der Additionen bleibt gleich, doch wegen der wenigen Stufen lässt sich parallel schnell rechnen. Innerhalb eines Blocks wird stufenweise im Shared Memory gerechnet, und die Ergebnisse der Blöcke werden zum Schluss zusammengefasst.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

  1. Wie viele Stufen sind nötig, wenn 1024 Werte mit einer baumförmigen Reduktion summiert werden?
  2. Was gilt im Allgemeinen für CPU-seitigen und GPU-seitigen Speicher bei einem Programm, das eine einzelne diskrete GPU nutzt?
  3. 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?
  4. Warum wird die Übertragung schneller, wenn CPU-Speicher fixiert (Page-Locked) und dann auf die GPU übertragen wird?
  5. Was ist der Hauptzweck der Verwendung mehrerer CUDA-Streams?

Vergleiche zu diesem Thema