CPU -Cache

A CPU -Cache ist ein Hardware -Cache verwendet von der Zentrale Verarbeitungseinheit (CPU) von a Computer Um die durchschnittlichen Kosten (Zeit oder Energie) zum Zugang zu senken Daten von dem Haupterinnerung.[1] Ein Cache ist ein kleinerer, schnellerer Speicher, der näher an a liegt Prozessorkern, in dem Kopien der Daten von häufig verwendeten Hauptdaten gespeichert sind Speicherorte. Die meisten CPUs haben eine Hierarchie von mehreren Cache Ebenen (L1, L2, oft L3 und selten sogar L4) mit unterschiedlichen Befehlsspezifischen und datenspezifischen Caches auf Stufe 1.

Es gibt andere Arten von Caches (die nicht auf die "Cache -Größe" der wichtigsten Caches gezählt werden) wie die Übersetzungs -Lookaside -Puffer (TLB), was Teil der ist Speicherverwaltungseinheit (MMU) die die meisten CPUs haben.

Überblick

Beim Versuch, von einem Ort im Hauptspeicher zu lesen oder an einen Ort zu schreiben, überprüft der Prozessor, ob sich die Daten aus diesem Standort bereits im Cache befinden. In diesem Fall liest der Prozessor aus dem Cache anstelle des viel langsameren Hauptspeichers oder schreibt sie in den Cache.

Viele modern Desktop, Serverund industrielle CPUs haben mindestens drei unabhängige Caches:

Befehlscache
Wird verwendet, um die ausführbaren Anweisungen zu beschleunigen,
Datencache
Wird verwendet, um Daten zu beschleunigen und zu speichern; Der Datencache wird normalerweise als Hierarchie mehr Cache -Ebenen organisiert (L1, L2 usw.; siehe auch Multi-Level-Caches unter).
Übersetzungs -Lookaside -Puffer (TLB)
Wird verwendet, um die Übersetzung von virtuellen zu physischen Adressen sowohl für ausführbare Anweisungen als auch für Daten zu beschleunigen. Ein einzelner TLB kann sowohl für den Zugriff auf Anweisungen als auch auf Daten bereitgestellt werden, oder ein separater Anweisungen TLB (ITLB) und Daten TLB (DTLB) können bereitgestellt werden. Der TLB -Cache ist jedoch Teil der Speicherverwaltungseinheit (MMU) und nicht in direktem Zusammenhang mit den CPU -Caches.

Geschichte

Hauptplatine von a NextCube Computer (1990). Am unteren Rand des von der Mitte links links links links liegenden CPU Motorola 68040 bei 25 betrieben MHz Mit zwei separaten Stufe 1 -Caches von jeweils 4 KIB auf dem Chip, einer für die Anweisungen und eine für Daten. Das Board hat keinen externen L2 -Cache.

Frühe Beispiele für CPU -Caches umfassen die Atlas 2[2] und die IBM System/360 Modell 85[3] In den 1960ern. Der erste CPUs, der einen Cache verwendete, hatte nur eine Cache -Ebene; Im Gegensatz zum späteren Level -1 -Cache wurde es nicht in L1D (für Daten) und L1I (für Anweisungen) aufgeteilt. Split L1 Cache begann 1976 mit dem IBM 801 ZENTRALPROZESSOR,[4][5] wurde Ende der 1980er Jahre Mainstream und trat 1997 mit dem ARMV5TE in den eingebetteten CPU -Markt ein. Im Jahr 2015 teilte selbst Sub-Dollar-SOC den L1-Cache auf. Sie haben auch L2 -Caches und für größere Prozessoren auch L3 -Caches. Der L2 -Cache wird normalerweise nicht aufgeteilt und wirkt als gemeinsames Repository für den bereits geteilten L1 -Cache. Jeder Kern von a Multi-Core-Prozessor hat einen dedizierten L1 -Cache und wird normalerweise nicht zwischen den Kernen geteilt. Der L2-Cache und höhere Caches können zwischen den Kernen geteilt werden. L4 Cache ist derzeit ungewöhnlich und ist im Allgemeinen eingeschaltet (eine Form von) Dynamischer Direktzugriffsspeicher (Dram) und nicht auf Statische Zufallszugriffsgedächtnis (SRAM), auf einem separaten Würfel oder Chip (außergewöhnlich die Form,, edram wird für alle Cache -Ebenen verwendet, bis L1). Dies war auch historisch mit L1 der Fall, während größere Chips die Integration und im Allgemeinen alle Cache -Ebenen mit der möglichen Ausnahme des letzten Levels ermöglicht haben. Jeder zusätzliche Cache -Niveau ist tendenziell größer und unterschiedlich optimiert.

Caches (wie für RAM historisch gesehen) wurden im Allgemeinen in Befugnissen von: 2, 4, 8, 16 usw. gegründet. Kib; Wenn MiB Größen (d. H. Für größere Nicht-L1) brach sehr früh das Muster zusammen, um größere Caches zu ermöglichen, ohne in das Paradigma der Verdoppelung in Größe gezwungen zu werden, mit z. Intel Core 2 Duo Mit 3 MIB L2 -Cache im April 2008. viel später für L1 IBM ZEC12 Ab 2012 ist eine Ausnahme, um ungewöhnlich große 96 KIB L1 -Datencache für seine Zeit und z. das IBM Z13 mit einem 96 KIB L1 -Befehlscache (und 128 KIB L1 -Datencache),[6] und Intel Ice Lake-Basierte Prozessoren aus dem Jahr 2018 mit 48 KIB L1 -Datencache und 48 KIB L1 -Befehlscache. Im Jahr 2020 einige Intel Atom CPUs (mit bis zu 24 Kernen) haben (mehrere) 4,5 MIB- und 15 MIB -Cache -Größen.[7][8]

Cache -Einträge

Die Daten werden in Blöcken fester Größe zwischen Speicher und Cache übertragen, genannt Cache -Zeilen oder Cache -Blöcke. Wenn eine Cache -Zeile aus dem Speicher in den Cache kopiert wird, wird ein Cache -Eintrag erstellt. Der Cache -Eintrag enthält sowohl die kopierten Daten als auch den angeforderten Speicherort (als Tag bezeichnet).

Wenn der Prozessor einen Speicherort im Speicher lesen oder schreiben muss, überprüft er zunächst einen entsprechenden Eintrag im Cache. Die Cache -Überprüfungen für den Inhalt des angeforderten Speicherorts in allen Cache -Zeilen, die diese Adresse enthalten könnten. Wenn der Prozessor feststellt, dass sich der Speicherort im Cache befindet, ist a Cache Hit ist vorgefallen. Wenn der Prozessor jedoch den Speicherort im Cache nicht findet, a Cache Miss ist vorgefallen. Bei einem Cache -Treffer liest der Prozessor die Daten sofort in der Cache -Zeile. Für einen Cache -Miss verteilt der Cache einen neuen Eintrag und kopiert Daten aus dem Hauptspeicher, dann wird die Anforderung aus dem Inhalt des Cache erfüllt.

Richtlinien

Ersatzrichtlinien

Um Platz für den neuen Eintrag in einem Cache -Miss zu schaffen, muss der Cache möglicherweise einen der vorhandenen Einträge räumen. Die Heuristik, mit der sie den Eintrag zur REVICT auswählt, wird als Ersatzrichtlinie bezeichnet. Das grundlegende Problem bei jeder Ersatzrichtlinie besteht darin, dass es vorhersagen muss, welcher vorhandene Cache -Eintrag in Zukunft am wenigsten verwendet wird. Die Vorhersage der Zukunft ist schwierig, daher gibt es keine perfekte Methode, um zwischen den verfügbaren Ersatzrichtlinien zu wählen. Eine beliebte Ersatzrichtlinie, zuletzt benutzt (LRU) ersetzt den am wenigsten zugänglichen Eintrag.

Das Markieren einiger Gedächtnisbereiche als nicht zugeschneidertes kann die Leistung verbessern, indem das Zwischenspeicher von Speicherregionen vermieden wird, die selten wieder zuständig sind. Dies vermeidet den Overhead, etwas in den Cache zu laden, ohne wiederverwendung zu werden. Cache -Einträge können je nach Kontext auch deaktiviert oder gesperrt werden.

Richtlinien schreiben

Wenn Daten in den Cache geschrieben werden, muss sie irgendwann auch in den Hauptspeicher geschrieben werden. Der Zeitpunkt dieses Schreibens ist als Schreibrichtlinie bekannt. In einem Schreibschreibe Cache, jeder Schreiben in den Cache führt zu einem Schreiben in den Hauptspeicher. Alternativ in a Schreib zurück oder Copy-Back-Cache, Schreibvorgänge werden nicht sofort auf den Hauptspeicher widerspiegelt, und der Cache verfolgt stattdessen, über die Standorte geschrieben wurden, und markieren sie als schmutzig. Die Daten an diesen Stellen werden nur dann in den Hauptspeicher zurückgeschrieben, wenn diese Daten aus dem Cache vertrieben werden. Aus diesem Grund erfordert ein Leseverschluss in einem Writ-Back-Cache manchmal zwei Speicherzugriffe auf den Service: einen, der zuerst den schmutzigen Standort an den Hauptspeicher und dann einen weiteren zum neuen Standort aus dem Speicher schreibt. Ein Schreiben an einen Hauptspeicherort, der noch nicht in einem Writ-Back-Cache zugeordnet ist, kann einen bereits schmutzigen Ort ermöglichen, wodurch dieser Cache-Speicherplatz für den neuen Speicherort befreit wird.

Es gibt auch Zwischenrichtlinien. Der Cache kann durchschreiben, aber die Schreibvorgänge können vorübergehend in einer Store-Datenwarteschlange enthalten sein, sodass in der Regel mehrere Geschäfte zusammen verarbeitet werden können (was die Bus-Turnarounds reduzieren und die Busauslastung verbessern kann).

Zwischengespeicherte Daten aus dem Hauptspeicher können durch andere Entitäten geändert werden (z. B. Peripheriegeräte verwenden direkter Speicherzugriff (DMA) oder ein anderer Kern in a Multi-Core-Prozessor), in diesem Fall kann die Kopie im Cache veraltet oder abgestanden werden. Alternativ, wenn eine CPU in a Multiprozessor System aktualisiert Daten im Cache, Kopien von Daten in mit anderen CPUs verbundenen Caches werden abgestanden. Kommunikationsprotokolle zwischen den Cache -Managern, die die Daten konsistent halten Cache -Kohärenz Protokolle.

Cache -Leistung

Cache -Leistungsmessung ist in jüngster Zeit wichtig geworden, wo die Geschwindigkeitsunterschiede zwischen der Speicherleistung und der Prozessorleistung exponentiell zunimmt. Der Cache wurde eingeführt, um diese Geschwindigkeitslücke zu verringern. Wenn Sie wissen, wie gut der Cache in der Lage ist, die Lücke in der Geschwindigkeit von Prozessor und Speicher zu überbrücken, wird insbesondere in Hochleistungssystemen wichtig. Die Cache -Trefferquote und der Cache -Missrate spielen eine wichtige Rolle bei der Bestimmung dieser Leistung. Um die Cache -Leistung zu verbessern, wird die Reduzierung der Fehlrate zu einem der notwendigen Schritte unter anderem. Die Verlängerung der Zugriffszeit auf den Cache erhöht auch seine Leistung.

CPU -Stände

Die Zeit, die benötigt wird, um eine Cache -Zeile aus dem Speicher zu holen (lesen Sie Latenz Aufgrund eines Cache -Miss) ist es wichtig, weil der CPU die Dinge ausgeht, während er auf die Cache -Linie wartet. Wenn eine CPU diesen Zustand erreicht, wird sie als Stand bezeichnet. Da CPUs im Vergleich zum Hauptspeicher schneller werden, verdrängen Stände aufgrund von Cache -Misses eine potenzielle Berechnung. Moderne CPUs können Hunderte von Anweisungen in der Zeit ausführen, die zum Hauptspeicher aus einer einzigen Cache -Zeile abgerufen wurde.

