webentwicklung-frage-antwort-db.com.de

Zeilengröße der L1- und L2-Caches

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

Meine Frage ist nun, wie ich einen entsprechenden Eintrag im L1-Cache für einen Eintrag im L2-Cache ermittle. Die einzige im L2-Eintrag gespeicherte Information sind die Tag-Informationen. Basierend auf diesen Tag-Informationen kann sich die Addr beim erneuten Erstellen über mehrere Zeilen im L1-Cache erstrecken, wenn die Zeilengrößen von L1- und L2-Cache nicht identisch 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 allgemein verwendete Technik kennen.

64

Im Core i7 sind die Zeilengrößen in L1, L2 und L3 gleich: das sind 64 Bytes. Ich denke, dies vereinfacht die Aufrechterhaltung des integrativen Eigentums und der Kohärenz.

Siehe Seite 28 von: https://www.scss.tcd.ie/Jeremy.Jones/CS3021/5%20caches.pdf

66
Neha Karanjkar

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 Cachezeilen
  3. L1- und L2-Cache-Größen
  4. Parallelität auf Befehlsebene
  5. Cache-Assoziativität
  6. Falsche Cache-Zeilenfreigabe
  7. Hardware-Komplexität
69
Axel Borja

Die gebräuchlichste Methode zum Behandeln der Cache-Blockgröße in einer streng inklusiven Cache-Hierarchie besteht darin, Cache-Blöcke mit derselben 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 die Chipfläche, sondern auch die Latenz erhöht, da Caches höherer Ebene im Allgemeinen einen phasenweisen 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 aus 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 Bereichsstrafe 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, was den Vorteil hat, dass keine Kapazität ungenutzt bleibt, wenn der nahegelegene Block nicht geladen wird (um Speicherbandbreite zu sparen oder die Latenz in einem widersprüchlichen Speicher zu verringern) read) und dass der Adjazenz-Vorabruf nicht auf einen größeren ausgerichteten Block beschränkt sein muss.

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

Die Flächeneinsparungen durch sektorielle Cache-Blöcke waren besonders bedeutend, wenn sich Tags auf dem Prozessorchip befanden, die Daten jedoch außerhalb des Chips lagen. Wenn die Datenspeicherung eine Fläche einnimmt, die mit der Größe des Prozessorchips vergleichbar ist (was nicht unangemessen ist), dann würden 32-Bit-Tags mit 64-Byte-Blöcken ungefähr ein Sechzehntel (~ 6%) der Prozessorfläche einnehmen, während 128-Bit-Tags Byte-Blöcke würden die Hälfte der Zeit in Anspruch nehmen. (Das 2009 eingeführte POWER6 + von IBM ist möglicherweise der jüngste Prozessor, der Tags auf dem Prozessorchip und Daten außerhalb des Prozessors verwendet. Das Speichern von Daten in Embedded-DRAMs mit höherer Dichte und Tags in SRAMs mit niedrigerer Dichte, wie es IBM getan hat, übertreibt dies bewirken.)

Es ist anzumerken, 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 Terminologie von Intel wäre es sehr ungewöhnlich, dass die Größe der Cache-Zeilen zwischen den Cache-Ebenen unterschiedlich ist, unabhängig davon, ob die Ebenen streng inklusiv, streng exklusiv sind oder verwendet werden einige andere Inklusionspolitik.

(Beim strikten Ausschluss wird normalerweise der Cache höherer Ebene als Opfer-Cache verwendet, in dem Räumungen aus dem Cache niedrigerer Ebene in den Cache höherer Ebene eingefügt werden. Wenn die Blockgrößen unterschiedlich sind und keine Sektorisierung verwendet wird, ist für eine Räumung der Rest von erforderlich Der größere Block, von dem irgendwo gelesen werden soll nd ist ungültig, wenn er im Cache der unteren Ebene vorhanden ist. [Theoretisch, ein strikter Ausschluss könnte bei Umgehung des unflexiblen Caches verwendet werden, wenn eine L1-Räumung umgangen würde L2 und gehe zu L3 und L1/L2 Cache-Fehlschläge würden nur entweder L1 oder L2 zugewiesen, wobei L1 für bestimmte Zugriffe umgangen wird Es ist bekannt, dass Itanium L1 für Fließkommazugriffe umgeht. Wenn ich mich recht entsinne, enthielt L2 L1.])

21
Paul A. Clayton

Typischerweise wird bei einem Zugriff auf den Hauptspeicher auf 64 Bytes Daten und 8 Bytes 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 Cache-Zeilengröße stärker mit der Word-Ausrichtungsgröße dieser Architektur korreliert als alles andere. Auf dieser Grundlage ist es sehr unwahrscheinlich, dass sich die Cache-Zeilengröße von der Speicherzugriffsgröße unterscheidet. Jetzt sind die Paritätsbits für die Verwendung des Speichercontrollers vorgesehen - daher beträgt die Cache-Zeilengröße normalerweise 64 Byte. Der Prozessor steuert wirklich sehr wenig über die Register hinaus. Bei allen anderen Vorgängen im Computer geht es eher darum, Hardware für die Optimierung der CPU-Leistung zu installieren. In diesem Sinne wäre es auch nicht sinnvoll, zusätzliche Komplexität zu importieren, indem die Cache-Zeilengrößen auf verschiedenen Speicherebenen unterschiedlich festgelegt werden.

2
RD Bhattacharya