Forum: PC-Programmierung Mäanderförmige Array-Indizierung?


von Tom K. (ez81)


Lesenswert?

Hallo zusammen,

vor einiger Zeit habe ich mal etwas über einen Algorithmus gefunden, der
die Elemente in einem 2D-Array nicht nach der üblichen Methode a(x,y) = 
data[x + y * xmax] zeilenweise im Speicher anordnet, sonder eher 
mäanderartig. Ziel war es, dass der Prozesor-Cache beim durchlaufen des 
Arrays in x- und y-Richtung halbwegs gleichmäßig zuschlagen kann.
Ich sitze gerade an einem Problem, wo das eventuell helfen könnte, kann 
mich aber an den Namen nicht erinnern und meine Erinnerung ist zu 
nebulös zum gezielten Suchen. Hat jemand einen Suchbegriff?

Grüße,
Tom.

PS: Ja, es wird getestet und bei wenig Performance-Gewinn verworfen, 
ausprobiert haben will ich es aber trotzdem.

von Robert L. (lrlr)


Lesenswert?

>dass der Prozesor-Cache beim durchlaufen des
>Arrays in x- und y-Richtung halbwegs gleichmäßig zuschlagen kann.

dann vielleicht am einfachsten in "Blöcken" anlegen (also immer z.b. 
16x16)

die jeweilige Position sollte sich dann mit ein bisschen bit-schieben 
ermitteln lassen?

von Arc N. (arc)


Lesenswert?

Tom K. schrieb:
> Hallo zusammen,
>
> vor einiger Zeit habe ich mal etwas über einen Algorithmus gefunden, der
> die Elemente in einem 2D-Array nicht nach der üblichen Methode a(x,y) =
> data[x + y * xmax] zeilenweise im Speicher anordnet, sonder eher
> mäanderartig. Ziel war es, dass der Prozesor-Cache beim durchlaufen des
> Arrays in x- und y-Richtung halbwegs gleichmäßig zuschlagen kann.
> Ich sitze gerade an einem Problem, wo das eventuell helfen könnte, kann
> mich aber an den Namen nicht erinnern und meine Erinnerung ist zu
> nebulös zum gezielten Suchen. Hat jemand einen Suchbegriff?

Blocked | nonlinear | recursive array layout

Mäanderartig könnte dann das Hilbert Layout gewesen sein
http://www.cs.duke.edu/~alvy/papers/matrix-tpds.pdf
https://engineering.purdue.edu/~mithuna/pubs/ics99.pdf

von Tom K. (ez81)


Lesenswert?

Danke euch beiden! Hilbert und Morton waren die Namen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Tom K. schrieb:

> vor einiger Zeit habe ich mal etwas über einen Algorithmus gefunden, der
> die Elemente in einem 2D-Array nicht nach der üblichen Methode a(x,y) =
> data[x + y * xmax] zeilenweise im Speicher anordnet, sonder eher
> mäanderartig. Ziel war es, dass der Prozesor-Cache beim durchlaufen des
> Arrays in x- und y-Richtung halbwegs gleichmäßig zuschlagen kann.

Bevor du das von Hand machst: Compiler wie GCC versuchen, 
Maxrix-Operationen so umzusortieren, daß die Cache-Lokalität erhöht 
wird.

Um das zu erreichen, verwendet GCC zum Beispie CLooG, den "Chunky Loop 
Generator"

http://www.cloog.org/

Ziel ist wie gesagt, Matrix-Code zur Compilezeit so umzubauen, daß eine 
möglichst hohe Cache-Lokalität erreicht wird.

Vielleicht kann der Compiler die Optimierung ja schon von hause aus, und 
du musst garnix dazutun...

von ./. (Gast)


Lesenswert?

DSPs kennen für die FFT die bitreverse Adressierung.
Das dürfte auch recht mäanderförmig auf den Speicher zugreifen :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Naja, Ziel der Übung ist ja nicht ein möglichst schlechte 
Cache-Ausnutzung, sondern eine möglichst gute Cache-Nutzung wenn man in 
(Neben-)Diagonalen durch die Matrix geht.

von Tom K. (ez81)


Lesenswert?

bitreverse wäre allerdings als schlechteste Indizierung interessant, um 
den Effekt des Cachings zu vergleichen.

Ich will entlang von beliebig orientierten Geraden (Bresenham) und in 
Dreiecksflächen in die Matrix schreiben, deshalb wird der Compiler wohl 
leider nicht helfen können.

Wenn ich Zeit zum Probieren finde, werde ich die Ergebnisse hier posten.

von Robert L. (lrlr)


Lesenswert?

nachdem es um eine PC geht
(und um irgendwas "grafik ähnliches")

und es aus irgend einem grund "schnell" gehen muss

wäre die GPU vermutlich besser geeignet..(immerhin ist die dazu da: 
Hardware unterstütztes zeichnen gibt es ja schon seit Turbo-pascal 
zeiten..)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.