Es wurden verschiedene Techniken eingesetzt, um die CPU in dieser Zeit zu beschäftigen, einschließlich Ausführende Ausführung in dem die CPU versucht, unabhängige Anweisungen nach der Anweisung auszuführen, die auf die Cache -Missdaten wartet. Eine andere Technologie, die von vielen Prozessoren verwendet wird, ist Simultanes Multithreading (SMT), mit dem ein alternativer Thread den CPU -Kern verwenden kann, während der erste Thread darauf wartet, dass die erforderlichen CPU -Ressourcen verfügbar werden.

Assoziativität

Eine Darstellung verschiedener Möglichkeiten, wie Speicherorte von bestimmten Cache -Stellen zwischengespeichert werden können

Das Platzierungspolitik Entscheidet, wo im Cache eine Kopie eines bestimmten Eintrags des Hauptspeichers gehen wird. Wenn die Platzierungsrichtlinie frei ist, um einen Eintrag im Cache für die Kopie auszuwählen, wird der Cache aufgerufen voll assoziativ. Bei der anderen Extremität ist der Cache, wenn jeder Eintrag im Hauptspeicher nur an einem Ort im Cache gehen kann Direkt-abgebildet. Viele Caches implementieren einen Kompromiss, bei dem jeder Eintrag in den Hauptspeicher an einen von N-Orten im Cache gehen kann und als N-Way-Set-Associativ beschrieben wird.[9] Zum Beispiel der Level-1-Datencache in einem Amd Athlon IS Zwei-Wege-Set Associativ, was bedeutet, dass ein bestimmter Ort im Hauptspeicher an zwei Stellen im Stufe-1-Datencache zwischengespeichert werden kann.

Die Auswahl des richtigen Wertes der Assoziativität beinhaltet a Abtausch. Wenn es zehn Stellen gibt, an denen die Platzierungsrichtlinie einen Speicherort zugeordnet hat, müssen zehn Cache -Einträge gesucht werden, um zu überprüfen, ob sich dieser Ort im Cache befindet. Das Überprüfen von mehr Orten erfordert mehr Strom- und Chipbereich und möglicherweise mehr Zeit. Andererseits erleiden Caches mit mehr Assoziativität weniger Fehler (siehe Konfliktfehlungen), so dass die CPU weniger Zeit verschwendet, wenn sie aus dem langsamen Hauptgedächtnis lesen. Die allgemeine Richtlinie lautet, dass die Verdoppelung der Assoziativität von direktem zugeordnetem bis zweiwegs oder von zwei Wege bis zu vier Wege etwa den gleichen Effekt auf die Erhöhung der Trefferquote wie die Verdoppelung der Cache-Größe hat. Die Erhöhung der Assoziativität um mehr als vier verbessert die Trefferquote jedoch nicht so stark[10] und werden im Allgemeinen aus anderen Gründen durchgeführt (siehe Virtuelles Aliasing). Einige CPUs können die Associativität ihrer Caches in geringen Stromzuständen dynamisch verringern, was als macherungssparende Maßnahme wirkt.[11]

In der Reihenfolge von schlechteren, aber einfach zu besseren, aber komplexen:

  • Direkt zugeordneter Cache-gute Best-Case-Zeit, aber im schlimmsten Fall unvorhersehbar
  • Zwei-Wege-Set-assoziativen Cache
  • Zwei-Wege-verzerrter assoziativer Cache[12]
  • Vier-Wege-Set-Assoziativ-Cache
  • Acht-Wege-Set-Associativ-Cache, eine gemeinsame Wahl für spätere Implementierungen
  • 12-Wege-Set-assoziativen Cache, ähnlich wie acht Wege
  • Vollständiger Cache - die besten Fehlpreise, aber nur für eine kleine Anzahl von Einträgen praktisch

Direkt-abgebildeter Cache

In dieser Cache -Organisation kann jeder Standort im Hauptspeicher nur einen Eintrag im Cache angeben. Daher kann ein direkt eingebauter Cache auch als "Einweg-Set-assoziativer" -Cache bezeichnet werden. Es gibt keine Platzierungsrichtlinie als solche, da es keine Auswahl gibt, welcher Cache -Inhalt von Cache -Einträgen räumt. Dies bedeutet, dass zwei Standorte, wenn sie denselben Eintrag abgeben, sich ständig gegenseitig ausschalten können. Obwohl einfacher, muss ein direkt eingebautes Cache viel größer sein als ein assoziativer, um eine vergleichbare Leistung zu erzielen, und er ist unvorhersehbarer. Lassen x Blocknummer im Cache sein, y Blocknummer des Speichers sein und n Anzahl der Blöcke im Cache, dann erfolgt die Zuordnung mit Hilfe der Gleichung x = y Mod n.

Zwei-Wege-Set-assoziativen Cache

Wenn jeder Ort im Hauptspeicher an einem der zwei Stellen im Cache zwischengespeichert werden kann, lautet eine logische Frage: Welches der beiden? Das einfachste und am häufigsten verwendete Schema, das im obigen Diagramm der rechten Hand gezeigt wird, besteht darin, die am wenigsten signifikanten Bits des Index des Speicherorts als Index für den Cache-Speicher zu verwenden und zwei Einträge für jeden Index zu haben. Ein Vorteil dieses Schemas besteht darin, dass die im Cache gespeicherten Tags nicht den Teil der Hauptspeicheradresse enthalten müssen, die im Index des Cache -Speichers impliziert wird. Da die Cache -Tags weniger Bits haben, benötigen sie weniger Transistoren, nehmen weniger Platz auf der Prozessorschaltplatte oder auf dem Mikroprozessorchip und können schneller gelesen und verglichen werden. Ebenfalls LRU ist besonders einfach, da für jedes Paar nur ein Bit gespeichert werden muss.

Spekulative Ausführung

Einer der Vorteile eines direkt eingestellten Cache ist, dass er einfach und schnell ermöglicht Spekulation. Sobald die Adresse berechnet wurde, ist der einzige Cache -Index bekannt, der möglicherweise eine Kopie dieses Ortes im Speicher hat. Dieser Cache -Eintrag kann gelesen werden, und der Prozessor kann weiterhin mit diesen Daten arbeiten, bevor er beendet wird, dass das Tag tatsächlich mit der angeforderten Adresse übereinstimmt.

Die Idee, dass der Prozessor die zwischengespeicherten Daten vor dem Abschluss der Tag -Übereinstimmung verwendet, kann auch auf assoziative Caches angewendet werden. Eine Teilmenge des Tags, genannt a Hinweis, kann verwendet werden, um nur einen der möglichen Cache -Einträge auszuwählen, die an die angeforderte Adresse zugeordnet werden. Der vom Hinweis ausgewählte Eintrag kann dann parallel zum Überprüfen des vollständigen Tags verwendet werden. Die Hinweistechnik funktioniert am besten im Zusammenhang mit der Adressübersetzung, wie unten erläutert.

Zwei-Wege-verzerrter assoziativer Cache

Andere Programme wurden vorgeschlagen, wie die verzerrter Cache,[12] wobei der Index für den Weg 0 direkt ist, wie oben, aber der Index für Weg 1 wird mit a gebildet Hash-Funktion. Eine gute Hash -Funktion hat das Eigentum, das sich befasst, welche Konflikt mit der direkten Kartierung in der Regel nicht konflikt Muster. Der Nachteil ist eine zusätzliche Latenz aus der Berechnung der Hash -Funktion.[13] Wenn es Zeit ist, eine neue Linie zu laden und eine alte Linie zu vertreiben, kann es schwierig sein zu bestimmen, welche vorhandene Linie am wenigsten verwendet wurde, da die neue Linie in jeder Hinsicht mit Daten in verschiedenen Indizes konflikt. LRU Die Verfolgung von nicht skwedischen Caches erfolgt normalerweise pro Set. Trotzdem haben schief assoziative Caches große Vorteile gegenüber herkömmlichen Set-assoziativen.[14]

Pseudo-Assoziativ-Cache

Ein echter Set-assoziativ-Cache-Test testet alle möglichen Arten gleichzeitig mit etwas wie a Inhaltsadressible Speicher. Ein pseudo-assoziatives Cache-Cache testet jeweils eine mögliche Weise. Ein Hash-Rehash-Cache und ein Spalten-Assoziativ-Cache sind Beispiele für einen Pseudo-assoziativen Cache.

In dem gemeinsamen Fall, dass ein Treffer in der ersten Art und Weise getestet wurde, ist ein pseudo-assoziativer Cache so schnell wie ein direkt eingestellter Cache, aber er hat einen viel niedrigeren Konfliktfehlersatz als ein direkt eingeklemmter Cache, näher an der Fehlrate eines vollständig assoziativen Cache.[13]

Cache -Eingabestruktur

Cache -Zeileneinträge haben normalerweise die folgende Struktur:

Schild Datenblock Flaggenbits

Das Datenblock (Cache -Zeile) enthält die tatsächlichen Daten aus dem Hauptspeicher. Das Schild Enthält (Teil) die Adresse der tatsächlichen Daten, die aus dem Hauptspeicher abgerufen wurden. Die Flaggenbits sind nachfolgend diskutiert.

Die "Größe" des Cache ist die Menge an Hauptspeicherdaten, die er halten kann. Diese Größe kann als Anzahl der in den einzelnen Datenblocken gespeicherten Bytes berechnet werden. Die Anzahl der im Cache gespeicherten Blöcke. (Das Tag, die Flagge und Fehlerkorrekturcode Bits sind nicht in der Größe enthalten,[15] Obwohl sie den physischen Bereich eines Cache beeinflussen.)

Eine effektive Speicheradresse, die mit der Cache -Zeile (Speicherblock) einhergeht, wird geteilt (MSB zu LSB) In das Tag, den Index und den Blockversatz.[16][17]

Schild Index Blockversatz

Der Index beschreibt, welcher Cache -Satz, den die Daten eingegeben haben Bits für s Cache -Sets.

Der Block -Offset gibt die gewünschten Daten innerhalb des gespeicherten Datenblocks innerhalb der Cache -Zeile an. In der Regel befindet sich die effektive Adresse in Bytes, sodass die Blockversatzlänge ist Bits, wo b ist die Anzahl der Bytes pro Datenblock. Das Tag enthält die wichtigsten Bits der Adresse, die im aktuellen Satz gegen alle Zeilen überprüft werden (der Satz wurde mit Index abgerufen), um festzustellen, ob diese Menge die angeforderte Adresse enthält. Wenn dies der Fall ist, tritt ein Cache -Treffer auf. Die Etikettlänge in Bits lautet wie folgt:

Tag_Length = address_length - index_length - block_offset_length

Einige Autoren bezeichnen den Blockversatz einfach als "Offset" als "Offset"[18] oder die "Verschiebung".[19][20]

Beispiel

Das Original Pentium 4 Der Prozessor hatte einen Vier-Wege-Set assoziativen L1-Datencache von 8Kib in Größe, mit 64-Byte-Cache-Blöcken. Daher gibt es 8 KIB/64 = 128 Cache -Blöcke. Die Anzahl der Sets entspricht der Anzahl der Cache -Blöcke, die durch die Anzahl der Assoziativitätsweisen geteilt sind, was zu 128/4 = 32 Sätzen führt, und daher 25= 32 verschiedene Indizes. Da sind 26= 64 mögliche Offsets. Da die CPU-Adresse 32 Bit breit ist, bedeutet dies 32-5-6 = 21 Bit für das Tag-Feld.

Der ursprüngliche Pentium 4-Prozessor hatte außerdem einen achtgiebigen assoziativen L2-integrierten Cache 256-KIB mit 128-Byte-Cache-Blöcken. Dies impliziert 32-8-7 = 17 Bit für das Tag-Feld.[18]

Flaggenbits

Ein Anweisungs -Cache erfordert nur ein Flag -Bit pro Cache -Zeileneintrag: ein gültiges Bit. Das gültige Bit gibt an, ob ein Cache -Block mit gültigen Daten geladen wurde oder nicht.

Beim Power-up legt die Hardware alle gültigen Bits in allen Caches auf "ungültig" fest. Einige Systeme setzen auch zu anderen Zeiten ein gültiges Bit auf "ungültig", z. B. wenn Multi-Master Bus schnüffeln Hardware im Cache eines Prozessors hört eine Adresse, die von einem anderen Prozessor ausgestrahlt wird, und erkennt, dass bestimmte Datenblöcke im lokalen Cache jetzt abgeschlossen sind und ungültig markiert werden sollten.

