Mäanderförmige Array-Indizierung?

OP #2570038
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.
#2570050
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?
#2570140
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
Persönliche Seite #2571322
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...
OP #2573576
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.