Soll bei dieser Berechnung wirklich auf bereits verarbeitete Daten basiert werden? Ich spare mir gerade die Theorie dazu anzulesen, aber meistens sollte ein Durchgang auf einer Matrix auch komplett auf den Ursprungswerten erfolgen. Mal am Beispiel einer Weichzeichnung mit 3x3 Kernel á 1/9 (an den Rändern geclipped):
Code:
1.0 1.0 3.0
2.0 4.0 1.0
4.0 4.0 1.0
5.0 2.0 1.0
Spalte 1 von oben nach unten berechnen:
Code:
2.0 1.0 3.0
2.8 4.0 1.0
3.6 4.0 1.0
3.7 2.0 1.0
Spalte 2:
Code:
2.0 2.3 3.0
2.8 2.6 1.0
3.6 2.4 1.0
3.7 2.3 1.0
Spalte 3 spare ich mir mal. Eigentlich sollten sich hier aber alle Operationen auf die erste Matrix, und nur die beziehen:
Richtige Gesamtlösung:
Code:
2.0 2.0 2.3
2.6 2.3 2.3
3.5 2.7 2.2
3.8 2.8 2.0
Man würde also 2 Arrays brauchen: Eines aus dem gelesen wird, und eines in das die Ergebnisse kommen. Wenn mehrere Iterationen nötig sind, macht man im Folgeschritt einfach das Schreib-Array zum neuen Lese-Array. Dieser Weg hätte vor allem den riesen Vorteil, dass ruhig beliebig viele Threads auf dem Lese-Array wahlfrei lesen können, es muss nur sicher gestellt werden dass jeder Thread einen ganz eigenen Bereich im Schreib-Array bekommt. Keinerlei Synchronisierung nötig, abgesehen vom Fertig-Zeitpunkt aller Threads nach einem Durchgang. Dadurch wäre das ganze sogar so fein parallelisierbar, dass man eine GPU mit der Aufgabe betrauen könnte, und erschreckend große Performancegewinne hätte. (Defacto könnte für jeden Wert im Zielarray je ein Thread arbeiten, wenn dies für die Hardware günstig wäre.)
So kenne ich zumindest die meisten iterativen Verfahren auf Matrizen, sonst würden einem ja die Teilergebnisse einer Spalte/Zeile in die Basisdaten für die nächste "hinein bluten". (Was gewünscht sein könnte, aber eher selten ist. Daher frage ich so genau nach.) In 3D-Matrizen verhält sich das natürlich alles genau so.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)