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