Cache-Hierarchie - Cache hierarchy

Cache-Hierarchie oder Multi-Level-Caches bezieht sich auf eine Speicherarchitektur, die eine Hierarchie von Speicherspeichern basierend auf unterschiedlichen Zugriffsgeschwindigkeiten auf Cache-Daten verwendet. Stark angeforderte Daten werden in Hochgeschwindigkeits-Zugriffsspeichern zwischengespeichert, was einen schnelleren Zugriff durch die Kerne der zentralen Verarbeitungseinheit (CPU) ermöglicht.

Die Cachehierarchie ist eine Form und ein Teil der Speicherhierarchie und kann als eine Form von mehrstufigem Speicher angesehen werden . Dieses Design sollte es CPU-Kernen ermöglichen, trotz der Speicherlatenz des Hauptspeicherzugriffs schneller zu verarbeiten . Der Zugriff auf den Hauptspeicher kann als Engpass für die CPU- Kernleistung wirken, da die CPU auf Daten wartet, während die Hochgeschwindigkeit des gesamten Hauptspeichers unerschwinglich teuer sein kann. Hochgeschwindigkeits-Caches sind ein Kompromiss, der einen Hochgeschwindigkeitszugriff auf die von der CPU am häufigsten verwendeten Daten ermöglicht und einen schnelleren CPU-Takt ermöglicht .

Prozessarchitekturdiagramm, das vier unabhängige Prozessoren zeigt, die jeweils über Cache-Systeme mit dem Hauptspeicher und dem Eingabe-Ausgabe-System verbunden sind.
Generische mehrstufige Cache-Organisation

Hintergrund

In der Geschichte der Entwicklung von Computern und elektronischen Chips gab es eine Zeit, in der die Erhöhungen der CPU-Geschwindigkeit die Verbesserungen der Speicherzugriffsgeschwindigkeit übertrafen. Die Kluft zwischen CPU-Geschwindigkeit und Speicher führte dazu, dass die CPU oft im Leerlauf war. CPUs waren zunehmend in der Lage, größere Mengen von Befehlen in einer bestimmten Zeit auszuführen und auszuführen, aber die Zeit, die für den Zugriff auf Daten aus dem Hauptspeicher erforderlich war, verhinderte, dass Programme vollständig von dieser Fähigkeit profitieren konnten. Dieses Thema motivierte die Schaffung von Speichermodellen mit höheren Zugriffsraten, um das Potenzial schnellerer Prozessoren auszuschöpfen.

Daraus entstand das Konzept des Cache-Speichers , das erstmals 1965 von Maurice Wilkes , einem britischen Informatiker an der University of Cambridge, vorgeschlagen wurde. Er nannte solche Speichermodelle „Slave-Speicher“. Zwischen 1970 und 1990 diskutierten Veröffentlichungen und Artikel von Anant Agarwal , Alan Jay Smith , Mark D. Hill , Thomas R. Puzak und anderen bessere Cache-Speicherdesigns. Die ersten Cache-Speichermodelle wurden zu dieser Zeit implementiert, aber während die Forscher bessere Designs untersuchten und vorschlugen, bestand der Bedarf an schnelleren Speichermodellen weiter. Dieser Bedarf resultierte aus der Tatsache, dass, obwohl frühe Cache-Modelle die Datenzugriffslatenz verbesserten, im Hinblick auf Kosten und technische Beschränkungen es für den Cache eines Computersystems nicht möglich war, sich der Größe des Hauptspeichers zu nähern. Ab 1990 wurden Ideen wie das Hinzufügen einer weiteren Cache-Ebene (Second-Level) als Backup für den First-Level-Cache vorgeschlagen. Jean-Loup Baer , Wen-Hann Wang, Andrew W. Wilson und andere haben dieses Modell untersucht. Als mehrere Simulationen und Implementierungen die Vorteile von zweistufigen Cache-Modellen demonstrierten, setzte sich das Konzept von mehrstufigen Caches als neues und im Allgemeinen besseres Modell von Cache-Speichern durch. Seit dem Jahr 2000 haben Multi-Level-Cache-Modelle große Aufmerksamkeit erregt und sind derzeit in vielen Systemen implementiert, wie beispielsweise die dreistufigen Caches, die in Intels Core-i7-Produkten enthalten sind.

