PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [OpenCL/GPGPU] Maximum bzw. Mittelwert einer Menge von Floats berechnen


Nasenbaer
2012-07-10, 21:38:33
Moin,
ich will für einen Float-Buffer (ein Float-Image wäre genauso denkbar) das Maximum bzw. den Mittelwert seiner Elemente bestimmen. Eigentlich wäre es einfach indem man atomic_add() bzw. atomic_max() nutzt und das (Zwischen-)Ergebnis im globalen Speicher hält.
Allerdings funktionieren diese Befehle nur für Integer und es gibt kein äquivalent für Floats. Es wäre natürlich möglich sukzessive die Größe des Buffers/Images zu halbieren und jeder Thread speichert immer das maximum/average zweier benachbarter Werte in einem zweiten Buffer/Image. Irgendwann hat man nur noch zwei Werte und schwups hat man das Maximum/Average - und die Auslastung der GPU ist dennoch recht lange sehr hoch.

Allerdings find ich das ein bisschen aufwändig - nicht schwer aber man muss halt mehrere Kernel nacheinander "enqueue-en", was ich immer net so mag. Hat jemand ne alternative Idee?

Nighthawk13
2012-07-11, 13:43:40
"Reduction" lautet das Schlüsselwort zum googeln, da gibt es schon einige Ansätze zum optimieren:
- http://developer.amd.com/documentation/articles/Pages/OpenCL-Optimization-Case-Study-Simple-Reductions.aspx
- http://people.maths.ox.ac.uk/gilesm/cuda/prac4/reduction.pdf
- http://developer.apple.com/library/mac/#samplecode/OpenCL_Parallel_Reduction_Example/Introduction/Intro.html

Nasenbaer
2012-07-11, 15:19:33
Ah ok danke - das muss man natürlich erstmal wissen. Ich schaus mir gleich mal an. :)

Ectoplasma
2012-07-12, 17:36:52
Da gibt es noch den Trick mit einem Thread Local Storage. D.h, dass jeder Thread erst einmal für sich ein lokales Zwischnergebnis erstellt. Zum Schluss werden alle Zwischenergebnisse eingesammelt und daraus das Gesamtergebnis berechnet. Die Vorteil ist, das es null Locking und keine Deadlocks geben kann. Die Threads skalieren perfekt.

Nasenbaer
2012-07-12, 17:41:45
Ich glaub (kam noch nicht dazu es mir im Detail anzusehen), dass das bei dem verlinkten AMD Beispiel so in der Art gemacht wurde.
Ich hatte bisher immer nur das Problem, dass beim Festlegen einer work group size, ich den run time errror bekam, dass diese invalid wäre. Und das obwohl sie kleiner als das Maximum war. So richtig hab ich aber nie verstanden warum.