GPU-Programmierung

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?

  1. AatomicAdd weglassen und mit normaler Addition in den Global Memory schreiben
  2. BDie Zahl der Bins auf eins zusammenfassen
  3. CPro Block ein Teilhistogramm im Shared Memory erstellen und es am Ende gesammelt auf die Bins im Global Memory addieren
Antwort und Erläuterung anzeigen

Antwort: C. Pro Block ein Teilhistogramm im Shared Memory erstellen und es am Ende gesammelt auf die Bins im Global Memory addieren

Führen viele Threads gleichzeitig atomicAdd auf dasselbe Bin aus, werden die Aktualisierungen nacheinander abgearbeitet, und da der Global Memory langsam ist, werden die Wartezeiten lang. Hat jeder Block ein eigenes Histogramm im Shared Memory, zählt dort und addiert erst am Ende einmal auf das globale, sinkt die Zahl der Konflikte im langsamen Speicher auf Blockzahl × Bin-Zahl. Atomare Operationen im Shared Memory sind viel schneller.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu GPU-Programmierung

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

Vergleiche zu diesem Thema