Wie kann Cache so schnell sein?

37

Hier ist ein Screenshot eines Cache-Benchmarks:

Ergebnisse des AIDA64 Cache & Memory Benchmarks

Im Benchmark liegt die Lesegeschwindigkeit des L1-Cache bei ca. 186 GB / s, wobei die Latenz bei ca. 3-4 Taktzyklen liegt. Wie wird eine solche Geschwindigkeit überhaupt erreicht?

Betrachten Sie den Speicher hier: Die theoretische maximale Geschwindigkeit beträgt 665 MHz (Speicherfrequenz) x 2 (doppelte Datenrate) x 64 Bit (Busbreite), was ungefähr 10,6 GB / s entspricht, was näher am Benchmark-Wert von 9,6 GB / s liegt .

Aber mit dem L1-Cache würden wir, selbst wenn wir bei jedem Zyklus mit dem Prozessor bei seiner Maximalfrequenz (3 GHz) lesen könnten, ungefähr 496 Datenleitungen benötigen, um einen solchen Durchsatz zu erzielen, der unrealistisch klingt. Dies gilt auch für andere Caches.

Was vermisse ich? Wie berechnen wir den Durchsatz eines Caches anhand seiner Parameter?

Ritter
quelle
14
Haben Sie darüber nachgedacht, wie klein der L1,2,3-Cache ist und wo er sich physisch befindet? Tipp, Sie müssen sich nicht mit einem
Busstandard befassen,
2
Außerdem: Weiß der Benchmark genug darüber, was er tut, um sicherzustellen, dass einige Daten, mit denen er testet, nicht direkt in einem Register gespeichert werden?
Rackandboneman
7
@rackandboneman: AIDA64 ist ein angesehener Benchmark, nicht etwas, das jemand gerade in C gehackt hat und das der Compiler einige Lasten wegoptimieren lässt! Ich würde annehmen, dass die Mikrobankenteile in Assembler geschrieben sind, mit SSE- oder AVX-Versionen.
Peter Cordes
1
@ Peter Cordes befriedigende Antwort - auf eine notwendige Frage.
Rackandboneman
1
Nur um die physikalische Perspektive zu betrachten: In 1,4 Nanosekunden bewegt sich das Licht etwa anderthalb Fuß weit. Wenn sich der Cache auf der anderen Seite der Hauptplatine befindet, kann eine solche Latenz die Relativität beeinträchtigen. Oder ein Messfehler sein .
Arthur

Antworten:

35

Diese CPU hat ...

2 Kerne Ein 32-KB-Befehl und ein 32-KB-Daten-First-Level-Cache (L1) für jeden Kern

Da es zwei Kerne gibt, können wir davon ausgehen, dass der Benchmark zwei Threads parallel ausführt. Ihre Website liefert zwar bemerkenswert wenig Informationen, aber wenn wir hier nachsehen , scheinen CPUs mit mehr Kernen entsprechend höhere L1-Durchsätze zu liefern. Ich denke, was angezeigt wird, ist der Gesamtdurchsatz, wobei alle Kerne parallel arbeiten. Für Ihre CPU sollten wir also für einen Kern und einen Cache durch zwei teilen:

Read   93 GB/s
Write  47 GB/s
Copy   90 GB/s

Die Tatsache, dass "copy" 2x schneller ist als "write", ist höchst verdächtig. Wie könnte es schneller kopieren als schreiben? Ich gehe davon aus, dass das, was der Benchmark als "Kopie" anzeigt, die Summe aus Lese- und Schreibdurchsatz ist. In diesem Fall würde es sowohl lesen als auch schreiben mit 45 GB / s, aber 90 anzeigen, da es sich um einen Benchmark handelt, und Wer zum Teufel vertraut Benchmarks? Ignorieren wir also "copy".

Read   93 GB/s => 30 bytes/clock
Write  47 GB/s => 15 bytes/clock

Jetzt ist ein 128-Bit-Register 16 Bytes groß und nahe genug, sodass dieser Cache anscheinend zwei 128-Bit-Lesevorgänge und einen Schreibvorgang pro Takt ausführen kann.

Dies ist genau das, was Sie wirklich tun möchten, um die SSE-Anweisungen zur Zahleneingabe zu optimieren: zwei Lesevorgänge und ein Schreibvorgang pro Zyklus.

Dies würde höchstwahrscheinlich mit vielen parallelen Datenleitungen implementiert werden, was der übliche Weg ist, um viele Daten innerhalb eines Chips sehr schnell zu transportieren.