Cache mit mehreren Ebenen

Der Zugriff auf den Hauptspeicher für jede Befehlsausführung kann zu einer langsamen Verarbeitung führen, wobei die Taktgeschwindigkeit von der Zeit abhängt, die zum Auffinden und Abrufen der Daten erforderlich ist. Um diese Speicherlatenz vor dem Prozessor zu verbergen, wird Daten-Caching verwendet. Wann immer die Daten vom Prozessor benötigt werden, werden sie aus dem Hauptspeicher geholt und in der kleineren Speicherstruktur gespeichert, die als Cache bezeichnet wird. Wenn diese Daten weiter benötigt werden, wird zuerst der Cache durchsucht, bevor zum Hauptspeicher gewechselt wird. Diese Struktur befindet sich hinsichtlich der Zeit, die zum Suchen und Abrufen von Daten in Bezug auf den Hauptspeicher benötigt wird, näher am Prozessor. Die Vorteile der Verwendung von Cache lassen sich durch die Berechnung der durchschnittlichen Zugriffszeit (AAT) für die Speicherhierarchie mit und ohne Cache belegen.

Durchschnittliche Zugriffszeit (AAT)

Caches, die klein sind, können zu häufigen Fehlversuchen führen – wenn eine Suche im Cache nicht die gesuchten Informationen liefert – was zu einem Aufruf an den Hauptspeicher zum Abrufen von Daten führt. Daher wird die AAT von der Fehltrefferrate jeder Struktur beeinflusst, aus der sie nach den Daten sucht.

AAT für Hauptspeicher wird durch Hit time Hauptspeicher angegeben . AAT für Caches kann gegeben werden von

Trefferzeit Cache + (Miss Rate Cache × Miss Penalty Zeit, die benötigt wird, um nach fehlendem Cache in den Hauptspeicher zu gehen ).

Die Trefferzeit für Caches ist geringer als die Trefferzeit für den Hauptspeicher, sodass die AAT für den Datenabruf deutlich geringer ist, wenn auf Daten über den Cache anstatt über den Hauptspeicher zugegriffen wird.

Kompromisse

Während die Verwendung des Cache die Speicherlatenz verbessern kann, führt dies aufgrund der Art und Weise, wie Caches organisiert und durchlaufen werden, möglicherweise nicht immer zu der erforderlichen Verbesserung für die Zeit, die zum Abrufen von Daten benötigt wird. Zum Beispiel haben direkt abgebildete Caches, die die gleiche Größe haben, normalerweise eine höhere Fehlerrate als vollständig assoziative Caches. Dies kann auch vom Benchmark des Computers, der den Prozessor testet, und vom Muster der Anweisungen abhängen. Die Verwendung eines vollständig assoziativen Caches kann jedoch zu einem höheren Stromverbrauch führen, da er jedes Mal den gesamten Cache durchsuchen muss. Aus diesem Grund wird der Kompromiss zwischen dem Stromverbrauch (und der damit verbundenen Wärme) und der Größe des Caches beim Cache-Design kritisch.

Evolution

Eine Reihe von Rechtecken mit zunehmenden Proportionen, die zunehmenden Speicher von Registern auf der CPU und L1-Cache bis L2, L3 und Hauptspeicher darstellen.
Cache-Hierarchie für bis zu L3-Level von Cache und Hauptspeicher mit On-Chip L1

