Frage

Intels 32-Bit-Prozessoren wie Pentium haben 64-Bit breiten Datenbus und holen somit 8 Byte pro Zugriff. Auf dieser Basis gehe ich davon aus, dass die physikalischen Adressen, die diese Prozessoren auf dem Adreßbus emittieren, sind immer ein Vielfaches von 8.

Zum einen ist diese Schlussfolgerung richtig?

Zweitens, wenn es richtig ist, dann sollte ein Datenstrukturelement auf einer 8-Byte-Grenze auszurichten. mit einer 4-Byte-Ausrichtung statt auf diesen Prozessoren Aber ich habe Menschen gesehen.

Wie können sie dabei zu rechtfertigen?

War es hilfreich?

Lösung

Die übliche Faustregel gilt: (gerade von Intel und Optimierung Handbücher AMD) ist, dass sollte jeder Datentyp durch seine eigene Größe ausgerichtet werden. Ein int32 sollte auf einer 32-Bit-Grenze ausgerichtet wird, wobei ein int64 auf einer 64-Bit-Grenze, und so weiter. Ein char passt einfach überall gut.

Eine weitere Faustregel gilt: ist natürlich „der Compiler wurde über Ausrichtungsanforderungen gesagt“. Sie brauchen nicht zu kümmern, da die Compiler die richtige Polsterung und Offsets hinzufügen kennen effizienten Zugriff auf Daten zu ermöglichen.

Die einzige Ausnahme ist, wenn sie mit SIMD-Befehle arbeiten, in dem Sie manuell müssen Ausrichtung auf die meisten Compiler gewährleisten.

  

Zweitens, wenn es richtig ist, dann ein   sollten Datenstrukturelemente ausgerichtet auf   Eine 8-Byte-Grenze. Aber ich habe gesehen,   Menschen eine 4-Byte-Ausrichtung unter Verwendung von   stattdessen auf diesen Prozessoren.

Ich sehe nicht, wie das einen Unterschied macht. Die CPU kann einfach Ausgabe zu einem Auslesevorgang für den 64-Bit-Block, der dieses 4 Bytes enthält. Das bedeutet, dass es entweder bekommt 4 zusätzliche Bytes, bevor die angeforderten Daten oder danach. Aber in beiden Fällen dauert es nur einen einzigen Lese. 32-Bit-Ausrichtung von 32 Bit breiten Daten wird sichergestellt, dass es nicht eine 64-Bit-Grenze überqueren.

Andere Tipps

Physical Bus ist 64 Bit breit ... Vielfaches von 8 -> ja

Es gibt aber noch zwei weitere Faktoren zu berücksichtigen:

  1. Einige x86-Befehlssatz sind Byte adressiert. Einige sind 32-Bit ausgerichtet (das ist, warum Sie 4 Byte Sache haben). Aber nein (Kern) Instruktion ist 64bits ausgerichtet ist. Die CPU kann falsch ausgerichteten Datenzugriff behandeln.
  2. Wenn Sie über die Leistung kümmern, sollten Sie über die Cache-Zeile denken, nicht Hauptspeicher. Cache-Zeilen sind viel breiter.

Sie sind dabei gerechtfertigt, weil Wechsel auf 8-Byte-Ausrichtung eine ABI Änderung darstellen würde, und die marginale Leistungssteigerung ist nicht die Mühe wert.

Wie schon jemand sagte, Cache-Lines Materie. Alle Zugriffe auf dem tatsächlichen Speicherbusses sind in Bezug auf die Cache-Zeilen (64 Bytes auf x86, IIRC). Siehe die doc „Was jeder Programmierer über das Gedächtnis wissen muss“, die bereits erwähnt wurden. So dass der tatsächliche Speicherverkehr 64 Byte ausgerichtet ist.

Für Direktzugriff und solange die Daten nicht richtig ausgerichtet sind (zum Beispiel eine Grenzüberschreitung), ich glaube nicht, dass es darauf ankommt, viel; die richtige Adresse und in den Offset-Daten kann mit einem einfachen und konstruiert in Hardware. Es wird langsam, wenn ein Lesezugriff nicht ausreichend ist, einen Wert zu erhalten. Das ist auch, warum Compiler in der Regel kleine Werte setzen (Bytes etc.) zusammen, weil sie zu einem bestimmten sein müssen nicht versetzt; Shorts auf geraden Adressen sein sollten, 32-Bit auf 4-Byte-Adressen und 64-Bit auf 8-Byte-Adressen.

Beachten Sie, dass, wenn Sie Caching involed und lineare Daten Zugriff haben, wird es anders sein.

Der 64-Bit-Bus Sie beziehen sich die Caches Feeds. Als CPU, lesen Sie immer und ganze Cache-Zeilen schreiben. Die Größe einer Cache-Zeile ist immer ein Vielfaches von 8, und seine physikalische Adresse ist in der Tat bei 8 Byte-Offsets ausgerichtet sind.

Cache-Register-Übertragungen verwenden Sie nicht den externen Datenbus, so dass die Breite des Busses ist irrelevant.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top