Memory-Ausrichtung auf einem 32-bit-Intel-Prozessor
Intel 32-bit Prozessoren wie Pentium 64-bit breiten Datenbus und daher Holen 8 bytes pro Zugriff. Auf dieser Basis gehe ich davon aus, dass die physikalischen Adressen, die diese Prozessoren emittieren, die auf dem Adressbus sind immer ein Vielfaches von 8.
Erstens, ist diese Schlussfolgerung richtig?
Zweitens, wenn es richtig ist, dann sollte man das ausrichten der Struktur der Daten, die Mitglieder auf eine 8-byte-Grenze. Aber ich habe Menschen gesehen, die mit einem 4-byte-Ausrichtung statt, die auf diesen Prozessoren.
Wie können Sie begründet werden, das zu tun?
Ich habe keine Ahnung, was diese Frage bedeutet, aber ich bin fasziniert darüber, wie dies bezieht sich auf die Programmierung, und wie könnte dies Auswirkungen auf mich. Wo kann ich Lesen, bis eine grundlegende Einführung zu dieser low-level-Typ Zeug?
Siehe "Was Jeder Programmierer Wissen Sollte, Über das Gedächtnis": people.redhat.com/drepper/cpumemory.pdf
How do yo uget aus "angefordert liest sind immer ein Vielfaches von 8" auf "Ihre Daten sollten immer auf einer 8-byte-Grenze"? Ich sehe nicht, die logische Verbindung zwischen diesen. Solange die Daten nicht durch Kreuz ein 8-byte-Grenze, sind wir gut, sind wir nicht?
Siehe "Was Jeder Programmierer Wissen Sollte, Über das Gedächtnis": people.redhat.com/drepper/cpumemory.pdf
How do yo uget aus "angefordert liest sind immer ein Vielfaches von 8" auf "Ihre Daten sollten immer auf einer 8-byte-Grenze"? Ich sehe nicht, die logische Verbindung zwischen diesen. Solange die Daten nicht durch Kreuz ein 8-byte-Grenze, sind wir gut, sind wir nicht?
InformationsquelleAutor Frederick The Fool | 2009-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den üblichen Faustregel (direkt von Intel und AMD bei der Optimierung-Handbücher), die jeder Datentyp sein sollte angeglichen werden, durch seine eigene Größe. Ein
int32
sollte ausgerichtet sein auf ein 32-bit-Grenze, einint64
auf einem 64-bit-Grenze, und so weiter. Ein char passt ganz gut überall.Andere Faustregel ist, natürlich "der compiler gesagt hat, dass über die alignment-Anforderungen". Sie brauchen nicht zu befürchten, weil der compiler weiß, hinzufügen die richtige Polsterung und offsets zu ermöglichen effizienten Zugriff auf Daten.
Die einzige Ausnahme ist, wenn die Arbeit mit SIMD-Anweisungen, wo Sie haben, um manuell die Ausrichtung auf die meisten Compiler.
Sehe ich nicht, wie das einen Unterschied macht. Die CPU kann einfach einen Lesen Sie für die 64-bit-block, enthält die 4 bytes. Das bedeutet, dass es entweder bekommt 4 zusätzliche bytes, bevor die angeforderten Daten, oder nach. Aber in beiden Fällen dauert es nur einen einzigen gelesen. 32-bit-Ausrichtung des 32-bit-breiten Daten stellt sicher, dass Sie nicht überqueren Sie eine 64-bit-Grenze.
wie würde das passieren, wenn es ausgerichtet ist auf eine 4-byte-Grenze?
Ich kann nicht glauben ich verpasste diese einfache Argumentation. Warum vergeuden Sie 4 zusätzliche bytes in 8-byte-Ausrichtung, wenn Sie um die gleiche Leistung mit 4 byte? Dank Jalf. Sie machen absolut Sinn.
Ich habe eine andere Frage, auch bezüglich der Ausrichtung (in diesem Fall, über Worte, die Größe ist kleiner als die von der Architektur), und ich bin mir nicht sicher, ob die Argumentation wird in Ihrem Antwort-kann angewendet werden auf meine Frage: stackoverflow.com/questions/22820576/...
InformationsquelleAutor jalf
Physikalische bus ist 64bit breit ...Vielfaches von 8 --> ja
ALLERDINGS gibt es zwei weitere Faktor zu berücksichtigen:
Warum würde es erfordern zwei holt? Es würde einfach Anfrage alle Daten aus 0x000044440 zu 0x000044447, und da wir daran interessiert sind, 0x000044444-0x000044447, was ist das problem?
Warum redest Anweisungen Ausrichtung, das macht keinen Sinn. Polsterung Anweisungen, um einige Grenze mit NOPs für bringt nichts.
InformationsquelleAutor J-16 SDiZ
Sind Sie gerechtfertigt dies zu tun, weil die änderung auf 8-byte-Ausrichtung wäre eine ABI-änderung, und der marginale performance-Verbesserung ist nicht der Mühe Wert.
Wie schon jemand anderes sagte, cachelines Angelegenheit. Alle Zugriffe auf die tatsächliche Speicher-bus sind in Bezug auf die cache-Zeilen (64 bytes auf x86, IIRC). Siehe "Was jeder Programmierer muss wissen über das Gedächtnis" doc, wurde bereits erwähnt. So ist die tatsächliche Speicher-traffic ist 64 byte ausgerichtet.
InformationsquelleAutor janneb
Den 64 bit-bus auf den Sie sich beziehen-feeds die caches. Als eine CPU, immer Lesen und schreiben, die ganze cache-Zeilen. Die Größe einer cache-Zeile ist immer ein Vielfaches von 8, und seine körperliche Adresse ist in der Tat genau an 8-byte-offsets.
Cache-zu-register-Transfer verwenden Sie nicht die externe Datenbus, also die Breite, der bus ist irrelevant.
InformationsquelleAutor MSalters
Für random access und solange die Daten nicht falsch ausgerichtet (z.B. überqueren einer Grenze), ich glaube nicht, dass es darauf ankommt, viel; die richtige Adresse und offset in den Daten gefunden werden können, eine einfache UND konstruieren in der hardware. Es wird langsam, wenn ein Lesezugriff ist nicht ausreichend, um einen Wert aus. Das ist auch der Grund, weshalb Compiler in der Regel kleine Werte (Byte, etc.) zusammen, weil Sie nicht haben, um an einem bestimmten offset; shorts sollte auf selbst-Adressen, 32-bit auf 4-byte-Adressen und 64-bit-auf 8-byte-Adressen.
Beachten Sie, dass wenn Sie die Zwischenspeicherung involed und lineare Daten zugreifen, wird alles anders sein.
InformationsquelleAutor Lucero