Diskussion:Codeoptimierung — Änderungen 9474 → 9475

Zeile 25: Zeile 25:
 
:::Stimmt, es sollten natürlich 64 Bytes sein :) Und die Größe der Elemente stand doch gar nicht zur Debatte, oder? Aber von mir aus können wir auch gerne so einen Hinweis über den Artikel setzen, dass "der Autor sich nicht besonders auskannte" (wie bei [[USB]]) oder irgendjemand liest sich die obige Anleitung einfach mal richtig durch und verbessert den Artikel entsprechend.--[[Benutzer:Bjork|Bjork]] 16:24, 6. Feb. 2011 (CET)
 
:::Stimmt, es sollten natürlich 64 Bytes sein :) Und die Größe der Elemente stand doch gar nicht zur Debatte, oder? Aber von mir aus können wir auch gerne so einen Hinweis über den Artikel setzen, dass "der Autor sich nicht besonders auskannte" (wie bei [[USB]]) oder irgendjemand liest sich die obige Anleitung einfach mal richtig durch und verbessert den Artikel entsprechend.--[[Benutzer:Bjork|Bjork]] 16:24, 6. Feb. 2011 (CET)
 
::Dass Speicherzugriffe keine 64-Byte-Grenze überschreiten sollen, bedeutet effektiv, dass alle Daten auf ihr natürliches Alignment ausgerichtet sein sollen. Also 4-Byte-Wörter auf 4-Byte-Grenzen, und 8-Byte-Wörter auf 8-Byte-Grenzen. Etwas Aufmerksamkeit ist lediglich erforderlich, wenn man 8-Byte-Zugriffe mit 4-Byte-Zugriffen mischt. Wenn ein 4-Byte-Wort auf einer 8-Byte-Grenze ausgerichtet ist, sollte man darauf achten, dass entweder Padding auf eine 8-Byte-Grenze oder ein weiteres 4-Byte-Wort folgt. Für Stackzugriffe wird (vom Compiler) immer die Variante Padding verwendet, für structs hat man das selbst oder der Compiler in der Hand. Das 16-Byte-Alignment ist soweit ich weiß eine ABI-Konvention, und keine Optimierung. --[[Benutzer:Jidder|Jidder]] 16:43, 6. Feb. 2011 (CET)
 
::Dass Speicherzugriffe keine 64-Byte-Grenze überschreiten sollen, bedeutet effektiv, dass alle Daten auf ihr natürliches Alignment ausgerichtet sein sollen. Also 4-Byte-Wörter auf 4-Byte-Grenzen, und 8-Byte-Wörter auf 8-Byte-Grenzen. Etwas Aufmerksamkeit ist lediglich erforderlich, wenn man 8-Byte-Zugriffe mit 4-Byte-Zugriffen mischt. Wenn ein 4-Byte-Wort auf einer 8-Byte-Grenze ausgerichtet ist, sollte man darauf achten, dass entweder Padding auf eine 8-Byte-Grenze oder ein weiteres 4-Byte-Wort folgt. Für Stackzugriffe wird (vom Compiler) immer die Variante Padding verwendet, für structs hat man das selbst oder der Compiler in der Hand. Das 16-Byte-Alignment ist soweit ich weiß eine ABI-Konvention, und keine Optimierung. --[[Benutzer:Jidder|Jidder]] 16:43, 6. Feb. 2011 (CET)
 +
:::Das 16Byte Alignment ist afaik aber auch erst mit x86-64 eine ABI-Konvention. Zumindest habe ich es in dem Zusammenhang das erste Mal gelesen.--[[Benutzer:Bluecode|Bluecode]] 19:02, 6. Feb. 2011 (CET)
 
::Das mit dem natürlichen Aligment ist auf jeden Fall richtig. Das der Stack (beim betreten und verlassen einer Funktion) möglichst auf 16Bytes ausgerichtet sein soll hat eher den Grund das der Compiler sich drauf verlassen kann das wenn er z.B. ein Struct das SSE-Typen enthält dort ablegt das auch auf die möglichst ausgerichtet zugegriffen werden kann. Außerdem erhöht sich damit die Wahrscheinlichkeit das nebeneinander liegende Variablen auf dem Stack auch die selbe Cache-Line teilen, also wenn der Compiler 2 int64_t-Variablen passend ausgerichtet (in Relation zum Stack-Pointer bei Funktionseintritt) auf den Stack legt dann liegen die auch immer beide in der selben Cache-Line wenn der Stack-Pointer beim Funktionseintritt wirklich ausgerichtet war.--[[Benutzer:Erik.vikinger|Erik.vikinger]] 17:09, 6. Feb. 2011 (CET)
 
::Das mit dem natürlichen Aligment ist auf jeden Fall richtig. Das der Stack (beim betreten und verlassen einer Funktion) möglichst auf 16Bytes ausgerichtet sein soll hat eher den Grund das der Compiler sich drauf verlassen kann das wenn er z.B. ein Struct das SSE-Typen enthält dort ablegt das auch auf die möglichst ausgerichtet zugegriffen werden kann. Außerdem erhöht sich damit die Wahrscheinlichkeit das nebeneinander liegende Variablen auf dem Stack auch die selbe Cache-Line teilen, also wenn der Compiler 2 int64_t-Variablen passend ausgerichtet (in Relation zum Stack-Pointer bei Funktionseintritt) auf den Stack legt dann liegen die auch immer beide in der selben Cache-Line wenn der Stack-Pointer beim Funktionseintritt wirklich ausgerichtet war.--[[Benutzer:Erik.vikinger|Erik.vikinger]] 17:09, 6. Feb. 2011 (CET)