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.])