Frage

Die normalen Antworten, warum Datenabgleich ist für den Zugriff effizienten und das Design der CPU zu vereinfachen.

Eine relevante Frage und ihre Antworten sind href="https://stackoverflow.com/questions/3025125/cpu-and-data-alignment">. Und eine weitere Quelle ist hier . Aber sie beide lösen meine Frage nicht.

Angenommen, eine CPU eine Zugriffsgranularität von 4 Bytes hat. Das heißt liest die CPU 4 Byte zu einem Zeitpunkt. Das Material, das ich oben notierte sagt, dass, wenn ich ein falsch ausgerichtet auf Daten zugreifen, sagen wir Adresse 0x1, dann ist die CPU 2 Zugriffe zu tun hat (eine von Adressen 0x0, 0x1, 0x2 und 0x3, eine von Adressen 0x4, 0x5, 0x6 und 0x7) und kombinieren Sie die Ergebnisse. Ich kann nicht sehen, warum. Warum kann es einfach nicht CPU Daten von 0x1 lesen, 0x2, 0x3, 0x4, wenn ich Problem Zugriff auf Adresse 0x1. Es wird nicht die Leistung und incur viel Komplexität in der Schaltung verschlechtern.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

  

Es wird nicht die Leistung und incur viel Komplexität in der Schaltung verschlechtern.

Es ist die falschen Annahmen, die wir als Tatsache, dass wirklich weitergehendes Verständnis abwerfen.

Ihr Kommentar in der anderen Frage verwendet viel angemessenere Formulierung (“ ich glaube nicht, , es würde degradieren“, ...)

Haben Sie, dass die Speicherarchitektur viele Speicherchips parallel verwendet, um die Bandbreite zu maximieren? Und dass ein bestimmtes Datenelement in einem Chip nur ist, kann man nicht nur lesen, was Chip bequem sein geschieht und erwartet, dass sie die Daten haben, die Sie wollen.

Im Moment können die CPU und Speicher zu verdrahten zusammen, so dass Bits 0-7 verdrahtet sind nur auf Chip 0, 8-15 auf Chip 1, 16-23 zu Chip 2, 24-31 zu Chip 3. Und für alle ganzen Zahlen N, 4 N Speicherstelle 0 in Chip gespeichert, 4 N + 1 in der Chip-1 usw. Und es ist der n-te Byte in jedem dieser Chips.

Lassen Sie uns Blick auf die Speicheradressen an jedem einzelnen Speicherchip-Offset gespeichert

memory chip       0       1       2       3
offset

    0             0       1       2       3
    1             4       5       6       7
    2             8       9      10      11
    N            4N    4N+1    4N+2    4N+3



Wenn Sie also aus dem Speicher laden Bytes 0-3, N = 0, jeder Chip meldet seine interne Byte 0, die Bits enden alle an den richtigen Stellen auf, und alles ist groß.

Nun, wenn Sie versuchen, ein Wort zu laden am Speicherplatz ab dem 1. was passiert?

Erstens haben wir auf dem Weg aussehen es gemacht wird. Erster Speicherbytes 1-3, die in Speicherchips gespeichert sind 1-3 bei Offset 0, am Ende in Bits 8-31, weil dort diese Speicherchips angebracht sind, auch wenn man sie in Bits 0-23 wird gefragt. Dies ist keine große Sache, weil die die CPU sie intern swizzle kann die gleiche Schaltung für logische Verschiebung nach links verwendet werden. Dann auf der nächste Transaktion Speicherbyteadresse 4, die 1 im Speicherchip 0 bei Offset gespeichert wird, in Bits gelesen wird 0-7 und umgestellt in den Bits 24-31, wo man es haben wollte.

Beachten Sie hier etwas. Das Wort von Ihnen gewünschte Spaltung zwischen Offsets ist, wobei die erste Speichertransaktion von Offset 0 von drei Chips zu lesen, die zweite Speichertransaktion gelesen von Offset 1 des anderen Chips. Hier ist, wo das Problem liegt. Sie haben die Speicherchips sagen, den Versatz, so dass sie Ihnen die richtigen Daten zurückschicken kann, und der Offset ~ 40 Bit breit und die Signale mit sehr hoher Geschwindigkeit. Im Moment gibt es nur einen Satz von Offset-Signale, die den Speicherchips auf alle verbindet, eine einzelne Transaktion für nicht ausgerichteten Speicherzugriff zu tun wäre, müssen Sie unabhängig Offset laufen jeden Speicherchip (die Adresse Bus BTW genannt). Für einen 64-Bit-Prozessor, dann würden Sie von einem Adressbus zu acht ändern, was eine Steigerung von fast 300 Pins. In einer Welt, wo CPUs zwischen 700 und 1300 Pins verwenden, kann dies kaum genannt werden, „nicht viel Anstieg der Schaltung“. Ganz zu schweigen von dem enormen Anstieg der Rauschen und Übersprechen von den vielen zusätzlichen Hochgeschwindigkeitssignalen.