Im Falle eines Cache-Miss wird der Zweck der Verwendung einer solchen Struktur nutzlos gemacht und der Computer muss zum Hauptspeicher gehen, um die erforderlichen Daten abzurufen. Wenn der Computer jedoch bei einem Cache mit mehreren Ebenen den Cache verfehlt, der dem Prozessor am nächsten ist (Level-One-Cache oder L1), durchsucht er die nächstnächste(n) Cache-Ebene(n) und wechselt nur dann zum Hauptspeicher, wenn diese Methoden scheitern. Der allgemeine Trend besteht darin, den L1-Cache klein und in einem Abstand von 1–2 CPU-Taktzyklen vom Prozessor zu halten, wobei die unteren Cache-Ebenen größer werden, um mehr Daten als L1 zu speichern, also weiter entfernt, aber mit einem geringeren Miss Bewertung. Dies führt zu einem besseren AAT. Die Anzahl der Cache-Ebenen kann von Architekten gemäß ihren Anforderungen entworfen werden, nachdem Kompromisse zwischen Kosten, AATs und Größe geprüft wurden.

Leistungssteigerungen

Mit der Technologieskalierung, die es ermöglichte, dass Speichersysteme auf einem einzigen Chip untergebracht werden konnten, verfügen die meisten modernen Prozessoren über bis zu drei oder vier Cache-Ebenen. Die Reduzierung der AAT kann an diesem Beispiel verstanden werden, bei dem der Computer AAT auf verschiedene Konfigurationen bis hin zu L3-Caches überprüft.

Beispiel : Hauptspeicher = 50  ns , L1 = 1 ns mit 10% Missrate, L2 = 5 ns mit 1% Missrate), L3 = 10 ns mit 0,2% Missrate.

  • Kein Cache, AAT = 50 ns
  • L1-Cache, AAT = 1 ns + (0,1 × 50 ns) = 6 ns
  • L1–2 Caches, AAT = 1 ns + (0,1 × [5 ns + (0,01 × 50 ns)]) = 1,55 ns
  • L1–3 Caches, AAT = 1 ns + (0,1 × [5 ns + (0,01 × [10 ns + (0,002 × 50 ns)])]) = 1,5101 ns

Nachteile

  • Cache-Speicher verursacht höhere Grenzkosten als Hauptspeicher und kann somit die Kosten des Gesamtsystems erhöhen.
  • Zwischengespeicherte Daten werden nur solange gespeichert, wie der Cache mit Strom versorgt wird.
  • Erhöhte On-Chip-Fläche für das Speichersystem erforderlich.
  • Bei großen Programmen mit schlechter zeitlicher Lokalität , die häufig auf den Hauptspeicher zugreifen, können die Vorteile minimiert oder eliminiert werden .

Eigenschaften

drei Quadrate, die getrennte L1-Caches auf der CPU für Anweisungen und Daten, einen L2-Cache außerhalb des Chips und den Hauptspeicher zeigen.
Cache-Organisation mit L1 als getrennt und L2 als einheitlich

Banked versus vereinheitlicht

In einem Banked Cache ist der Cache in einen Cache für die Befehlsspeicherung und einen für Daten reservierten Cache unterteilt . Im Gegensatz dazu enthält ein vereinheitlichter Cache sowohl die Anweisungen als auch die Daten im selben Cache. Während eines Prozesses greift der Prozessor auf den L1-Cache (oder den meisten Cache der oberen Ebene in Bezug auf seine Verbindung zum Prozessor) zu, um sowohl Befehle als auch Daten abzurufen. Die gleichzeitige Implementierung beider Aktionen erfordert mehrere Ports und mehr Zugriffszeit in einem einheitlichen Cache. Mehrere Ports zu haben erfordert zusätzliche Hardware und Verkabelung, was zu einer signifikanten Struktur zwischen den Caches und Verarbeitungseinheiten führt. Um dies zu vermeiden, wird der L1-Cache oft als Banked-Cache organisiert, was zu weniger Ports, weniger Hardware und im Allgemeinen geringeren Zugriffszeiten führt.

Moderne Prozessoren haben geteilte Caches, und in Systemen mit Mehrebenen-Caches können Caches höherer Ebene vereinheitlicht werden, während niedrigere Ebenen geteilt werden.

