Ich habe eine Anwendung, wo ich brauche die durchschnittliche Intensität eines Bildes für etwa 1 Million Bilder. Es fühlt sich an wie ein Job für einen GPU-Fragment-Shader, aber Fragment-Shader sind für lokale Berechnungen pro Pixel, während die Bildmittelung eine globale Operation ist.Summen Bild Intensitäten in GPU
Ein Ansatz, den ich in Betracht gezogen habe, ist das Laden des Bildes in eine Textur, Anwenden einer 2x2 Box-Unschärfe, Laden des Ergebnisses zurück in eine N/2 x N/2 Textur und Wiederholen, bis die Ausgabe 1x1 ist. Dies würde jedoch Log-Anwendungen des Shaders erfordern.
Gibt es eine Möglichkeit, dies in einem Durchgang zu tun? Oder sollte ich einfach CUDA/OpenCL verwenden?
Meine Anwendung führt Fasenabgleich eines projizierten 3D-Modells mit einem Eingabebild durch. Ich rendere ein Bild, das die Silhouettenkanten meines Modells enthält, und für jedes Kantenpixel verwende ich eine Nachschlagetabelle, um das nächste Kantenpixel im Eingabebild zu finden. Dann brauche ich das Durchschnittsergebnis, das mir gut sagt, dass das Modell zu den Daten passt. Ich habe versucht, die gerenderten Kantenpixel von opengl zu lesen und Fasenabgleich auf der CPU durchzuführen, aber die Leseoperation war ein großer Flaschenhals.Ich hatte gehofft, dass ich eine große Beschleunigung bekommen würde, wenn ich die ganze Sache auf der GPU machen und nur einen Wert einlesen würde. –
(ctd) Da ich die Lookup-Tabelle als Textur übergeben kann, kann ich die Lookups in einem Vertex-Shader tun, aber ich habe immer noch den Engpass beim Lesen der Daten zurück in den Hauptspeicher. –
Nichts zwingt Sie zu Unschärfe 2x2, - Sie könnten zum Beispiel mit 16x16 Box verwischen und danach in N/16 x N/16 Textur laden. Auf diese Weise können Sie große Beschleunigungs- und weniger Kopiervorgänge erreichen ... –