Ein Datencache erfordert normalerweise zwei Flag -Bits pro Cache -Zeile - ein gültiges Bit und a schmutziges Stück. Ein schmutziges Bit -Set gibt an, dass die zugehörige Cache -Zeile seit dem Lesen des Hauptspeichers ("schmutzig") geändert wurde, was bedeutet, dass der Prozessor Daten in diese Zeile geschrieben hat und der neue Wert nicht bis zum Hauptspeicher ausbreit .

Cache Miss

Ein Cache -Miss ist ein fehlgeschlagener Versuch, ein Datenstück in den Cache zu lesen oder zu schreiben, was zu einem Hauptspeicherzugriff mit einer viel längeren Latenz führt. Es gibt drei Arten von Cache -Misses: Anweisung Lesen Sie Miss, Daten lesen Miss und Daten schreiben Miss.

Cache Read Misses von einem Anweisung Cache verursacht im Allgemeinen die größte Verzögerung, da der Prozessor oder zumindest der Ausführungsfaden, muss warten (Stand), bis die Anweisung aus dem Hauptspeicher abgerufen wird. Cache Read Misses von einem Daten Cache führt normalerweise zu einer geringeren Verzögerung, da Anweisungen, die nicht vom Cache -Lesen abhängig sind, ausgegeben werden können und die Ausführung fortsetzen können, bis die Daten aus dem Hauptspeicher zurückgegeben werden und die abhängigen Anweisungen die Ausführung fortsetzen können. Cache -Schreibfehlungen zu einem Daten Cache verursacht im Allgemeinen die kürzeste Verzögerung, da das Schreiben in die Warteschlange gestellt werden kann und die Ausführung nachfolgender Anweisungen nur wenige Einschränkungen gibt. Der Prozessor kann fortgesetzt werden, bis die Warteschlange voll ist. Eine detaillierte Einführung in die Arten von Fehler finden Sie unter Cache -Leistungsmessung und Metrik.

Adressübersetzung

Die meisten allgemeinen CPUs implementieren eine Form von virtueller Speicher. Zusammenfassend sieht jedes Programm, das auf der Maschine ausgeführt wird Adressraum, der Code und Daten nur für dieses Programm enthält, oder alle Programme, die in einem gemeinsamen virtuellen Adressraum ausgeführt werden. Ein Programm führt durch Berechnen, Vergleich, Lesen und Schreiben mit Adressen seines virtuellen Adressraums aus und nicht an Adressen des physischen Adressraums, wodurch Programme einfacher und einfacher zu schreiben sind.

Der virtuelle Speicher erfordert, dass der Prozessor virtuelle Adressen übersetzt, die vom Programm in physische Adressen im Hauptspeicher generiert werden. Der Teil des Prozessors, der diese Übersetzung macht Speicherverwaltungseinheit (MMU). Der schnelle Weg durch die MMU kann die in der gespeicherten Übersetzungen durchführen Übersetzungs -Lookaside -Puffer (TLB), ein Cache von Zuordnungen aus dem Betriebssystem Seitentabelle, Segmenttabelle oder beides.

Für die Zwecke der vorliegenden Diskussion gibt es drei wichtige Merkmale der Adressübersetzung:

  • Latenz: Die physische Adresse ist von der MMU einige Zeit verfügbar, vielleicht einige Zyklen, nachdem die virtuelle Adresse beim Adressgenerator verfügbar ist.
  • Aliasing: Mehrere virtuelle Adressen können einer einzelnen physischen Adresse zugeordnet werden. Die meisten Prozessoren garantieren, dass alle Aktualisierungen dieser einzelnen physischen Adresse in der Programmreihenfolge stattfinden. Um diese Garantie zu liefern, muss der Prozessor sicherstellen, dass sich zu einem bestimmten Zeitpunkt nur eine Kopie einer physischen Adresse im Cache befindet.
  • Die Granularität: Der virtuelle Adressraum wird in Seiten unterteilt. Zum Beispiel eine 4Gib Der virtuelle Adressraum kann in 1.048.576 Seiten mit 4 KIB -Größe unterteilt werden, von denen jedes unabhängig voneinander zugeordnet werden kann. Möglicherweise werden mehrere Seitengrößen unterstützt. sehen virtueller Speicher zur Ausarbeitung.

Einige frühe virtuelle Speichersysteme waren sehr langsam, da sie einen Zugriff auf die Seitentabelle (im Hauptspeicher) vor jedem programmierten Zugriff auf den Hauptspeicher benötigten.[NB 1] Mit No Caches senkte dies die Geschwindigkeit des Speicherzugriffs in zwei Hälften. Der erste in einem Computersystem verwendete Hardware -Cache war eigentlich kein Daten- oder Anweisungs -Cache, sondern ein TLB.[22]

Caches können in vier Typen unterteilt werden, basierend darauf, ob der Index oder das Tag physischen oder virtuellen Adressen entspricht:

  • Physisch indiziert, physisch markiert (PIPT) Caches verwenden die physische Adresse sowohl für den Index als auch für das Tag. Dies ist zwar einfach und vermeidet Probleme mit dem Aliasing, aber auch langsam, da die physische Adresse nachgeschlagen werden muss (was einen TLB -Fehlschlag und den Zugriff auf den Hauptspeicher beinhalten kann), bevor diese Adresse im Cache nachgeschlagen werden kann.
  • Praktisch indiziert, praktisch markiert (Vivt) Caches verwenden die virtuelle Adresse sowohl für den Index als auch für das Tag. Dieses Caching -Schema kann zu viel schnelleren Suche führen, da die MMU nicht zuerst konsultiert werden muss, um die physische Adresse für eine bestimmte virtuelle Adresse zu bestimmen. VIVT leidet jedoch unter Aliasing -Problemen, bei denen verschiedene virtuelle Adressen möglicherweise auf dieselbe physische Adresse verweisen können. Das Ergebnis ist, dass solche Adressen trotz des gleichen Speichers separat zwischengespeichert werden, was Kohärenzprobleme verursacht. Obwohl Lösungen für dieses Problem existieren [23] Sie arbeiten nicht für Standard -Kohärenzprotokolle. Ein weiteres Problem sind Homonyme, bei denen dieselbe virtuelle Adressadresse zu verschiedenen physischen Adressen kartiert. Es ist nicht möglich, diese Zuordnungen lediglich zu unterscheiden, indem sie sich den virtuellen Index selbst ansehen, obwohl potenzielle Lösungen: Spülung des Cache nach a umfassen Kontextschalter, erzwingen die Adressräume, die nicht überlappend sind, und markieren Sie die virtuelle Adresse mit einer ASID-ID (Adressraum-ID). Darüber hinaus gibt es ein Problem, dass sich virtuelle zu physikalische Zuordnungen ändern können, die Spülencache-Linien erfordern, da die VAS nicht mehr gültig wäre. Alle diese Probleme fehlen, wenn Tags physische Adressen (Vipt) verwenden.
  • Praktisch indiziert, physisch markiert (Vipt) Caches verwenden die virtuelle Adresse für den Index und die physische Adresse im Tag. Der Vorteil gegenüber der Strecke ist eine geringere Latenz, da die Cache -Linie parallel zur TLB -Übersetzung nachgeschlagen werden kann. Das Tag kann jedoch erst verglichen werden, wenn die physische Adresse verfügbar ist. Der Vorteil gegenüber VIVT ist, dass der Cache, da das Tag über die physische Adresse verfügt, Homonyme erkennen kann. Theoretisch benötigt Vipt mehr Tags -Bits, da einige der Indexbits zwischen den virtuellen und physikalischen Adressen (z. B. Bit 12 und höher für 4 KIB -Seiten) unterschiedlich sein könnten und sowohl in den virtuellen Index als auch in das physische Tag aufgenommen werden müssten. In der Praxis ist dies kein Problem, da Vipt -Caches, um Kohärenzprobleme zu vermeiden, keine solchen Indexbits aufweisen (z. B. durch Begrenzung der Gesamtzahl der Bits für den Index und den Blockversatz auf 12 für 4 KIB -Seiten) ; Dies begrenzt die Größe von Vipt -Caches auf die Seitengröße, die die Assoziativität des Cache.
  • Physisch indiziert, praktisch markiert (PIVT) Caches werden häufig in der Literatur als nutzlos und nicht existieren beansprucht.[24] Allerdings die MIPS R6000 Verwendet diesen Cache -Typ als einzige bekannte Implementierung.[25] Der R6000 wird in implementiert Emitter-gekoppelte Logik, was eine extrem schnelle Technologie ist, die für große Erinnerungen wie a nicht geeignet ist Tlb. Der R6000 löst das Problem, indem der TLB-Speicher in einen reservierten Teil des Cache der zweiten Stufe mit einem winzigen Hochgeschwindigkeits-TLB-Slice auf Chip eingebaut wird. Der Cache wird durch die physikalische Adresse indiziert, die aus dem TLB -Slice erhalten wurde. Da die TLB -Slice jedoch nur die virtuellen Adressbits übersetzt, die zum Index des Cache erforderlich sind und keine Tags verwenden, können falsche Cache -Treffer auftreten, die durch das Markieren mit der virtuellen Adresse gelöst werden.

Die Geschwindigkeit dieses Wiederauftretens (die Lastlatenz) ist entscheidend für die CPU-Leistung, und so sind die meisten modernen Level-1-Caches praktisch indiziert, was es zumindest ermöglicht, die TLB-Suchanlage der MMU parallel zum Abholen der Daten aus dem Cache-RAM zu verfolgen.

Die virtuelle Indizierung ist jedoch nicht die beste Wahl für alle Cache -Ebenen. Die Kosten für den Umgang mit virtuellen Aliase wachsen mit der Cache-Größe, und infolgedessen werden die meisten Stufe 2 und größere Caches physikalisch indiziert.

Caches haben historisch sowohl virtuelle als auch physische Adressen für die Cache -Tags verwendet, obwohl das virtuelle Tagging jetzt ungewöhnlich ist. Wenn die TLB -Lookup vor der Cache -RAM -Suche fertiggestellt werden kann, ist die physische Adresse rechtzeitig zum Tag -Vergleich verfügbar, und es ist kein virtuelles Tagging erforderlich. Große Caches sind also in der Regel physikalisch markiert, und nur kleine, sehr niedrige Latenz -Caches werden praktisch markiert. In der jüngsten CPUs im Allgemeinen wurde das virtuelle Tagging von VHINTS, wie nachstehend beschrieben, ersetzt.

Homonym- und Synonymprobleme