Ok, es ist nicht ganz so schlimm, da nur maximal zwei verschiedenen Offsets aus auf dem Adreßbus auf einmal sein kann, und man ist immer der andere plus eins. So können Sie mit einem zusätzlichen Draht zu jedem Speicherchip wegkommen könnte, sagen in der Tat entweder (lesen Sie die auf dem Adreßbus aufgeführten Offset) oder (den Offset folgenden lesen), die zwei Zustände ist. Aber jetzt gibt es einen zusätzlichen Addierer in jedem Speicherchip, was bedeutet es, bevor der Offset zu berechnen hat tatsächlich den Arbeitsspeicher zu tun, das verlangsamt die maximale Taktrate für Speicher. Was bedeutet, dass ausgerichtet Zugang langsamer wird, wenn Sie nicht ausgerichteten Zugriff wollen schneller sein. Da 99,99% des Zugangs gemacht ausgerichtet wird, ist dies ein Nettoverlust.

Also, warum nicht ausgerichteten Zugriff spaltete sich in zwei Schritten erhält. Da die Adresse Bus von allen geteilt wird, die Bytes beteiligt. Und das ist eigentlich eine Vereinfachung, weil, wenn Sie verschiedene Offsets haben, können Sie auch verschiedene Cache-Zeilen beteiligt haben, so dass alle die Cache-Kohärenz-Logik müßte verdoppeln zweimal um die Kommunikation zu handhabenzwischen CPU-Kern.

Andere Tipps

Meiner Meinung nach, dass eine sehr einfache Annahme ist. Die Schaltung könnte beinhaltet viele Schichten von pipeling und Caching-Optimierung, dass bestimmte Bit Speicher, um sicherzustellen, lesen. Auch der Speicher liest delegiert werden an die Speicher-Subsystemen, die aus Komponenten aufgebaut werden können, die Aufträge von Unterschied in der Leistung und Design-Komplexität haben in der Art und Weise zu lesen, dass Sie denken.

Allerdings habe ich den Vorbehalt hinzufügen, dass ich nicht ein CPU oder Speicher-Designer, damit ich einen Topf sprechen könnte.

Die Antwort auf Ihre Frage ist in der Frage selbst.

Die CPU hat Zugriff Granularität von 4 Bytes. So ist es nur die Daten in Blöcken von 4 Bytes schlürfen kann.

Wenn Sie die Adresse 0x0 zugegriffen hatte, würde die CPU geben Sie die 4 Bytes von 0x0 bis 0x3.

Wenn Sie einen Befehl zum Zugriff auf Daten von Adresse 0x1 ausgeben, nimmt die CPU, dass als eine Anforderung für 4 Byte Daten an 0x1 Start (dh. 0x1 to 0x4). Dies kann nicht im Wesentlichen auf andere Weise interpretiert werden, da der Granularität der CPU. Daher ist die CPU Daten vom 0x0 to 0x3 slurps & 0x4 to 0x7 (ergo, 2 Zugriffen), setzt dann die Daten von 0x1 to 0x4 zusammen als das Endergebnis.

Adressierung 4 Byte mit dem ersten Byte an den bei 0x1 nicht 0x0 Mitteln links versetzte es nicht an einer Wortgrenze startet und schwappt zum nächsten benachbarten Wort über. Erste Zugriffs greifen die 3 Byte zu Wort-Grenze (ein 32-Bit-Wort angenommen wird), und dann greifen zweite Zugriffs Byte 0x4 in dem Modus des 4-Byte-32-Bit-Wort der Speicheradressierung Umsetzung abgeschlossen ist. Der Objektcode oder Assembler effektiv funktioniert den zweiten Zugang und Verkettung für den Programmierer transparent. Sein Bestes, um Wortgrenzen zu halten, wenn möglich, in der Regel in Einheiten von 4 Byte.

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