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?
- AatomicAdd weglassen und mit normaler Addition in den Global Memory schreiben
- BDie Zahl der Bins auf eins zusammenfassen
- 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.