Ein Cache, der sich auf die virtuelle Indizierung und Markierung stützt, wird inkonsistent, nachdem dieselbe virtuelle Adresse in verschiedene physische Adressen abgebildet ist (in verschiedenen physischen Adressen (Homonym), die durch Verwendung der physischen Adresse zum Markieren oder durch Speichern der Adressraumkennung in der Cache -Zeile gelöst werden kann. Der letztere Ansatz hilft jedoch nicht gegen die Synonym Problem, in dem mehrere Cache -Linien Daten für dieselbe physische Adresse speichern. Das Schreiben an solche Standorte kann nur einen Ort im Cache aktualisieren, sodass die anderen inkonsistente Daten hinterlassen. Dieses Problem kann gelöst werden, indem nicht überlappende Speicherlayouts für verschiedene Adressräume verwendet werden, oder anderweitig der Cache (oder ein Teil davon) muss bei Änderungen der Zuordnung gespült werden.[26]

Virtuelle Tags und VHints

Der große Vorteil von virtuellen Tags besteht darin, dass das Tag -Match für assoziative Caches vor der virtuellen bis physischen Übersetzung fortgesetzt wird. Kohärenzsonden und Räumungen weisen jedoch eine physische Adresse für Handlungen vor. Die Hardware muss über einige Mittel verfügen, um die physischen Adressen in einen Cache -Index zu konvertieren, indem sie sowohl physische Tags als auch virtuelle Tags speichern. Zum Vergleich muss ein physikalisch markiertes Cache keine virtuellen Tags aufbewahren, was einfacher ist. Wenn eine virtuelle bis physische Zuordnung aus dem TLB gelöscht wird, müssen Cache -Einträge mit diesen virtuellen Adressen irgendwie gespült werden. Wenn Cache -Einträge auf Seiten, die nicht vom TLB nicht zugeordnet sind, zulässig sind, müssen diese Einträge in der Seitentabelle geändert werden, wenn die Zugriffsrechte auf diesen Seiten geändert werden.

Das Betriebssystem ist auch möglich, sicherzustellen, dass keine virtuellen Aliase im Cache gleichzeitig sind. Das Betriebssystem bietet diese Garantie durch Durchsetzung der unten beschriebenen Seitenfärbung. Einige frühe RISC -Prozessoren (SPARC, RS/6000) verfolgten diesen Ansatz. Es wurde in letzter Zeit nicht verwendet, da die Hardwarekosten für die Erkennung und Räumung virtueller Aliase gefallen sind und die Komplexität der Software und die Leistungsstrafe der perfekten Seitenfärbung gestiegen sind.

Es kann nützlich sein, die beiden Funktionen von Tags in einem assoziativen Cache zu unterscheiden: Sie werden verwendet, um zu bestimmen, welchen Weg des Eintragssatzes ausgewählt werden soll, und sie werden verwendet, um festzustellen, ob der Cache getroffen oder verpasst wird. Die zweite Funktion muss immer korrekt sein, ist jedoch zulässig, damit die erste Funktion erraten und gelegentlich die falsche Antwort erhalten kann.

Einige Prozessoren (z. B. frühe Sparcs) haben Caches mit virtuellen und physischen Tags. Die virtuellen Tags werden für die Auswahl der Möglichkeit verwendet, und die physikalischen Tags werden zur Bestimmung von Hit oder Miss verwendet. Diese Art von Cache genießt den Latenzvorteil eines praktisch markierten Cache und die einfache Software -Schnittstelle eines physikalisch markierten Cache. Es trägt jedoch die zusätzlichen Kosten für doppelte Tags. Während der Missverarbeitung müssen die alternativen Wege der indizierten Cache -Linie auf virtuelle Aliase und alle ausgestatteten Übereinstimmungen untersucht werden.

Der zusätzliche Bereich (und etwas Latenz) kann durch Aufbewahrung gemindert werden Virtuelle Hinweise mit jedem Cache -Eintrag anstelle von virtuellen Tags. Diese Hinweise sind eine Untergruppe oder Hash des virtuellen Tags und werden zur Auswahl des Weges des Cache verwendet, aus dem Daten und ein physisches Tag abgerufen werden können. Wie ein praktisch markiertes Cache kann es eine virtuelle Tipp -Übereinstimmung, aber physische Tag -Fehlanpassung geben. In diesem Fall muss der Cache -Eintrag mit dem passenden Hinweis so vertrieben werden, dass der Cache -Zugriff nach der Cache -Füllung an dieser Adresse nur eine Tipp -Übereinstimmung enthält. Da virtuelle Hinweise weniger Teile haben als virtuelle Tags, die sie voneinander unterscheiden, erleidet ein praktisch angedeuteter Cache mehr Konfliktfehlungen als ein praktisch markiertes Cache.

Vielleicht findet sich die ultimative Reduzierung virtueller Hinweise im Pentium 4 (Willamette und Northwood Cores). In diesen Prozessoren beträgt der virtuelle Hinweis effektiv zwei Bits, und der Cache ist Vier-Wege-Set assoziativ. Effektiv behält die Hardware eine einfache Permutation von der virtuellen Adresse zum Cache -Index bei, so dass nein Inhaltsadressible Speicher (CAM) ist notwendig, um den richtigen der vier Arten auszuwählen.

Seitenfärbung

Große physikalisch indizierte Caches (normalerweise sekundäre Caches) stießen auf ein Problem: das Betriebssystem anstelle der Anwendungssteuerung, die Seiten im Cache miteinander kollidieren. Unterschiede in der Seitenzuweisung von einem Programm über den nächsten führen zu Unterschieden in den Cache -Kollisionsmustern, was zu sehr großen Unterschieden in der Programmleistung führen kann. Diese Unterschiede können es sehr schwierig machen, ein konsistentes und wiederholbares Timing für einen Benchmark -Lauf zu erhalten.

Um das Problem zu verstehen, betrachten Sie eine CPU mit einem 1-MIB, das physisch in den Direktkandidaten in der Stufe-2-Cache und 4 KIB-Virtual-Speicher-Seiten in indiziertem Indexal indexiert ist. Sequentielle physikalische Seiten zeichnen auf sequentielle Stellen im Cache bis nach 256 Seiten um den Mustern. Wir können jede physische Seite mit einer Farbe von 0–255 kennzeichnen, um zu kennzeichnen, wohin sie im Cache gehen kann. Standorte auf physischen Seiten mit unterschiedlichen Farben können im Cache nicht konflikt.

Programmierer, die versuchen, den Cache maximal zu nutzen, können die Zugriffsmuster ihrer Programme so ordnen, dass zu einem bestimmten Zeitpunkt nur 1 MIB Daten zwischengespeichert werden müssen, wodurch Kapazitätsfehlungen vermieden werden müssen. Sie sollten aber auch sicherstellen, dass die Zugangsmuster keine Konfliktfehlungen haben. Eine Möglichkeit, über dieses Problem nachzudenken, besteht darin, die virtuellen Seiten zu teilen, die das Programm verwendet, und ihnen virtuelle Farben auf die gleiche Weise zuzuordnen, wie es zuvor physische Seiten zugewiesen wurde. Programmierer können dann die Zugriffsmuster ihres Codes so anordnen, dass gleichzeitig keine zwei Seiten mit derselben virtuellen Farbe verwendet werden. Es gibt eine breite Literatur zu solchen Optimierungen (z. Schleifennestoptimierung), weitgehend von der Hochleistungs -Computing (HPC) Gemeinschaft.

Der Haken ist, dass alle in einem bestimmten Moment verwendeten Seiten unterschiedliche virtuelle Farben haben, einige jedoch die gleichen physischen Farben haben. Wenn das Betriebssystem virtuelle Seiten zufällig und einheitlich physische Seiten zuweist, ist es äußerst wahrscheinlich, dass einige Seiten die gleiche physische Farbe haben, und dann kollidieren Standorte dieser Seiten im Cache (dies ist die Geburtstagsparadox).

Die Lösung besteht darin, dass der Versuch des Betriebssystems, verschiedenen virtuellen Farben unterschiedliche physische Farbseiten zuzuweisen, eine Technik genannt Seitenfärbung. Obwohl die tatsächliche Zuordnung von virtueller zu physischer Farbe für die Systemleistung irrelevant ist, sind ungerade Zuordnungen schwer zu verfolgen und haben wenig Nutzen. Daher versuchen die meisten Ansätze für die Seite von Seite einfach, physische und virtuelle Seitenfarben gleich zu halten.

Wenn das Betriebssystem garantieren kann, dass jede physikalische Seite nur eine virtuelle Farbe kartiert, gibt es keine virtuellen Aliase, und der Prozessor kann praktisch indizierte Caches verwenden, ohne dass während der Misshandlung der virtuellen Alias ​​keine extra virtuellen Alias ​​-Sonden benötigt. Alternativ kann das Betriebssystem eine Seite aus dem Cache spülen, wenn es von einer virtuellen Farbe zu einer anderen ändert. Wie oben erwähnt, wurde dieser Ansatz für einige frühe SPARC- und RS/6000 -Designs verwendet.

Cache -Hierarchie in einem modernen Prozessor

Speicherhierarchie eines AMD -Bulldozer -Servers

Moderne Prozessoren haben mehrere interagierende On-Chip-Caches. Der Betrieb eines bestimmten Cache kann durch die Cache-Größe, die Cache-Blockgröße, die Anzahl der Blöcke in einem Satz, die Cache-Set-Ersatzrichtlinie und die Cache-Schreibrichtlinie (Schreib- oder Schreibback) vollständig angegeben werden.[18]

Während alle Cache-Blöcke in einem bestimmten Cache die gleiche Größe haben und die gleiche Assoziativität aufweisen, weisen typischerweise die Caches "niedrigerer Ebene" (Cache Level 1) eine geringere Anzahl von Blöcken, eine kleinere Blockgröße und weniger Blöcke in a auf Set, aber haben sehr kurze Zugriffszeiten. "Höhere Ebenen" -Kaches (d. H. Stufe 2 und höher) haben zunehmend größere Blöcke, größere Blockgröße, mehr Blöcke in einem Satz und relativ längere Zugriffszeiten, sind jedoch immer noch viel schneller als das Hauptspeicher.

Die Richtlinie zur Ersatzrechnung des Cache -Eintrags wird durch a bestimmt Cache -Algorithmus Ausgewählt, um von den Prozessordesignern implementiert zu werden. In einigen Fällen werden mehrere Algorithmen für verschiedene Arten von Arbeitsbelastungen bereitgestellt.

Spezialisierte Caches

Pipelined CPUs -Zugriffsspeicher aus mehreren Punkten in der Pipeline: Anweisungen abrufen, virtuell zu physisch Adressübersetzung und Daten abrufen (siehe Klassische RISC -Pipeline). Das natürliche Design besteht darin, für jeden dieser Punkte verschiedene physische Caches zu verwenden, damit keine physische Ressource geplant werden muss, um zwei Punkte in der Pipeline zu bedienen. Somit endet die Pipeline natürlich mit mindestens drei separaten Caches (Anweisung, Tlbund Daten), jede auf seine besondere Rolle spezialisiert.

Opfer -Cache

A Opfer -Cache ist ein Cache, mit dem Blöcke beim Austausch aus einem CPU -Cache vertrieben werden. Der Opfer -Cache liegt zwischen dem Hauptcache und seinem Nachfüllpfad und enthält nur die Datenblöcke, die aus dem Hauptcache vertrieben wurden. Der Opfer -Cache ist normalerweise vollständig assoziativ und soll die Anzahl der Konfliktfehlungen verringern. Viele häufig verwendete Programme benötigen keine assoziative Zuordnung für alle Zugriffe. Tatsächlich erfordern nur ein kleiner Teil des Speicherzugriffs des Programms eine hohe Assoziativität. Das Opfer -Cache nutzt diese Eigenschaft, indem sie nur diesen Zugriffszugriffe eine hohe Assoziativität bereitstellt. Es wurde von vorgestellt von Norman Jouppi Von Dezember 1990.[27]

Intel Crystalwell[28] Variante seiner Haswell Die Prozessoren führten ein On-Package 128 MB ein edram Level 4 -Cache, der als Opfer -Cache für den Cache der Prozessoren Level 3 dient.[29] In dem Skylake Mikroarchitektur Der Cache Level 4 funktioniert nicht mehr als Opfer -Cache.[30]

Spurencache

Eines der extremeren Beispiele für die Cache -Spezialisierung ist die Spurencache (auch bekannt als Ausführungsspuren -Cache) gefunden in der Intel Pentium 4 Mikroprozessoren. Ein Spurencache ist ein Mechanismus zur Erhöhung der Anweisungsbandbreite und zur Verringerung des Stromverbrauchs (im Fall des Pentiums 4) durch Speichern von Spuren von Anweisungen Das wurden bereits abgerufen und dekodiert.[31]

Ein Trace -Cache speichert Anweisungen, die entweder nach dem Dekodieren oder während des Ruhestands sind. Im Allgemeinen werden Anweisungen zu Spuren von Caches in Gruppen hinzugefügt, die eines der einzelnen Personen darstellen Grundblöcke oder dynamische Anweisungen. Die Trace -Cache -Läden des Pentiums 4 Mikrooperationen aufgrund der Dekodierung von X86-Anweisungen, die auch die Funktionalität eines Mikrooperations-Cache bereitstellen. Wenn dies das nächste Mal eine Anweisung benötigt, muss sie nicht wieder in Mikrooperationen dekodiert werden.[32]: 63–68

Schreiben Sie den Koalescing -Cache (WCC)

Schreiben Sie den Koalescing -Cache[33] ist ein spezieller Cache, der Teil des L2 -Cache in ist AMD's Bulldozer -Mikroarchitektur. Geschäfte von beiden L1D -Caches im Modul gehen durch das WCC, wo sie gepuffert und zusammengepackt werden. Die Aufgabe des WCC reduziert die Anzahl der Schreibvorgänge auf den L2 -Cache.

Mikrooperation (μOP oder UOP) Cache

A Mikrooperations-Cache (μop Cache, UOP Cache oder UC)[34] ist ein spezieller Cache, der speichert Mikrooperationen von dekodierten Anweisungen, wie direkt von der erhalten Anweisungsdecoder oder aus dem Anweisungs -Cache. Wenn eine Anweisung dekodiert werden muss, wird der μOP-Cache auf seine dekodierte Form überprüft, die bei zwischengespeicherung wiederverwendet wird. Wenn es nicht verfügbar ist, wird die Anweisung dekodiert und dann zwischengespeichert.

Eines der frühen Arbeiten, die μOP Cache als alternatives Frontend für den Intel beschreiben P6 -Prozessorfamilie ist das Papier von 2001 "Mikrooperations-Cache: Ein Power-Aware-Frontend für die variable Anweisungslänge ISA".[35] Später enthielt Intel μOP -Caches in seine Sandy Bridge Prozessoren und in aufeinanderfolgenden Mikroarchitekturen wie Ivy Bridge und Haswell.[32]: 121–123[36] AMD implementierte einen μOP -Cache in ihrem Zen Microarchitektur.[37]

Durch das Abrufen vollständiger vorkodierter Anweisungen müssen die Komplexanweisungen mit variabler Länge wiederholt in Mikrooperationen mit fester Länge dekodiert werden, und vereinfacht den Prozess der Vorhersage, Abholung, Drehung und Ausrichtung abgerufener Anweisungen. Ein μOP -Cache lädt den Abruf und dekodiert die Hardware effektiv ab, wodurch abgenommen wird Energieverbrauch und Verbesserung der Frontend-Versorgung dekodierter Mikrooperationen. Der μOP-Cache erhöht auch die Leistung, indem er konsistenter dekodierte Mikrooperationen in das Backend liefert und verschiedene Engpässe im Abruf- und Dekodieren der CPU-Logik beseitigt.[35][36]

Ein μOP -Cache hat viele Ähnlichkeiten mit einem Spurencache, obwohl ein μOP -Cache viel einfacher ist, wodurch eine bessere Leistungseffizienz bietet. Dies macht es besser für Implementierungen auf batteriebetriebenen Geräten geeignet. Der Hauptnachteil des Spurencache, der zu seiner Leistungseffizienz führt, ist die für seine erforderliche Hardwarekomplexität Heuristik Entscheidung über das Zwischenspeichern und Wiederverwenden von dynamisch erstellten Befehlsspuren.[38]

Zweigzielanweisung Cache

A Zweigziel -Cache oder Zweigzielanweisung Cache, der Name verwendet auf Armmikroprozessoren,[39] ist ein spezialisierter Cache, der die ersten Anweisungen am Ziel eines genutzten Zweigs enthält. Dies wird von Prozessoren mit geringer Leistung verwendet, die keinen normalen Befehls-Cache benötigen, da das Speichersystem in der Lage ist, Anweisungen schnell genug zu liefern, um die CPU ohne einen zu erfüllen. Dies gilt jedoch nur für aufeinanderfolgende Anweisungen nacheinander. Es braucht immer noch mehrere Latenzzyklen, um den Anweisungen an einer neuen Adresse neu zu starten, was nach einer Steuerung einige Zyklen Pipeline -Blasen verursacht. Ein Zweig -Ziel -Cache enthält Anweisungen für die wenigen Zyklen, die nach den meisten Zweigen eine Verzögerung vermeiden.

Dies ermöglicht einen Vollgeschwindigkeitsbetrieb mit einem viel kleineren Cache als einem herkömmlichen Vollzeitanweisungs-Cache.

Smart Cache

Smart Cache ist ein Level 2 oder Stufe 3 Caching -Methode für mehrere Ausführungskerne, entwickelt von von Intel.

Smart Cache teilt den tatsächlichen Cache -Speicher zwischen den Kernen von a Multi-Core-Prozessor. Im Vergleich zu einem dedizierten Pro-Core-Cache der Gesamt Cache Miss Die Rate nimmt ab, wenn nicht alle Kerne gleiche Teile des Cache -Raums benötigen. Infolgedessen kann ein einzelner Kern den Cache der vollständigen Stufe 2 oder Stufe 3 verwenden, wenn die anderen Kerne inaktiv sind.[40] Darüber hinaus macht der gemeinsame Cache es schneller, den Speicher zwischen verschiedenen Ausführungskernen zu teilen.[41]

Multi-Level-Caches

Ein weiteres Problem ist der grundlegende Kompromiss zwischen Cache -Latenz und Trefferquote. Größere Caches haben bessere Trefferquoten, aber längere Latenz. Um diesen Kompromiss anzugehen, verwenden viele Computer mehrere Cache -Ebenen, wobei kleine schnelle Caches von größeren, langsameren Caches unterstützt werden. Multi-Level-Caches funktionieren im Allgemeinen, indem sie am schnellsten prüfen, Level 1 (L1) zuerst Cache; Wenn es trifft, fährt der Prozessor mit hoher Geschwindigkeit fort. Wenn dieser kleinere Cache verfehlt, der nächst schnellste Cache (Level 2, L2) wird überprüft und so weiter, bevor er auf externe Speicher zugreift.

Da der Latenzunterschied zwischen dem Hauptspeicher und dem schnellsten Cache größer geworden ist, haben einige Prozessoren begonnen, bis zu drei Ebenen von On-Chip-Cache zu verwenden. Preissensitive Designs verwendeten dies, um die gesamte Cache-Hierarchie auf Chip zu ziehen, aber bis zu den 2010er Jahren kehrten einige der höchsten Performance-Designs in große Off-Chip-Caches zurück, die häufig in umgesetzt werden in edram und auf einem montiert Multi-Chip-Modul, als viertes Cache -Level. In seltenen Fällen wie in der Mainframe -CPU IBM Z15 (2019) werden alle Stufen bis L1 von EDRAM implementiert, um zu ersetzen Sram Ganz (für Cache wird SRAM immer noch für Register verwendet). Das Armbasis Apple M1 hat einen 192 kb L1-Cache für jede der vier Hochleistungskerne, eine ungewöhnlich große Menge; Die vier hocheffizienten Kerne haben jedoch nur 128 kb.

Die Vorteile von L3- und L4 -Caches hängen von den Zugriffsmustern der Anwendung ab. Beispiele für Produkte mit L3- und L4 -Caches umfassen Folgendes:

  • Alpha 21164 (1995) hat 1 bis 64 MB Off-Chip-L3-Cache.
  • IBM Power4 (2001) hat L3-Caches von 32 MB pro Prozessor, die unter mehreren Prozessoren geteilt werden.
  • Itanium 2 (2003) hat einen 6-MB-Unified Level 3 (L3) -Cache On-Die; das Itanium 2 (2003) Das MX 2 -Modul umfasst zwei Itanium 2 -Prozessoren zusammen mit einem gemeinsam genutzten 64 MB L4 -Cache auf a Multi-Chip-Modul Das war mit einem Madison -Prozessor kompatibel.
  • Intel Xeon MP-Produkt mit dem Codenamen "Tulsa" (2006) verfügt über 16 MB On-Der-L3-Cache, das zwischen zwei Prozessorkernen geteilt wird.
  • AMD Phenom II (2008) hat bis zu 6 MB On-Die-Unified L3-Cache.
  • Intel Core i7 (2008) hat einen 8-MB-On-Die-Unified L3-Cache, der inklusive von allen Kernen geteilt wird.
  • Intel Haswell CPUs mit integriert Intel Iris Pro Grafiken Haben Sie 128 MB Edram im Wesentlichen als L4 -Cache.[42]

Schließlich am anderen Ende der Speicherhierarchie der CPU Datei registrieren selbst kann als der kleinste und schnellste Cache im System angesehen werden, mit dem besonderen Merkmal, dass es in der Software geplant ist - typisch von einem Compiler, da es Register zuweist, um Werte aus dem Hauptspeicher für, als Beispiel, abgerufen zu haben. Schleifennestoptimierung. Jedoch mit Umbenennen registrieren Die meisten Compiler -Registerzuweisungen werden zur Laufzeit dynamisch von Hardware in eine Registerbank realisiert, sodass die CPU falsche Datenabhängigkeiten durchbrechen und so Pipeline -Gefahren entlasten kann.

Registrieren Sie Dateien manchmal auch Hierarchie: die Cray-1 (ca. 1976) hatte acht Anadationen "A" und acht Skalardaten "S" Register, die im Allgemeinen verwendbar waren. Es gab auch einen Satz von 64 Adresse "B" und 64 Skalardaten "T" -Register, deren Zugriff länger dauerte, aber schneller als Hauptspeicher waren. Die Register "B" und "T" wurden bereitgestellt, weil der Cray-1 keinen Datencache hatte. (Der Cray-1 hatte jedoch einen Anweisungs-Cache.)

Multi-Core-Chips

Bei Betrachtung eines Chips mit Mehrere KerneEs gibt eine Frage, ob die Caches für jeden Kern geteilt oder lokal geteilt werden sollen. Die Implementierung gemeinsamer Cache führt zwangsläufig mehr Verkabelung und Komplexität ein. Aber dann einen Cache pro Cache pro Chip, statt Aderreduziert den benötigten Platz erheblich und somit kann man einen größeren Cache enthalten.

In der Regel ist das Teilen des L1-Cache unerwünscht, da die daraus resultierende Erhöhung der Latenz jeden Kerns verlangsamer macht als ein einzelner Kernchip. Für den höchsten Cache auf höchstem Niveau ist der letzte, der vor dem Zugriff auf Speicher auf den Speicher aufgerufen wird. Ein globaler Cache ist aus mehreren Gründen wünschenswert Themen, um zwischengespeicherte Daten zu teilen und die Komplexität der verwendeten Cache -Kohärenzprotokolle zu verringern.[43] Beispielsweise kann ein Acht-Kern-Chip mit drei Pegeln einen L1-Cache für jeden Kern, einen Zwischenl2-Cache für jedes Kernepaar und einen L3-Cache enthalten, der zwischen allen Kernen geteilt wird.

Der gemeinsame Cache auf höchstem Niveau, der vor dem Zugriff auf Speicher aufgerufen wird, wird normalerweise als die bezeichnet Letzter Level -Cache (GMBH). Zusätzliche Techniken werden zur Erhöhung des Parallelitätsniveaus verwendet, wenn LLC zwischen mehreren Kernen geteilt wird, einschließlich des Schneidens in mehrere Teile, die bestimmte Speicherbereiche von Speicheradressen behandeln und unabhängig zugreifen können.[44]

Getrennt gegen Unified

In einer separaten Cache -Struktur werden Anweisungen und Daten separat zwischengespeichert, was bedeutet, dass eine Cache -Linie verwendet wird, um entweder Anweisungen oder Daten, jedoch nicht beides zu zwischenstrahlen. Mit separaten Daten und Anweisungen wurden verschiedene Vorteile demonstriert Übersetzungs -Lookaside -Puffer.[45] In einer einheitlichen Struktur ist diese Einschränkung nicht vorhanden, und Cache -Linien können sowohl Anweisungen als auch Daten zwischengespeichert werden.

Exklusiv gegen integrativ

Multi-Level-Caches führen neue Designentscheidungen ein. Beispielsweise müssen in einigen Prozessoren alle Daten im L1 -Cache auch irgendwo im L2 -Cache liegen. Diese Caches werden genannt streng inklusiv. Andere Prozessoren (wie die Amd Athlon) haben exklusiv Caches: Daten sind garantiert in einem der L1- und L2 -Caches, niemals in beiden. Noch andere Prozessoren (wie der Intel Pentium II, III, und 4) Erfordern nicht, dass Daten im L1 -Cache auch im L2 -Cache liegen, obwohl dies häufig der Fall ist. Für diese Zwischenpolitik gibt es keinen allgemein anerkannten Namen.[46][47] Zwei gebräuchliche Namen sind "nicht exklusiv" und "teilweise inklusiv".

Der Vorteil exklusiver Caches besteht darin, dass sie mehr Daten speichern. Dieser Vorteil ist größer, wenn der exklusive L1 -Cache mit dem L2 -Cache vergleichbar ist und abnimmt, wenn der L2 -Cache um ein Vielfaches größer ist als der L1 -Cache. Wenn der L1 verfehlt und der L2 auf einen Zugang trifft, wird die Schlagzeile im L2 mit einer Linie im L1 ausgetauscht. Dieser Austausch ist ein bisschen mehr Arbeit als nur das Kopieren einer Zeile von L2 bis L1, was ein integrativer Cache tut.[47]

Ein Vorteil von streng umfassenden Caches besteht darin, dass externe Geräte oder andere Prozessoren in einem Multiprozessor -System eine Cache -Linie vom Prozessor entfernen möchten, muss der Prozessor nur den L2 -Cache überprüfen lassen. In Cache -Hierarchien, die die Inklusion nicht durchsetzen, muss auch der L1 -Cache überprüft werden. Als Nachteil besteht eine Korrelation zwischen den Assoziativitäten von L1- und L2 -Caches: Wenn der L2 -Cache nicht mindestens so viele Möglichkeiten hat wie alle L1 -Caches, ist die effektive Assoziativität der L1 -Caches eingeschränkt. Ein weiterer Nachteil von integrativem Cache ist, dass die (möglicherweise) entsprechenden Linien in L1 auch dann vertrieben werden müssen, um die Inklusivität aufrechtzuerhalten. Dies ist einiges an Arbeit und würde zu einer höheren L1 -Fehlrate führen.[47]

Ein weiterer Vorteil von integrativen Caches besteht darin, dass der größere Cache größere Cache -Linien verwenden kann, wodurch die Größe der sekundären Cache -Tags reduziert wird. (Ausschließliche Caches verlangen, dass beide Caches dieselbe Größen -Cache -Linien haben, sodass Cache -Linien auf einem L1 -FAST, L2, getauscht werden können Größenordnung, die größer als die Cache -Tags ist, kann dieser gespeicherte Tag -Bereich mit dem inkrementellen Bereich vergleichbar sein, der zum Speichern der L1 -Cache -Daten im L2 erforderlich ist.[48]

Scratchpad -Speicher

Scratchpad -Speicher (SPM), auch als Scratchpad, Scratchpad RAM oder lokaler Speicher in Computerterminologie bekannt, ist ein hochgeschwindiger interner Speicher, der für die temporäre Speicherung von Berechnungen, Daten und anderen laufenden Arbeiten verwendet wird.

Beispiel: Der K8

Um sowohl Spezialisierung als auch Multi-Level-Caching zu veranschaulichen, finden Sie hier die Cache-Hierarchie des K8-Kerns im AMD Athlon 64 ZENTRALPROZESSOR.[49]

Cache -Hierarchie des K8 -Kerns im AMD Athlon 64 CPU.

Der K8 verfügt über vier spezialisierte Caches: einen Anweisungs -Cache, eine Anweisung Tlb, ein Daten -TLB und ein Datencache. Jedes dieser Caches ist spezialisiert:

  • Der Anweisungs-Cache hält Kopien von 64-Byte-Speicherzeilen und holt jeweils 16 Bytes. Jedes Byte in diesem Cache wird in zehn Bits anstelle von acht gespeichert, wobei die zusätzlichen Bits die Grenzen von Anweisungen markieren (dies ist ein Beispiel für das Vorkodieren). Der Cache hat nur Parität Schutz und nicht ECC, weil die Parität kleiner ist und alle beschädigten Daten durch frische Daten ersetzt werden können, die aus dem Speicher abgerufen werden (was immer eine aktuelle Kopie von Anweisungen enthält).
  • Die Anweisung TLB behält Kopien von Page Table Entries (PTEs). Der Anweisungsabruf jedes Zyklus hat seine virtuelle Adresse über dieses TLB in eine physische Adresse übersetzt. Jeder Eintrag ist entweder vier oder acht Bytes im Speicher. Da der K8 eine variable Seitengröße hat, wird jedes der TLBs in zwei Abschnitte aufgeteilt, um PTEs zu erhalten, die 4 KB -Seiten zubereiten, und eine, um PTEs zu erhalten, die 4 MB oder 2 MB -Seiten abbilden. Mit dem Split kann die vollständig assoziative Übereinstimmung in jedem Abschnitt einfacher sein. Das Betriebssystem ordnet verschiedene Abschnitte des virtuellen Adressraums mit unterschiedlichen PTEs in der Größe ab.
  • Die Daten TLB verfügen über zwei Kopien, die identische Einträge halten. Die beiden Kopien ermöglichen es zwei Datenzugriffe pro Zyklus, virtuelle Adressen in physische Adressen zu übersetzen. Wie bei der Anweisung TLB ist dieser TLB in zwei Arten von Einträgen aufgeteilt.
  • Der Datencache hält Kopien von 64-Byte-Speicherzeilen. Es ist in 8 Banken aufgeteilt (jeweils 8 KB Daten speichert) und kann jeweils zwei 8-Byte-Daten abrufen, solange sich diese Daten in verschiedenen Banken befinden. Es gibt zwei Kopien der Tags, da jede 64-Byte-Linie unter allen acht Banken verbreitet wird. Jede Tag -Kopie behandelt einen der beiden Zugriffe pro Zyklus.

Der K8 hat auch mehrstufige Caches. Es gibt Anweisungen und Daten auf zweiter Ebene und Daten, die nur PTES-Mapping 4 kb speichern. Sowohl Anweisungen als auch Daten -Caches und die verschiedenen TLBs können sich aus dem großen füllen einheitlich L2 Cache. Dieser Cache enthält exklusiv sowohl für die L1-Anweisung als auch für Daten-Caches, was bedeutet, dass jede 8-Byte-Linie nur in einem der L1-Befehls-Cache, dem L1-Datencache oder dem L2-Cache enthalten ist. Es ist jedoch möglich, dass eine Zeile im Datencache eine PTE hat, die sich ebenfalls in einem der TLBs befindet. Das Betriebssystem ist dafür verantwortlich, die TLBs kohärent zu halten, indem Teile davon spülen, wenn die Seitentabellen im Speicher aktualisiert werden.

Der K8 zwischengespeichert auch Informationen, die nie im Speicher gespeichert werden - Informationen. Diese Caches sind in dem obigen Diagramm nicht gezeigt. Wie für diese CPU -Klasse üblich, hat der K8 ziemlich komplexZweigvorhersage, mit Tabellen, die vorhersagen, ob Zweige genommen werden, und andere Tabellen, die die Ziele von Zweigen und Sprüngen vorhersagen. Einige dieser Informationen sind mit Anweisungen sowohl im Befehlscache der Stufe 1 als auch im einheitlichen Sekundärcache verbunden.

Der K8 verwendet einen interessanten Trick, um Vorhersageinformationen mit Anweisungen im sekundären Cache zu speichern. Linien im sekundären Cache werden vor versehentlicher Datenbeschädigung geschützt (z. B. durch ein Alpha -Partikel Streik) durch beide ECC oder Parität, je nachdem, ob diese Linien aus den Daten oder den Anweisungen primärer Caches vertrieben wurden. Da der Paritätscode weniger Bits als der ECC -Code benötigt, haben Zeilen aus dem Befehlscache einige Ersatzbits. Diese Bits werden verwendet, um Informationen zur Vorhersage von Zweigen zu speichern, die mit diesen Anweisungen verbunden sind. Das Nettoergebnis ist, dass der Zweig -Prädiktor eine größere effektive Verlauftabelle hat und daher eine bessere Genauigkeit hat.

Mehr Hierarchien

Andere Prozessoren haben andere Arten von Prädiktoren (z. B. den Bypass-Prädiktor für Store-to-Load in der Dez Alpha 21264) und verschiedene spezialisierte Prädiktoren werden in zukünftigen Prozessoren wahrscheinlich gedeihen.

Diese Prädiktoren sind Caches, in denen sie Informationen speichern, die kostspielig sind, um zu berechnen. Einige der Terminologie, die bei der Diskussion von Prädiktoren verwendet werden Schlag in einem Zweig -Prädiktor), aber Prädiktoren werden im Allgemeinen nicht als Teil der Cache -Hierarchie betrachtet.

Der K8 hält die Anweisungen und Daten zwischen kohärent In der Hardware, was bedeutet, dass ein Speicher in eine Anweisung, die dem Speicheranweisung genau befolgt wird, diese Anweisung ändert. Andere Prozessoren, wie die in der Familie Alpha und MIPS, haben sich auf Software verlassen, um den Anweisungs -Cache kohärent zu halten. Die Geschäfte werden im Anweisungsstrom nicht garantiert, wenn ein Programm eine Betriebssystemeinrichtung aufruft, um Kohärenz zu gewährleisten.

Tag RAM

In Computertechnik, a Tag RAM wird verwendet, um anzugeben, welcher der möglichen Speicherorte derzeit in einem CPU -Cache gespeichert ist.[50][51] Für ein einfaches, direkt abgebildetes Design schnell Sram kann verwendet werden. Höher assoziative Caches Normalerweise beschäftigen Inhaltsadressible Speicher.

Implementierung

Zwischenspeicher liest sind die häufigste CPU -Operation, die mehr als einen einzelnen Zyklus erfordert. Die Programmausführungszeit ist tendenziell sehr empfindlich für die Latenz eines Datencache-Stufe-1-Datums. Viele Designanstrengungen und oft Strom- und Siliziumbereiche werden aufgewendet, um die Caches so schnell wie möglich zu machen.

Der einfachste Cache ist ein praktisch indizierter Cache. Die virtuelle Adresse wird mit einem Addierer berechnet, dem entsprechenden Teil der extrahierten Adresse und zum Index eines SRAM, das die geladenen Daten zurückgibt. Die Daten sind Byte in einem Byte -Shifter ausgerichtet und von dort nach dem nächsten Vorgang umgangen. In der inneren Schleife sind keine Tag -Überprüfung erforderlich - in der Tat müssen die Tags nicht einmal gelesen werden. Später in der Pipeline, aber bevor die Lastanweisung in den Ruhestand ist, muss das Tag für die geladenen Daten gelesen und gegen die virtuelle Adresse überprüft werden, um sicherzustellen, dass ein Cache -Treffer vorhanden ist. Bei einem Miss wird der Cache mit der angeforderten Cache -Zeile aktualisiert und die Pipeline neu gestartet.

Ein assoziativer Cache ist komplizierter, da eine Form des Tags gelesen werden muss, um zu bestimmen, welcher Eintrag des Cache ausgewählt werden soll. Ein N-Way-Set-Associativ-Level-1-Cache liest normalerweise alle n möglichen Tags und N-Daten parallel und wählt dann die mit dem Matching-Tag zugeordneten Daten aus. Level-2-Caches speichern manchmal Strom, indem Sie zuerst die Tags lesen, sodass nur ein Datenelement aus dem Daten-SRAM gelesen wird.

Lesen Sie den Pfad für einen 2-Wege-assoziativen Cache

Das benachbarte Diagramm soll die Art und Weise, in der die verschiedenen Felder der Adresse verwendet werden, klären. Adressbit 31 ist am wichtigsten, Bit 0 ist am wenigsten signifikant. Das Diagramm zeigt die SRAMS, die Indexierung und die Indexierung und Multiplexing Für einen 4-kb-, 2-Wege-Set-Assoziativ, praktisch indizierten und praktisch markierten Cache mit 64 Byte (b) Zeilen eine 32-Bit-Lesebreite und 32-Bit-virtuelle Adresse.

Da der Cache 4 KB ist und 64 B -Zeilen hat, befinden sich nur 64 Zeilen im Cache, und wir lesen jeweils zwei aus einem Tag -SRAM mit 32 Zeilen mit jeweils ein Paar 21 -Bit -Tags. Obwohl jede Funktion der virtuellen Adressbits 31 bis 6 verwendet werden könnte, um die Tag- und Daten -SRAMs zu indizieren, ist es am einfachsten, die am wenigsten signifikanten Bits zu verwenden.

In ähnlicher Weise, da der Cache 4 kb ist und einen 4 -B -Lesweg hat und zwei Möglichkeiten für jeden Zugriff liest, beträgt der Daten -SRAM 512 Zeilen um 8 Bytes.

Ein modernerer Cache könnte 16 kb, 4-Wege-Set-assoziativ, praktisch indiziert, praktisch angedeutet und physikalisch markiert sein, mit 32 B-Zeilen, 32-Bit-Lesebreite und 36-Bit-physikalischen Adressen. Das Reading -Rezidiv für einen solchen Cache sieht dem obigen Pfad sehr ähnlich. Anstelle von Tags werden VHINTS gelesen und gegen eine Teilmenge der virtuellen Adresse abgestimmt. Später in der Pipeline wird die virtuelle Adresse von der TLB in eine physische Adresse übersetzt, und das physische Tag wird gelesen (nur eine, wie die VHINT liefert, welchen Weg des Cache zu lesen ist). Schließlich wird die physische Adresse mit dem physischen Tag verglichen, um festzustellen, ob ein Treffer aufgetreten ist.

Einige SPARC -Designs haben die Geschwindigkeit ihrer L1 -Caches durch ein paar Verzögerungen des Tors verbessert, indem die virtuelle Adressaddierin in die SRAM -Decoder zusammengefasst wurde. Sehen Summe behandelte Decoder.

Geschichte

Die frühe Geschichte der Cache -Technologie ist eng mit der Erfindung und Verwendung des virtuellen Speichers verbunden. Aufgrund der Knappheit und der Kosten von Halbaufbau-Erinnerungen verwendeten frühe Mainframe-Computer in den 1960er Jahren eine komplexe Hierarchie des physischen Gedächtnisses, die auf einen flachen virtuellen Speicherplatz zugeordnet wurden, der von Programmen verwendet wird. Die Gedächtnistechnologien würden Semi-Leiter, Magnetkern, Trommel und Scheibe umfassen. Virtuelles Speicher, das von Programmen gesehen und verwendet wird, wären flach, und das Caching würde verwendet, um Daten und Anweisungen in den schnellsten Speicher vor dem Zugriff auf den Prozessor zu holen. Umfangreiche Studien wurden durchgeführt, um die Cache -Größen zu optimieren. Es wurde festgestellt, dass optimale Werte stark von der Programmiersprache abhängen, die mit Algol verwendet wird, das kleinste und Forran und COBOL benötigt, die die größten Cache -Größen benötigen.[umstritten ]

In den frühen Tagen der Mikrocomputertechnologie war der Speicherzugriff nur geringfügig langsamer als registrieren Zugang. Aber seit den 1980er Jahren[52] Die Leistungslücke zwischen Prozessor und Gedächtnis hat zugenommen. Mikroprozessoren sind viel schneller als Speicher, insbesondere in Bezug auf ihren Betrieb Frequenz, so wurde das Gedächtnis zu einer Leistung Engpass. Während es technisch gesehen möglich war, das gesamte Hauptgedächtnis so schnell wie die CPU zu haben, wurde ein wirtschaftlicheren Pfad eingenommen: Verwenden Sie viel Speicher mit niedrigem Geschwindigkeit, führen aber auch einen kleinen Hochgeschwindigkeits-Cache-Speicher ein, um die Leistungslücke zu lindern. Dies lieferte eine Größenordnung mehr Kapazität - für den gleichen Preis - mit nur einer leicht reduzierten kombinierten Leistung.

Erste TLB -Implementierungen

Die ersten dokumentierten Verwendungen eines TLB waren auf der GE 645[53] und die IBM 360/67,[54] Beide verwendeten ein assoziatives Gedächtnis als TLB.

Erster Anweisungs -Cache

Die erste dokumentierte Verwendung eines Befehls -Cache war auf der CDC 6600.[55]

Erster Datencache

Die erste dokumentierte Verwendung eines Datencache war auf der IBM System/360 Modell 85.[56]

In 68K -Mikroprozessoren

Das 68010, veröffentlicht 1982, verfügt über einen "Schleifenmodus", der als winziger und Spezialfall-Befehls-Cache angesehen werden kann, der Schleifen beschleunigt, die nur aus zwei Anweisungen bestehen. Das 68020, veröffentlicht 1984, ersetzt diese durch einen typischen Anweisungs-Cache von 256 Bytes, der der erste 68K-Serienprozessor ist, der einen echten On-Chip-Cache-Speicher bietet.

Das 68030, veröffentlicht 1987, ist im Grunde ein 68020-Kern mit zusätzlichem 256-Byte-Datencache, einem On-Chip Speicherverwaltungseinheit (MMU), ein Prozess schrumpfen und den Burst -Modus für die Caches hinzugefügt. Das 68040, veröffentlicht 1990, hat Anweisungen und Daten zwischen jeweils vier Kilobyten aufgeteilt. Das 68060, veröffentlicht 1994, hat Folgendes: 8 KB-Datencache (Vier-Wege-assoziativer), 8-KB-Befehlscache (Vier-Wege-Assoziativ Cache MMU-Puffer (Vier-Wege-assoziativ).

In x86 Mikroprozessoren

Beispiel eines Motherboards mit einem i386 Mikroprozessor (33 MHz), 64 kb Cache (25 ns; 8 Chips in der unteren linken Ecke), 2 MB -DRAM (70 ns; 8; Simms rechts vom Cache) und einem Cache -Controller (Austek A38202; rechts vom Prozessor)

Als die x86 Mikroprozessoren erreichten Taktraten von 20 MHz und höher in der 386Es wurden kleine Mengen des schnellen Cache -Speichers in Systemen zur Verbesserung der Leistung vorgestellt. Das lag daran, dass die Dram Der für das Hauptgedächtnis verwendete Speicher hatte eine erhebliche Latenz, bis zu 120 ns sowie Aktualisierungszyklen. Der Cache wurde aus teurer, aber deutlich schneller konstruiert. Sram Gedächtniszellen, was zu dieser Zeit Latenzen rund 10–25 ns hatte. Die frühen Caches waren außerhalb des Prozessors und befanden sich typischerweise auf dem Motherboard in Form von acht oder neun TAUCHEN Geräte, die in Steckdosen platziert sind, um den Cache als optionale zusätzliche oder upgrade -Funktion zu aktivieren.

Einige Versionen des Intel 386 -Prozessors könnten 16 bis 256 kb externer Cache unterstützen.

Mit dem 486 Der Prozessor wurde ein 8 -KB -Cache direkt in den CPU -Würfel integriert. Dieser Cache wurde als Level 1- oder L1-Cache bezeichnet, um ihn von der langsameren On-Mootherboard oder Level 2 (L2) -Cache zu unterscheiden. Diese Caches auf der Mutterboard waren viel größer, wobei die häufigste Größe 256 kb betrug. Die Popularität des Cache an der Mutterboard wurde durch die fortgesetzt Pentium mmx Ära wurde aber durch die Einführung von veraltet gemacht Sdram und die wachsende Unterschiede zwischen Busaktuhrenraten und CPU-Taktraten, was dazu führte, dass der Cache an der Mutterboard nur geringfügig schneller war als der Hauptspeicher.

Die nächste Entwicklung bei der Cache -Implementierung in den X86 -Mikroprozessoren begann mit dem Pentium Pro, der den sekundären Cache auf dasselbe Paket wie der Mikroprozessor brachte, taktete mit der gleichen Frequenz wie der Mikroprozessor.

Die Caches auf der Mutterbrettung genoss dank der längere Popularität AMD K6-2 und AMD K6-III Prozessoren, die noch verwendet werden Socket 7, das zuvor von Intel mit Caches auf der Mutterbrettbrettung verwendet wurde. K6-III umfasste 256 KB On-Die-L2-Cache und nutzte den On-Board-Cache als dritter Cache mit dem Namen L3 (Motherboards mit bis zu 2 MB an Bord-Cache wurden hergestellt). Nachdem der Socket 7 veraltet war, verschwand der Cache an der Mutterbrettbefestigung aus den X86-Systemen.

Die dreistufigen Caches wurden zuerst erneut mit der Einführung mehrerer Prozessorkerne verwendet, bei denen der CPU-Würfel der L3-Cache hinzugefügt wurde. Es wurde üblich, dass die Gesamt -Cache -Größen in neueren Prozessorgenerationen immer größer wurden, und kürzlich (ab 2011) ist es nicht ungewöhnlich, dass die Größen von Cache -Größen von Stufe 3 von Megabyte die Größen der Stufe 3 finden.[57]

Intel stellte einen On-Package-Cache Level 4 mit dem vor Haswell Mikroarchitektur. Crystalwell[28] Haswell -CPUs, ausgestattet mit dem Gt3e Variante der integrierten IRIS -Pro -Grafiken von Intel verfügen über 128 MB eingebetteter DRAM.edram) auf demselben Paket. Dieser L4-Cache wird dynamisch zwischen der On-Die-GPU und der CPU geteilt und dient als a Opfer -Cache zum L3 -Cache der CPU.[29]

In Arm -Mikroprozessoren

Apple M1 CPU verfügt über 128 oder 192 KB-Anweisungen L1-Cache für jeden Kern (wichtig für die Leistung von Latenz-/Thread-Leistung), abhängig vom Kerntyp, ungewöhnlich groß für L1-Cache eines CPU-Typs, nicht nur für einen Laptop, während die Gesamt-Cache-Speichergröße ist nicht ungewöhnlich groß (die Gesamtsumme ist für den Durchsatz wichtiger), für einen Laptop und eine viel größere Gesamtzahl (z. B. L3 oder L4) sind in den Mainframes von IBM erhältlich.

Aktuelle Forschung

Frühe Cache -Designs konzentrieren sich ausschließlich auf die direkten Kosten des Cache und RAM und durchschnittliche Ausführungsgeschwindigkeit. Neuere Cache -Designs berücksichtigen auch Energieeffizienz, Fehlertoleranz und andere Ziele.[58][59]

Computerarchitekten sind mehrere Tools zur Verfügung, mit denen Kompromisse zwischen der Cache -Zykluszeit, Energie und Fläche untersucht werden können. der Kaktecache -Simulator[60] und der SimpleScalar-Befehls-Simulator sind zwei Open-Source-Optionen.

Multi-portierter Cache

Ein mehrportierter Cache ist ein Cache, der mehr als eine Anfrage gleichzeitig erfüllen kann. Wenn wir auf einen herkömmlichen Cache zugreifen, verwenden wir normalerweise eine einzelne Speicheradresse, während wir in einem mehrportierten Cache N gleiche Adressen anfordern können-wobei N die Anzahl der Ports ist, die über den Prozessor und den Cache verbunden sind. Der Vorteil davon ist, dass ein Pipeled -Prozessor aus verschiedenen Phasen in seiner Pipeline auf Speicher zugreifen kann. Ein weiterer Vorteil besteht darin, dass das Konzept von Super-Scalar-Prozessoren durch verschiedene Cache-Ebenen ermöglicht wird.

Siehe auch

Anmerkungen

  1. ^ Die allererste Paging -Maschine, die Ferranti Atlas[21][22] hatte keine Seitentabellen im Hauptspeicher; Es gab einen assoziativen Speicher mit einem Eintrag für jeden 512 -Wort -Seiten -Kernrahmen.

Verweise

  1. ^ Gabriel Torres (12. September 2007). "Wie der Cache -Speicher funktioniert".
  2. ^ "Atlas 2 im Cambridge Mathematical Laboratory (und Aldermaston und CAD Center)". November 2012. In Cambridge wurden zwei Tunneldiodengeschäfte entwickelt; Eine, die sehr gut funktionierte, beschleunigte das Abnehmen von Operanden, das andere sollte das Abnehmen von Anweisungen beschleunigen. Die Idee war, dass die meisten Anweisungen nach Reihenfolge gehorcht werden. Als eine Anweisung abgerufen wurde, wurde dieses Wort in den Sklavengeschäft an der Stelle, an der der Abrufadressmodulo 32 angegeben wurde, in den Sklavengeschäft gesetzt. Die verbleibenden Teile der Abrufadresse wurden ebenfalls gespeichert. Wenn das gesuchte Wort im Sklaven war, wurde es von dort anstelle des Hauptgedächtnisses gelesen. Dies würde den Anweisungsschleifen bis zu 32 Anweisungen lang eine große Beschleunigung geben und für Schleifen bis zu 64 Wörter reduziert werden.
  3. ^ "IBM System/360 Modell 85 Funktionseigenschaften" (PDF). IBM. Juni 1968. A22-6916-1.
  4. ^ Smith, Alan Jay (September 1982). "Cache -Erinnerungen" (PDF). Computerumfragen. 14 (3): 473–530. doi:10.1145/356887.356892. S2CID 6023466.
  5. ^ "Die Änderung der Computerarchitektur ist ein Weg, um den Durchsatz zu erhöhen, schlägt IBM -Forscher vor." Elektronik. 49 (25): 30–31. 23. Dezember 1976.
  6. ^ "IBM Z13 und IBM Z13S Technische Einführung" (PDF). IBM. März 2016. p. 20.
  7. ^ "Produkt Fact Sheet: Beschleunigung der 5G -Netzwerkinfrastruktur vom Kern bis zur Kante". Intel Newsroom (Pressemitteilung). Abgerufen 2020-04-12. L1-Cache von 32 KB/Kern, L2-Cache von 4,5 MB pro 4-Core-Cluster und gemeinsamer LLC-Cache bis zu 15 MB.
  8. ^ Smith, Ryan. "Intel startet Atom P5900: Ein 10 -nm -Atom für Radiozugriffsnetzwerke". www.anandtech.com. Abgerufen 2020-04-12.
  9. ^ "Cache -Design" (PDF). ucsd.edu. 2010-12-02. p. 10–15. Abgerufen 2014-02-24.
  10. ^ IEEE XPLORE - Phased Set -Associativ -Cache -Design für reduzierten Stromverbrauch. Ieeexplore.ieee.org (2009-08-11). Abgerufen am 2013-07-30.
  11. ^ Sanjeev Jahagirdar; Varghese George; Inder Sodhi; Ryan Wells (2012). "Power Management der Intel Core Micro Architektur der dritten Generation, früher mit dem Codenamen Ivy Bridge" (PDF). hotchips.org. p. 18. archiviert von das Original (PDF) am 2020-07-29. Abgerufen 2015-12-16.
  12. ^ a b André Seznec (1993). "Ein Fall für Zwei-Wege-Verschiebungs-Assoziativ-Caches". ACM Sigarch Computer Architecture News. 21 (2): 169–178. doi:10.1145/173682.165152.
  13. ^ a b C. Kozyrakis. "Vortrag 3: Fortgeschrittene Caching -Techniken" (PDF). Archiviert von das Original (PDF) Am 7. September 2012.
  14. ^ Mikroarchitektur "Abgedrängte Caches haben ... wesentliche Vorteile gegenüber herkömmlichen Set-assoziativen Caches."
  15. ^ Nathan N. Sadler; Daniel J. Sorin (2006). "Auswahl eines Fehlerschutzschemas für den L1 -Datencache eines Mikroprozessors" (PDF). p. 4.
  16. ^ John L. Hennessy; David A. Patterson (2011). Computerarchitektur: Ein quantitativer Ansatz. p. B-9. ISBN 978-0-12-383872-8.
  17. ^ David A. Patterson; John L. Hennessy (2009). Computerorganisation und Design: Die Hardware-/Software -Oberfläche. p. 484. ISBN 978-0-12-374493-7.
  18. ^ a b c Gene Cooperman (2003). "Cache -Grundlagen".
  19. ^ Ben Dugan (2002). "Über Cache".
  20. ^ Harvey G. Cragon. "Speichersysteme und pipelierte Prozessoren". 1996. ISBN0-86720-474-5,, ISBN978-0-86720-474-2. "Kapitel 4.1: Cache -Adressierung, virtuell oder real" p. 209[1]
  21. ^ Sumner, F. H.; Haley, G.; Chenh, E. C. Y. (1962). "Die zentrale Steuereinheit des Computers" Atlas ". Informationsverarbeitung 1962. IFIP -Kongressverfahren. Vol. Verfahren des IFIP -Kongresses 62. Spartan.
  22. ^ a b Kilburn, T.; Payne, R. B.; Howarth, D. J. (Dezember 1961). "Der Atlas -Supervisor". Computer - Schlüssel zur Gesamtsystemsteuerung. Konferenzen Verfahren. Vol. 20 Verfahren der Eastern Joint Computer Conference Washington, D. C. Macmillan. S. 279–294.
  23. ^ Kaxiras, Stefanos; Ros, Alberto (2013). Eine neue Perspektive für eine effiziente Kohärenz der virtuellen Kreises. 40. Internationales Symposium über Computerarchitektur (ISCA). S. 535–547. Citeseerx 10.1.1.307.9125. doi:10.1145/2485922.2485968. ISBN 9781450320795. S2CID 15434231.
  24. ^ "Caching" verstehen ". Linux Journal. Abgerufen 2010-05-02.
  25. ^ Taylor, George; Davies, Peter; Farmwald, Michael (1990). "Die TLB-Scheibe-ein kostengünstiger Hochgeschwindigkeitsadressen-Übersetzungsmechanismus". CH2887-8/90/0000/0355 $ 01.OO. {{}}: Journal zitieren erfordert |journal= (Hilfe)
  26. ^ Timothy Roscoe; Andrew Baumann (2009-03-03). "Advanced Operating Systems Caches und TLBs (263-3800-00L)" (PDF). Systeme.ethz.ch. Archiviert von das Original (PDF) Am 2011-10-07. Abgerufen 2016-02-14.
  27. ^ N.P.JOUPPI. "Verbesserung der Direktvermittlung Cache-Leistung durch Hinzufügen eines kleinen vollständig assoziativen Cache- und Prefetch-Puffer." - 17. jährliches internationales Symposium für Computerarchitektur, 1990. Proceedings.,, doi:10.1109/isca.1990.134547
  28. ^ a b "Produkte (ehemals Crystal Well)". Intel. Abgerufen 2013-09-15.
  29. ^ a b "Intel Iris Pro 5200 Graphics Review: Core i7-4950HQ getestet". Anandtech. Abgerufen 2013-09-16.
  30. ^ Ian Cutress (2. September 2015). "Der Intel Skylake Mobile und Desktop Start mit Architekturanalyse". Anandtech.
  31. ^ Anand Lal Shimpi (2000-11-20). "Der Cache des Pentiums 4 - Intel Pentium 4 1,4 GHz & 1,5 GHz". Anandtech. Abgerufen 2015-11-30.
  32. ^ a b Agner Nebel (2014-02-19). "Die Mikroarchitektur von Intel, AMD und über CPUs: Ein Optimierungshandbuch für Assembly -Programmierer und Compiler -Hersteller" (PDF). agner.org. Abgerufen 2014-03-21.
  33. ^ David Kanter (26. August 2010). "AMDs Bulldozer -Mikroarchitektur - Gedächtnissubsystem fortgesetzt". Technologien der realen Welt.
  34. ^ David Kanter (25. September 2010). "Intels Sandy Bridge Microarchitecture - Anweisung Decodieren und UOP -Cache". Technologien der realen Welt.
  35. ^ a b Baruch Solomon; Avi Mendelson; Doron Orenstein; Yoav Almog; Ronny Ronen (August 2001). "Mikrooperations-Cache: Ein Power-Aware-Frontend für die variable Anweisungslänge ISA" (PDF). ISlped'01: Verfahren des Internationalen Symposiums 2001 über Elektronik und Design mit niedriger Leistung (IEEE CAT. Nr. 01th8581). Intel. S. 4–9. doi:10.1109/lpe.2001.945363. ISBN 978-1-58113-371-4. S2CID 195859085. Abgerufen 2013-10-06.
  36. ^ a b Anand Lal Shimpi (2012-10-05). "Intel's Haswell Architecture analysiert". Anandtech. Abgerufen 2013-10-20.
  37. ^ Ian Cutress (2016-08-18). "AMD Zen Microarchitecture: Duale Scheduler, Micro-Op-Cache und Speicherhierarchie enthüllt". Anandtech. Abgerufen 2017-04-03.
  38. ^ Leon Gu; Dipti Motiani (Oktober 2003). "Trace Cache" (PDF). Abgerufen 2013-10-06.
  39. ^ Kun Niu (28. Mai 2015). "Wie funktioniert der BTIC -Cache (Zweigzielanweisung)?". Abgerufen 7. April 2018.
  40. ^ "Intel Smart Cache: Demo". Intel. Abgerufen 2012-01-26.
  41. ^ "Innere Intel Core Microarchitecture und Smart Memory Access". Intel. 2006. p. 5. archiviert von das Original (PDF) Am 2011-12-29. Abgerufen 2012-01-26.
  42. ^ "Intel Iris Pro 5200 Graphics Review: Core i7-4950HQ getestet". Anandtech. Abgerufen 2014-02-25.
  43. ^ Tian Tian; Chiu-Pi Shih (2012-03-08). "Softwaretechniken für Shared-Cache-Multi-Core-Systeme". Intel. Abgerufen 2015-11-24.
  44. ^ ODED Lempel (2013-07-28). "Intel Core Processor Familie der 2. Generation: Intel Core i7, i5 und i3" (PDF). hotchips.org. p. 7–10,31–45. Archiviert von das Original (PDF) am 2020-07-29. Abgerufen 2014-01-21.
  45. ^ Chen, J. Bradley; Borg, Anita; Jouppi, Norman P. (1992). "Eine simulationsbasierte Studie zur TLB -Leistung". Sigarch Computer Architecture News. 20 (2): 114–123. doi:10.1145/146628.139708.
  46. ^ "Erklärung des L1- und L2 -Cache". Amecomputers.com. Archiviert von das Original Am 2014-07-14. Abgerufen 2014-06-09.
  47. ^ a b c Ying Zheng; Brian T. Davis; Matthew Jordan (2004-06-25). "Leistungsbewertung exklusiver Cache -Hierarchien" (PDF). Michigan Technological University. Abgerufen 2014-06-09.
  48. ^ Aamer Jaleel; Eric Borch; Malini Bhandaru; Simon C. Steely Jr.; Joel Emer (2010-09-27). "Erreichen nicht inklusiver Cache-Leistung mit integrativen Caches" (PDF). Jaleels.org. Abgerufen 2014-06-09.
  49. ^ "AMD K8". Sandpile.org. Archiviert von das Original am 2007-05-15. Abgerufen 2007-06-02.
  50. ^ "Cortex-R4 und Cortex-R4F Technisches Referenzhandbuch". Arm.com. Abgerufen 2013-09-28.
  51. ^ "L210 Cache Controller Technisches Referenzhandbuch". Arm.com. Abgerufen 2013-09-28.
  52. ^ Mahapatra, Nihar R.; Venkatrao, Balakrishna (1999). "Der Prozessor-Memory-Engpass: Probleme und Lösungen" (PDF). Kreuzung. 5 (3ES): 2 - ES. doi:10.1145/357783.331677. S2CID 11557476. Abgerufen 2013-03-05.
  53. ^ GE-645 Systemhandbuch (PDF). General Electric. Januar 1968. Abgerufen 2020-07-10.
  54. ^ IBM System/360 Modell 67 Funktionseigenschaften (PDF). Dritte Edition. IBM. Februar 1972. GA27-2719-2.
  55. ^ James E. Thornton (Oktober 1964), "Paralleler Betrieb in den Kontrolldaten 6600" (PDF), Proc. vom 27. bis 29. Oktober 1964, Herbst-Joint Computer Conference, Teil II: Sehr hohe Computersysteme
  56. ^ IBM (Juni 1968). IBM System/360 Modell 85 Funktionseigenschaften (PDF). ZWEITE AUSGABE. A22-6916-1.
  57. ^ "Intel® Xeon® -Prozessor E7 -Familie". Intel. Abgerufen 2013-10-10.
  58. ^ Sally Adee (2009). "Chip -Design vereitelt den Sneak -Angriff auf Daten". {{}}: Journal zitieren erfordert |journal= (Hilfe)
  59. ^ Zhenghong Wang; Ruby B. Lee (8. bis 12. November 2008). Eine neuartige Cache -Architektur mit verbesserter Leistung und Sicherheit (PDF). 41. jährliches IEEE/ACM Internationales Symposium für Mikroarchitektur. S. 83–93. Archiviert von das Original (PDF) am 6. März 2012.
  60. ^ "Cacti". Hpl.hp.com. Abgerufen 2010-05-02.

Externe Links