Zeilengröße der L1- und L2-Caches

77

Aus einer früheren Frage in diesem Forum habe ich erfahren, dass in den meisten Speichersystemen der L1-Cache eine Teilmenge des L2-Cache ist, dh jeder aus L2 entfernte Eintrag wird auch aus L1 entfernt.

Meine Frage ist nun, wie ich einen entsprechenden Eintrag im L1-Cache für einen Eintrag im L2-Cache ermitteln kann. Die einzigen Informationen, die im L2-Eintrag gespeichert sind, sind die Tag-Informationen. Basierend auf diesen Tag-Informationen kann die Adr, wenn ich sie neu erstelle, mehrere Zeilen im L1-Cache umfassen, wenn die Zeilengrößen des L1- und L2-Cache nicht gleich sind.

Kümmert sich die Architektur wirklich darum, beide Zeilen zu leeren, oder verwaltet sie nur den L1- und L2-Cache mit derselben Zeilengröße?

Ich verstehe, dass dies eine politische Entscheidung ist, aber ich möchte die häufig verwendete Technik kennen.

prathmesh.kallurkar
quelle
Gibt es einen Prozessor mit unterschiedlichen Zeilengrößen für L1 und L2?
Oliver Charlesworth
3
Der ursprüngliche Pentium 4 hatte anscheinend 64-Byte-L1-Cache-Zeilen und 128-Byte-L2-Cache-Zeilen.
Paul R
kann jemand die nehalem architektur kommentieren ??? Ich habe einen Artikel über "Cache-Organisation und Speicherverwaltung der Intel Nehalem-Computerarchitektur" gelesen. Hier erwähnen sie nur die Cache-Zeilengröße einmal (64 Bytes)?
prathmesh.kallurkar
1
@PaulR: Der Pentium 4 hatte unabhängige L1- und L2-Caches. Ich würde mir vorstellen, dass Designs, bei denen der L1-Cache eine Teilmenge des L2-Cache sein muss, die Zeilengrößen gleich halten.
David Schwartz
Wenn Sie auf einem x86 arbeiten, gibt der CPUID-Befehl endgültige Informationen zur Cache-Zeilengröße zurück. Google für CPUID und Cache-Zeilengröße für einige schöne Beispiele.
srking

Antworten:

78

In Kern i7 sind die Zeilengrößen in L1, L2 und L3 gleich: das sind 64 Bytes. Ich denke, dies vereinfacht die Aufrechterhaltung der inklusiven Eigenschaft und der Kohärenz.

Siehe Seite 10 von: https://www.aristeia.com/TalkNotes/ACCU2011_CPUCaches.pdf

Neha Karanjkar
quelle
1
Es bleibt abzuwarten, wie assoziativ der Cache ist.
Felix Crazzolara
@ FelixCrazzolara: Das variiert je nach CPU. Siehe zum Beispiel en.wikichip.org/wiki/intel/microarchitectures/skylake_(client) . Auch Welche Cache - Mapping - Technik ist in der Intel - Core - i7 - Prozessor verwendet? enthält einige Details zu Cache-Richtlinien (z. B. einschließlich L3) und ein paar spezifische Beispiele in Warum ist die Größe des L1-Cache in den meisten Prozessoren kleiner als die des L2-Cache?
Peter Cordes
81

Die Größe der Cache-Zeilen beträgt (normalerweise) 64 Byte.

Schauen Sie sich außerdem diesen sehr interessanten Artikel über Prozessor-Caches an: Galerie der Prozessor-Cache-Effekte

Sie finden folgende Kapitel:

  1. Speicherzugriffe und Leistung
  2. Auswirkungen von Cache-Zeilen
  3. Cache-Größen L1 und L2
  4. Parallelität auf Befehlsebene
  5. Cache-Assoziativität
  6. Falsche Cache-Zeilenfreigabe
  7. Hardware-Komplexität
Axel Borja
quelle
22
+1 für den Link. Normalerweise folge ich keinen Links aus den Antworten von SO und bevorzuge Inline-Kondensation. Zum Glück bin ich diesmal gefolgt und es hat sich definitiv gelohnt!
Davide
25

Die gebräuchlichste Technik zur Behandlung der Cache-Blockgröße in einer streng inklusiven Cache-Hierarchie besteht darin, Cache-Blöcke gleicher Größe für alle Cache-Ebenen zu verwenden, für die die Inklusionseigenschaft erzwungen wird. Dies führt zu einem höheren Tag-Overhead als wenn der Cache höherer Ebene größere Blöcke verwendet, was nicht nur den Chipbereich verwendet, sondern auch die Latenz erhöhen kann, da Caches höherer Ebene im Allgemeinen einen schrittweisen Zugriff verwenden (wobei Tags überprüft werden, bevor auf den Datenteil zugegriffen wird). Es vereinfacht jedoch auch das Design etwas und reduziert die verschwendete Kapazität von nicht verwendeten Teilen der Daten. Es ist kein großer Teil der nicht verwendeten 64-Byte-Blöcke in 128-Byte-Cache-Blöcken erforderlich, um die Flächenstrafe eines zusätzlichen 32-Bit-Tags zu kompensieren. Darüber hinaus kann der größere Cache-Block-Effekt der Ausnutzung einer breiteren räumlichen Lokalität durch relativ einfaches Vorabrufen bereitgestellt werden.