peufeu
quelle
4
Auf Seite 55 des Document @ Next-Hack-Links heißt es: "Intern sind Zugriffe bis zu 16 Bytes. [...] In jedem Zyklus können zwei Ladeoperationen und eine Speicheroperation ausgeführt werden." Das erklärt, warum das Lesen zweimal schneller ist - es kann zwei Lesevorgänge in derselben Operation ausführen und gleichzeitig einen Schreibvorgang ausführen.
Tom Carpenter
2
Ja, es zählt eindeutig Kopie BW = Lesen und Schreiben. Dies scheint ebenso gültig wie die Alternative zu sein, da es wichtig ist, dass die Lese- und Schreibvorgänge parallel ausgeführt werden können. Beachten Sie, dass die OP-Nummern für L2 / L3 beim Kopieren nicht viel höher als beim Schreiben und beim Speichern niedriger sind. Der DDR3-Speicherbus ist nicht Vollduplex: Zum Lesen und Schreiben werden dieselben Datenleitungen benötigt. (Weitere Informationen zur x86 memcpy / memset-Bandbreite bei NT-Speichern im Vergleich zu regulären Speichern finden Sie unter stackoverflow.com/questions/43343231/… ).
Peter Cordes
6
Sie vermuten, dass IvyBridge zwei Lesevorgänge und einen Schreibvorgang im selben Taktzyklus ausführen kann . Sie haben recht, aber nur unter sehr begrenzten Umständen. IvB hat nur 2 AGU-Ports, daher ist es normalerweise auf 2 Speicheroperationen pro Takt begrenzt, von denen eine ein Speicher sein kann . Für das Laden / Speichern von 256b AVX sind jedoch 2 Zyklen in den Lade- / Speicheranschlüssen erforderlich, während die AGU nur im ersten Zyklus benötigt wird. Auf diese Weise kann eine Speicheradresse uop während des zweiten Zyklus einer 256b-Last auf Port 2/3 ausgeführt werden, ohne dass eine Lastbandbreite belastet wird. (Store-data uops laufen auf Port 4.) Quelle: agner.org/optimize microarch pdf
Peter Cordes
2
Eine AMD Bulldozer-Familie oder Ryzen-CPU würde Ihnen die gleichen Lese- = 2x-Schreibzahlen geben, aber sie sind wirklich auf 2 Speicheroperationen pro Takt begrenzt (bis zu einer kann ein Schreibvorgang sein), ohne Lücken. Lesen / Schreiben / Kopieren erkennt den Unterschied nicht, aber Triad kann ( a[i] = b[i] + c[i]). Übrigens, Intel Haswell und später haben eine Store-AGU an Port 7, die einfache (nicht indizierte) Adressierungsmodi verarbeiten kann, sodass sie 2 Lade- + 1-Speicher-Uops pro Takt ausführen können. (Und der Datenpfad zu L1D ist 256b, also verdoppelt er die L1D-Bandbreite.) Siehe David Kanters Artikel
Peter Cordes
1
@AliChen: Das OP erwähnte explizit die 4-Zyklus-Latenzzeit von IvyBridge nach der Bandbreitennutzung, bevor gefragt wurde, wie schnell sie sein kann.
Peter Cordes
27

Die Antwort von @ peufeu weist darauf hin, dass dies systemweite Gesamtbandbreiten sind. L1 und L2 sind private Pro-Core-Caches in der Intel Sandybridge-Familie. Die Zahlen sind also doppelt so hoch wie die eines einzelnen Cores. Wir haben aber trotzdem eine beeindruckend hohe Bandbreite und eine geringe Latenz.

Der L1D-Cache ist direkt in den CPU-Kern integriert und sehr eng mit den Lade-Ausführungseinheiten (und dem Speicherpuffer) verbunden . In ähnlicher Weise befindet sich der L1I-Cache direkt neben dem Befehlsabruf- / Dekodierteil des Kerns. (Ich habe mir noch keinen Sandybridge-Silizium-Grundriss angesehen, daher trifft dies möglicherweise nicht wirklich zu. Der Ausgabe- / Umbenennungsteil des Front-Ends befindet sich wahrscheinlich näher am mit "L0" dekodierten UOP-Cache, der Strom spart und eine bessere Bandbreite aufweist als die Decoder.)

Aber mit L1-Cache, auch wenn wir bei jedem Zyklus lesen könnten ...