Inklusionsrichtlinien

ein Speichersystemdiagramm, das eine Kopie von L1 in L2 und eine Kopie von L2 in L3 zeigt.
Inklusive Cache-Organisation

Ob ein in der oberen Cache-Schicht vorhandener Block auch in der unteren Cache-Ebene vorhanden sein kann, wird durch die Einschlussrichtlinie des Speichersystems geregelt, die einschließend, ausschließend oder nicht-einschließend nicht-exklusiv (NINE) sein kann.

Bei einer inklusiven Richtlinie müssen alle Blöcke, die im Cache der oberen Ebene vorhanden sind, auch im Cache der unteren Ebene vorhanden sein. Jede Cache-Komponente der oberen Ebene ist eine Teilmenge der Cache-Komponente der unteren Ebene. Da in diesem Fall eine Duplizierung von Blöcken vorliegt, gibt es eine gewisse Speicherverschwendung. Die Überprüfung ist jedoch schneller.

Bei einer exklusiven Richtlinie sind alle Komponenten der Cache-Hierarchie vollständig exklusiv, sodass kein Element im Cache der oberen Ebene in einer der unteren Cache-Komponenten vorhanden ist. Dies ermöglicht die vollständige Nutzung des Cache-Speichers. Es gibt jedoch eine hohe Speicherzugriffslatenz.

Die oben genannten Richtlinien erfordern, dass eine Reihe von Regeln befolgt werden, um sie umzusetzen. Wenn keines davon erzwungen wird, wird die resultierende Inklusionsrichtlinie als non-inclusive non-exclusive (NINE) bezeichnet. Dies bedeutet, dass der Cache der oberen Ebene im Cache der unteren Ebene vorhanden sein kann oder nicht.

Richtlinien schreiben

Es gibt zwei Richtlinien, die die Art und Weise definieren, in der ein modifizierter Cache-Block im Hauptspeicher aktualisiert wird: Durchschreiben und Zurückschreiben.

Im Fall der Write-Through-Policy wird der Wert des Cache-Blocks immer dann, wenn sich der Wert ändert, auch in der untergeordneten Speicherhierarchie weiter modifiziert. Diese Richtlinie stellt sicher, dass die Daten beim Schreiben in der Hierarchie sicher gespeichert werden.

Im Fall der Rückschreiberichtlinie wird der geänderte Cacheblock jedoch nur dann in der Hierarchie niedrigerer Ebene aktualisiert, wenn der Cacheblock entfernt wird. Ein "dirty bit" wird an jeden Cache-Block angehängt und immer dann gesetzt, wenn der Cache-Block modifiziert wird. Bei der Räumung werden Blöcke mit gesetztem Dirty-Bit in die untergeordnete Hierarchie geschrieben. Gemäß dieser Richtlinie besteht ein Risiko für Datenverlust, da die zuletzt geänderte Kopie eines Datums nur im Cache gespeichert wird und daher einige Korrekturtechniken beachtet werden müssen.

Im Falle eines Schreibvorgangs, bei dem das Byte nicht im Cache-Block vorhanden ist, kann das Byte in den Cache gebracht werden, wie durch eine Schreib-Zuweisungs- oder Schreib-No-Zuweisungs-Richtlinie bestimmt wird. Die Schreibzuweisungsrichtlinie besagt, dass im Falle eines Schreibfehlers der Block aus dem Hauptspeicher geholt und vor dem Schreiben in den Cache gelegt wird. In der Schreib-No-Allocation-Richtlinie wird, wenn der Block im Cache fehlt, in die untergeordnete Speicherhierarchie geschrieben, ohne den Block in den Cache zu holen.

Die üblichen Kombinationen der Richtlinien sind "Write Block", "Write Allocate" und "Write Through Write No-Allocate" .

Geteilt versus privat