Eine weniger verbreitete Technik unterteilt den Cache-Block in Sektoren. Wenn die Sektorgröße mit der Blockgröße für Caches niedrigerer Ebene übereinstimmt, wird das Problem einer übermäßigen Rückinvalidierung vermieden, da jeder Sektor im Cache höherer Ebene über ein eigenes gültiges Bit verfügt. (Das Bereitstellen aller Kohärenzstatus-Metadaten für jeden Sektor anstelle nur der Gültigkeit kann eine übermäßige Verwendung der Rückschreibbandbreite vermeiden, wenn mindestens ein Sektor in einem Block nicht verschmutzt / modifiziert ist und ein gewisser Kohärenzaufwand vorliegt [z. B. wenn sich ein Sektor im gemeinsam genutzten Zustand befindet und ein anderer im exklusiven Zustand kann ein Schreiben in den Sektor im exklusiven Zustand keinen Kohärenzverkehr beinhalten - wenn Snoopy anstelle von Verzeichniskohärenz verwendet wird].)

Die Flächeneinsparungen durch sektorierte Cache-Blöcke waren besonders bedeutend, wenn sich Tags auf dem Prozessorchip befanden, die Daten jedoch außerhalb des Chips lagen. Wenn der Datenspeicher eine Fläche einnimmt, die mit der Größe des Prozessorchips vergleichbar ist (was nicht unangemessen ist), würden 32-Bit-Tags mit 64-Byte-Blöcken ungefähr ein Sechstel (~ 6%) der Prozessorfläche einnehmen, während 128- Byteblöcke würden halb so viel dauern. (IBMs POWER6 +, das 2009 eingeführt wurde, ist möglicherweise der jüngste Prozessor, der On-Prozessor-Chip-Tags und Off-Prozessor-Daten verwendet. Das Speichern von Daten in einem eingebetteten DRAM mit höherer Dichte und Tags in einem SRAM mit niedrigerer Dichte, wie IBM es tat, übertreibt dies bewirken.)

Es ist zu beachten, dass Intel "Cache-Zeile" verwendet, um sich auf die kleinere Einheit und "Cache-Sektor" für die größere Einheit zu beziehen. (Dies ist ein Grund, warum ich in meiner Erklärung "Cache-Block" verwendet habe.) Unter Verwendung der Intel-Terminologie ist es sehr ungewöhnlich, dass die Größe der Cache-Zeilen zwischen den Cache-Ebenen variiert, unabhängig davon, ob die Ebenen streng inklusiv, streng exklusiv oder verwendet waren eine andere Inklusionspolitik.

(Beim strikten Ausschluss wird normalerweise der Cache der höheren Ebene als Opfer-Cache verwendet, bei dem Räumungen aus dem Cache der unteren Ebene in den Cache der höheren Ebene eingefügt werden. Wenn die Blockgrößen unterschiedlich wären und keine Sektorierung verwendet würde, würde eine Räumung den Rest erfordern Der größere Block, der von irgendwoher gelesen und ungültig gemacht werden soll, wenn er im Cache der unteren Ebene vorhanden ist. [ Theoretisch könnte ein strikter Ausschluss mit unflexiblem Cache verwendet werden, der umgeht, wenn eine L1-Räumung L2 umgeht und nur zu L3- und L1 / L2-Cache-Fehlern führt zugeordnet zu entweder L1 oderL2, L1 für bestimmte Zugriffe umgehen. Die Implementierung, die mir am nächsten kommt, ist die Umgehung von L1 durch Itanium für Gleitkommazugriffe. Wenn ich mich richtig erinnere, war L2 inklusive L1.])

Paul A. Clayton
quelle
2

Normalerweise wird bei einem Zugriff auf den Hauptspeicher auf 64 Byte Daten und 8 Byte Parität / ECC (ich weiß nicht genau, welche) zugegriffen. Und es ist ziemlich kompliziert, unterschiedliche Cache-Zeilengrößen auf den verschiedenen Speicherebenen beizubehalten. Sie müssen beachten, dass die Größe der Cache-Zeile mehr mit der Größe der Wortausrichtung in dieser Architektur korreliert als alles andere. Basierend darauf ist es sehr unwahrscheinlich, dass sich eine Cache-Zeilengröße von der Speicherzugriffsgröße unterscheidet. Jetzt sind die Paritätsbits für die Verwendung des Speichercontrollers vorgesehen, sodass die Cache-Zeilengröße normalerweise 64 Byte beträgt. Der Prozessor steuert wirklich sehr wenig über die Register hinaus. Bei allem anderen, was im Computer vor sich geht, geht es mehr darum, Hardware einzubauen, um die CPU-Leistung zu optimieren. In diesem Sinne auch

RD Bhattacharya
quelle