Warum dort aufhören? Intel seit Sandybridge und AMD seit K8 können 2 Ladevorgänge pro Zyklus ausführen. Multi-Port-Caches und TLBs sind eine Sache.

Die Sandybridge-Mikroarchitektur von David Kanter enthält ein schönes Diagramm (das auch für Ihre IvyBridge-CPU gilt):

(Der "Unified Scheduler" hält ALUs und Speicher-Uops bereit, bis ihre Eingaben bereit sind, und / oder wartet auf ihren Ausführungsport. ( vmovdqa ymm0, [rdi]Dekodiert z. B. in einen Lade-Uop, auf den gewartet werden muss, rdiwenn ein vorheriger add rdi,32noch nicht ausgeführt wurde.) Beispiel: Intel plant Uops zu Ports zum Zeitpunkt der Ausgabe / Umbenennung . Dieses Diagramm zeigt nur die Ausführungsports für Speicher-Uops, aber nicht ausgeführte ALU-Uops konkurrieren auch darum. Die Ausgabe- / Umbenennungsphase fügt Uops zu ROB und Scheduler hinzu Sie bleiben bis zur Stilllegung im ROB, aber nur bis zum Versand an einen Ausführungsport im Scheduler. AMD verwendet separate Scheduler für Integer / FP, Adressierungsmodi verwenden jedoch immer Integer-Register

David Kanters SnB-Speicherdiagramm

Wie das zeigt, gibt es nur 2 AGU-Ports (Adressgenerierungseinheiten, die einen Adressierungsmodus annehmen [rdi + rdx*4 + 1024]und eine lineare Adresse erzeugen). Es kann 2 Speicheroperationen pro Takt ausführen (von jeweils 128 b / 16 Bytes), von denen eine ein Speicher ist.

Aber es hat einen Trick auf Lager: SnB / IvB-Lauf 256b AVX lädt / speichert als einzelnes UOP, das 2 Zyklen in einem Lade- / Speicher-Port benötigt, aber nur die AGU im ersten Zyklus benötigt. Auf diese Weise kann eine Speicheradresse uop in diesem zweiten Zyklus auf der AGU an Port 2/3 ausgeführt werden, ohne dass der Ladedurchsatz verloren geht. Mit AVX (die von Intel Pentium / Celeron-CPUs nicht unterstützt werden: /) kann SnB / IvB (theoretisch) 2 Ladevorgänge und 1 Speicher pro Zyklus aushalten .

Ihre IvyBridge-CPU ist der Schrumpf von Sandybridge (mit einigen Verbesserungen der Mikroarchitektur, z. B. Mov-Elimination , ERMSB (memcpy / memset) und Hardware-Prefetching auf der nächsten Seite). Die nachfolgende Generation (Haswell) verdoppelte die L1D-Bandbreite pro Takt, indem die Datenpfade von Ausführungseinheiten auf L1 von 128b auf 256b erweitert wurden, sodass die AVX 256b-Lasten 2 pro Takt aushalten können. Es wurde auch ein zusätzlicher Store-AGU-Port für einfache Adressierungsmodi hinzugefügt.

Der Spitzendurchsatz von Haswell / Skylake liegt bei 96 geladenen und gespeicherten Bytes pro Takt. Das Optimierungshandbuch von Intel geht jedoch davon aus, dass der anhaltende durchschnittliche Durchsatz von Skylake (immer noch keine L1D- oder TLB-Fehler vorausgesetzt) ​​~ 81B pro Zyklus beträgt. (A skalare Ganzzahl - Schleife kann Sustain 2 Lasten + 1 Speicher pro Takt nach meiner Prüfung auf SKL, Ausführen 7 (nicht - fusionierten-Domäne) UOPs pro Takt von 4 anellierten Domäne uops. Aber es verlangsamt sich etwas mit 64-Bit - Operanden , anstatt 32-Bit, es gibt also anscheinend ein gewisses Limit an Ressourcen für Mikroarchitekturen, und es geht nicht nur darum, die Speicheradress-Uops auf Port 2/3 zu planen und Zyklen von Lasten zu stehlen.)

Wie berechnen wir den Durchsatz eines Caches anhand seiner Parameter?

Dies ist nicht möglich, es sei denn, die Parameter enthalten praktische Durchsatzzahlen. Wie oben erwähnt, kann selbst die L1D von Skylake mit ihren Lade- / Speicher-Ausführungseinheiten für 256b-Vektoren nicht ganz mithalten. Obwohl es in der Nähe ist und es für 32-Bit-Ganzzahlen kann. (Es wäre nicht sinnvoll, mehr Ladeeinheiten zu haben, als der Cache über Leseports verfügt, oder umgekehrt. Sie würden nur Hardware weglassen, die niemals vollständig genutzt werden könnte. Beachten Sie, dass L1D möglicherweise zusätzliche Ports zum Senden / Empfangen von Leitungen hat / von anderen Kernen sowie für Lese- / Schreibvorgänge innerhalb des Kerns.)

Wenn Sie sich nur die Datenbusbreiten und -uhren ansehen, können Sie nicht die ganze Geschichte erzählen. Die Bandbreite von L2 und L3 (und des Speichers) kann durch die Anzahl der ausstehenden Fehler begrenzt werden, die L1 oder L2 nachverfolgen können . Die Bandbreite darf die Latenz * max_concurrency nicht überschreiten, und Chips mit einer höheren Latenz L3 (wie ein Xeon mit vielen Kernen) haben eine viel geringere Single-Core-L3-Bandbreite als eine Dual- / Quad-Core-CPU derselben Mikroarchitektur. Siehe den Abschnitt "Latenz-gebundene Plattformen" in dieser SO-Antwort . CPUs der Sandybridge-Familie verfügen über 10 Line-Fill-Puffer zum Verfolgen von L1D-Fehlern (auch von NT-Speichern verwendet).

(Die gesamte L3 / Speicher-Bandbreite mit vielen aktiven Kernen ist auf einem großen Xeon sehr groß, aber Single-Threaded-Code hat bei gleicher Taktrate eine schlechtere Bandbreite als auf einem Quad-Core, da mehr Kerne mehr Stopps auf dem Ringbus bedeuten und damit höher Latenz L3.)


Cache-Latenz

Wie wird eine solche Geschwindigkeit überhaupt erreicht?

Die Latenzzeit des L1D-Caches beim Laden mit 4 Zyklen ist ziemlich erstaunlich , vor allem, wenn man bedenkt, dass er mit einem Adressierungsmodus beginnen [rsi + 32]muss, also muss er addieren, bevor er überhaupt eine virtuelle Adresse hat. Dann muss es das in physisch übersetzen, um die Cache-Tags auf eine Übereinstimmung zu überprüfen.

(Für andere Adressierungsmodi als [base + 0-2047]die Intel Sandybridge-Familie ist ein zusätzlicher Zyklus erforderlich. Daher gibt es in den AGUs eine Abkürzung für einfache Adressierungsmodi (typisch für Zeigerjagd-Fälle, in denen eine geringe Latenz bei Last wahrscheinlich am wichtigsten ist, aber auch allgemein üblich). (Siehe Intels Optimierungshandbuch , Sandybridge, Abschnitt 2.3.5.2 L1 DCache.) Dies setzt auch keine Segmentüberschreibung und eine 0normale Segmentbasisadresse von voraus .)

Außerdem muss der Speicherpuffer überprüft werden, um festzustellen, ob er sich mit früheren Speichern überschneidet. Und es muss dies herausfinden, auch wenn eine frühere (in Programmreihenfolge) Speicheradresse uop noch nicht ausgeführt wurde, so dass die Speicheradresse nicht bekannt ist. Dies kann jedoch vermutlich parallel zur Überprüfung auf einen L1D-Treffer geschehen. Wenn sich herausstellt, dass die L1D-Daten nicht benötigt wurden, weil die Speicherweiterleitung die Daten aus dem Speicherpuffer bereitstellen kann, ist dies kein Verlust.

Intel verwendet VIPT-Caches (Virtually Indexed Physically Tagged) wie fast alle anderen. Dabei wird der Standardtrick angewendet, bei dem der Cache so klein und assoziativ ist, dass er sich wie ein PIPT-Cache (kein Aliasing) mit der Geschwindigkeit von VIPT verhält (kann indizieren) parallel zur virtuellen -> physischen Suche des TLB).