Drei CPUs haben jeweils private L1-Caches auf dem Chip, teilen sich jedoch den L2, L3 und den Hauptspeicher außerhalb des Chips.
Cache-Organisation mit L1 privat und L2 und L3 gemeinsam genutzt

Ein privater Cache wird einem bestimmten Kern in einem Prozessor zugewiesen, auf den von anderen Kernen nicht zugegriffen werden kann. In einigen Architekturen hat jeder Kern seinen eigenen privaten Cache; Dadurch besteht das Risiko doppelter Blöcke in der Cache-Architektur eines Systems, was zu einer geringeren Kapazitätsauslastung führt. Jedoch kann diese Art der Entwurfswahl in einer Mehrschicht-Cache-Architektur auch für eine niedrigere Datenzugriffslatenz gut sein.

Ein gemeinsam genutzter Cache ist ein Cache, auf den von mehreren Kernen zugegriffen werden kann. Da er gemeinsam genutzt wird, ist jeder Block im Cache einzigartig und hat daher eine höhere Trefferquote, da es keine doppelten Blöcke gibt. Die Datenzugriffslatenz kann jedoch zunehmen, wenn mehrere Kerne versuchen, auf denselben Cache zuzugreifen.

Bei Mehrkernprozessoren wirkt sich die Designentscheidung, einen Cache gemeinsam oder privat zu verwenden, auf die Leistung des Prozessors aus. In der Praxis wird der Cache der oberen Ebene L1 (oder manchmal L2) als privater und der Cache der unteren Ebene als gemeinsam genutzt implementiert. Dieses Design bietet hohe Zugriffsraten für die Caches der höheren Ebene und niedrige Fehltrefferraten für die Caches der unteren Ebene.

Aktuelle Implementierungsmodelle

Cache-Organisation der Intel Nehalem-Mikroarchitektur

Intel Broadwell-Mikroarchitektur (2014)

  • L1-Cache (Anweisungen und Daten) – 64  kB pro Kern
  • L2-Cache – 256 kB pro Kern
  • L3-Cache – 2  MB bis 6 MB gemeinsam genutzt
  • L4-Cache – 128 MB eDRAM (nur Iris Pro-Modelle)

Intel Kaby Lake-Mikroarchitektur (2016)

  • L1-Cache (Anweisungen und Daten) – 64 kB pro Kern
  • L2-Cache – 256 kB pro Kern
  • L3-Cache – 2 MB bis 8 MB geteilt

AMD Zen-Mikroarchitektur (2017)

  • L1-Cache – 32 kB Daten & 64 kB Instruktionen pro Kern, 4-Wege
  • L2-Cache – 512 kB pro Kern, inklusive 4-Wege
  • L3-Cache – 4 MB lokal und remote pro 4-Kern-CCX, 2 CCXs pro Chiplet, 16-Wege nicht inklusive. Bis zu 16 MB auf Desktop-CPUs und 64 MB auf Server-CPUs

AMD Zen 2-Mikroarchitektur (2019)

  • L1-Cache – 32 kB Daten & 32 kB Instruktionen pro Kern, 8-Wege
  • L2-Cache – 512 kB pro Kern, 8-Wege inklusive
  • L3-Cache – 16 MB lokal pro 4-Kern-CCX, 2 CCXs pro Chiplet, 16-Wege nicht inklusive. Bis zu 64 MB auf Desktop-CPUs und 256 MB auf Server-CPUs

IBM Power 7

  • L1-Cache (Anweisung und Daten) – jede 64-Bank, jede Bank hat 2. + 1-Wr-Ports 32 kB, 8-fach assoziativ, 128-B-Block, Durchschreiben
  • L2-Cache – 256 kB, 8-Wege, 128-B-Block, Zurückschreiben, einschließlich L1, 2 ns Zugriffslatenz
  • L3-Cache – 8 Regionen mit 4 MB (insgesamt 32 MB), lokale Region 6 ns, Remote 30 ns, jede Region 8-fach assoziativ, DRAM-Datenarray, SRAM-Tag-Array

Siehe auch

Verweise