Die L1-Caches von Intel sind 8-Wege-Assoziativ-Caches mit 32 KB. Die Seitengröße beträgt 4kB. Dies bedeutet, dass die "Index" -Bits (mit denen ausgewählt wird, auf welche 8 Arten eine bestimmte Zeile zwischengespeichert werden kann) alle unterhalb des Seitenversatzes liegen. Das heißt, diese Adressbits sind der Versatz in einer Seite und sind in der virtuellen und der physischen Adresse immer gleich.

Weitere Einzelheiten dazu und weitere Einzelheiten dazu, warum kleine / schnelle Caches nützlich / möglich sind (und gut funktionieren, wenn sie mit größeren langsameren Caches kombiniert werden ), finden Sie in meiner Antwort zur Frage, warum L1D kleiner / schneller als L2 ist .

Kleine Caches können Dinge erledigen, die in größeren Caches zu energieintensiv wären, z. B. das Abrufen der Daten-Arrays von einem Satz zur gleichen Zeit wie das Abrufen von Tags. Sobald ein Komparator herausfindet, welches Tag passt, muss er nur eine der acht 64-Byte-Cache-Zeilen muxen, die bereits aus dem SRAM abgerufen wurden.

(Ganz so einfach ist das nicht: Sandybridge / Ivybridge verwenden einen L1D-Cache mit einer Anzahl von 16-Byte-Blöcken. Sie können Cache-Bank-Konflikte erhalten, wenn zwei Zugriffe auf dieselbe Bank in verschiedenen Cache-Zeilen im selben Zyklus ausgeführt werden sollen. (Es gibt 8 Bänke, dies kann also bei Adressen geschehen, die ein Vielfaches von 128 voneinander entfernt sind, dh 2 Cache-Zeilen.)

IvyBridge hat auch keine Strafe für nicht ausgerichteten Zugriff, solange es nicht eine 64B-Cache-Zeilengrenze überschreitet. Ich vermute, es wird anhand der niedrigen Adressbits herausgefunden, welche Bank (en) abgerufen werden sollen, und es wird die Verschiebung festgelegt, die erforderlich ist, um die korrekten Daten von 1 bis 16 Byte zu erhalten.

Bei Cache-Zeilensplits ist es immer noch nur ein einziges UOP, führt jedoch mehrere Cache-Zugriffe aus. Die Strafe ist immer noch gering, außer bei 4k-Splits. Skylake macht sogar 4k-Splits mit einer Latenz von ungefähr 11 Zyklen ziemlich billig, genau wie ein normaler Cache-Line-Split mit einem komplexen Adressierungsmodus. Der 4k-Split-Durchsatz ist jedoch deutlich schlechter als der von Cl-Split-Non-Split.


Quellen :

Peter Cordes
quelle
1
Das ist sehr klar, erschöpfend und gut geschrieben! +1!
Next-Hack
8

Bei modernen CPUs befindet sich der Cache-Speicher direkt neben der CPU auf dem gleichen Chip (Chip) . Er wird mit SRAM erstellt , der viel schneller ist als der DRAM, der für die RAM-Module in einem PC verwendet wird.

Pro Speichereinheit (ein Bit oder Byte) ist SRAM viel teurer als DRAM. Deshalb wird DRAM auch in einem PC verwendet.

Da SRAM jedoch in der gleichen Technologie wie die CPU selbst hergestellt wird, ist es so schnell wie die CPU. Außerdem gibt es nur interne Busse (auf der CPU), die behandelt werden müssen. Wenn es sich also um einen 496 Zeilen breiten Bus handelt, ist dies wahrscheinlich der Fall.

Bimpelrekkie
quelle
Danke für Ihr Interesse. Ich habe in einigen Büchern gesehen, dass die Registerzugriffsgeschwindigkeiten über 300 GB / s liegen. In diesem Fall beträgt der Registerdurchsatz für einen 3-GHz-Prozessor 100 B / Zyklus, was nicht möglich ist, da die Register normalerweise 64/128 Bit breit sind. sie konnten nicht so viel ausgeben. Das ist es, was mich betrifft. Ist GB / sa der richtige Weg, um den Durchsatz auszudrücken?
Knight
3
@Knight Beachten Sie, dass IvB (wie jeder Hochleistungsprozessor) mehrere Anweisungen pro Zyklus ausführt, z. B. 3 ALU-Operationen, 2 Ladevorgänge und 1 Speicher. Die meisten von diesen können 2 Eingänge (gerade Lasten, für die indizierte Adressierung) und das Laden sogar 3 nehmen. Das sind 13 Register mit jeweils 8 Bytes und 104 Bytes (es könnte der Fall sein, dass eine solche epische Kombination nicht zulässig ist, aber da ist ist kein Hinweis darauf, dass dies bei IvB der Fall ist, auch wenn dies nicht aufrechterhalten werden kann. Berücksichtigt man auch Vektorregister, steigt diese Zahl noch weiter an.
Harold
@harold: related: Haswell und Skylake scheinen Begrenzungen für Registerlesevorgänge pro Takt zu haben, obwohl dies im Front-End sein kann und keinen Ausführungsburst beeinflusst, nachdem einige Eingaben bereit sind. Vielleicht ist es ein anderes Limit für die Mikroarchitektur, aber ich habe Engpässe im Code gefunden, die mehr Operationen pro Takt unterstützen sollten. agner.org/optimize/blog/read.php?i=415#852 . Bei Haswell hat mein bestes Szenario ~ 6,5 Ganzzahlregister pro Taktzyklus gelesen (aufrechterhalten). Ich habe es auch geschafft, 7 Ups pro Uhr auf Skylake zu verteilen / auszuführen (Stores sind Store-Adresse + Store-Daten).
Peter Cordes
@PeterCordes das muss doch das Frontend sein oder? IIRC, das war auch das Problem in der Vergangenheit (PPro zu Core2) und ich bin nicht sicher, wie Bruchzahlen ansonsten Sinn machen. Obwohl meine Zahlen sowieso ein bisschen
anders
@harold: Ja, ich bin mir ziemlich sicher, dass es sich um einen Front-End-Engpass handelt, der wahrscheinlich umbenannt wurde. Der Register-Lese-Engpass von P6 lag bei "kalten" Registern, die aus der permanenten Registerdatei in das betreffende ROB gelesen werden mussten. Kürzlich geänderte Register befanden sich noch im ROB, und es gab keinen Engpass. Ich habe nicht viel mit Cold vs. Hot Regs auf HSW / SKL untersucht, da ich aus irgendeinem Grund nicht daran gedacht habe, meine Schleife größer als 4 Uops / idealerweise 1c pro Iteration zu machen. Hoppla. IDK, wie groß der Unterschied zwischen Weiterleitung und PRF-Lesevorgängen ist (die zur Ausführungszeit erfolgen müssen, nicht ausstellen / umbenennen).
Peter Cordes
4

L1-Caches sind ziemlich breite Speicherstrukturen. Die Architektur der L1-Caches in Intel-Prozessoren finden Sie in diesem Handbuch (bereitgestellt von next-hack). Die Interpretation einiger Parameter ist jedoch falsch. Die "Cache-Zeilengröße" ist nicht die "Datenbreite", sondern die Größe des seriellen Blocks für den atomaren Datenzugriff.

Tabelle 2-17 (Abschnitt 2.3.5.1) gibt an, dass beim Laden (Lesen) die Cache-Bandbreite 2x16 = 32 Bytes pro Core und CYCLE beträgt . Dies allein ergibt eine theoretische Bandbreite von 96 Gbit / s auf einem 3GHz-Kern. Es ist nicht klar, was der zitierte Benchmark angibt, es sieht so aus, als würden zwei parallel arbeitende Kerne gemessen, sodass 192 Gbit / s für zwei Kerne entstehen.

Ale..chenski
quelle
2

Gate-Delays sind was? 10 Pikosekunden? Die Zykluszeiten für gesamte Pipeline-Operationen betragen 333 Pikosekunden, wobei verschiedene Dekodierungs- und Busaktivitäten und das Flip-Flop-Greifen von Daten erfolgen, bevor der nächste Taktzyklus beginnt.

Ich gehe davon aus, dass die langsamste Aktivität beim Lesen eines Caches darauf wartet, dass sich die Datenzeilen weit genug voneinander entfernen (wahrscheinlich sind dies Differentiale: eine Referenz und eine tatsächliche Ladung vom Lesebit), dass ein Komparator / Latch getaktet werden kann, um ein positives Signal zu implementieren. Rückkopplungsaktion, um eine winzige Spannung in einen großen Spannungshub von Schiene zu Schiene (ca. 1 Volt) umzuwandeln.

analogsystemsrf
quelle
1
Beachten Sie, dass die 4-Zyklus-L1D-Latenz die Adressenerzeugung (für einfache Adressierungsmodi [reg + 0-2047]) und eine TLB-Suche sowie einen Tag-Vergleich (8-Wege-Assoziativ) umfasst und die resultierenden bis zu 16 nicht ausgerichteten Bytes auf die Ausgabeport der Ladeeinheit zur Weiterleitung an andere Ausführungseinheiten. Es ist 4c Latenz für eine Pointer-Chasing-Schleife wie mov rax, [rax].
Peter Cordes