-
Die
Erfindung betrifft ein Verfahren gemäß dem Oberbegriff des Patentspruchs
1.
-
Ein
Cache-Speicher ist ein kleiner, schneller Speicher, der dazu dient,
die am häufigsten
angesprochenen Daten (oder "Wörter") von einem größeren, langsameren
Speicher zu enthalten.
-
Dynamische
Speicher mit wahlfreiem Zugriff (DRAM) haben große Mengen von Speicherkapazität bei verhältnismäßig geringen
Kosten. Unglücklicherweise
ist die Zugriffszeit für
dynamische Random-Speicher langsam im Verhältnis zu der Verarbeitungsgeschwindigkeit
von modernen Mikroprozessoren. Eine kostengünstige Lösung oder Schaffung eines Cache-Speichers
besteht darin, einen statischen Random-Speicher (SRAM) als Cache-Speicher
vorzusehen oder den Cache-Speicher auf dem Prozessor unterzubringen.
Obwohl die Speicherkapazität
des Cache-Speichers verhältnismäßig klein
sein kann, gestattet sie einen Hochgeschwindigkeitszugriff zu den
darin gespeicherten Daten.
-
Das
Funktionsprinzip der Cache-Speicher ist Folgendes: Wenn zum ersten
Mal eine Instruktion oder ein Datenort angesprochen wird, muß von dem
langsameren Speicher aus zugegriffen werden. Die Instruktion oder
die Daten werden dann im Cache-Speicher gespeichert. Ein nachfolgender
Zugriff auf die gleiche Instruktion oder die Daten erfolgt dann über den
schnelleren Cache-Speicher, wodurch die Zugriffszeit minimiert und die
Gesamtwirkung des Systems verbessert wird. Da die Speicherkapazität des Cache-Speichers
begrenzt und typischerweise viel kleiner als. die Speicherkapazität des Systemspeichers
ist, ist der Cache-Speicher häufig
voll und ein Teil seines Inhalts muß verändert werden, wenn auf neue
Befehle oder Daten zugegriffen wird.
-
Der
Cache-Speicher wird auf verschiedene Weise betrieben, so daß er die
Befehle oder Daten speichert, die zu einer bestimmten Zeit wahrscheinlich
benötigt
werden. Wenn auf den Cache-Speicher zugegriffen wird und er die
angeforderten Daten enthält,
tritt ein Cache-"Hit" auf. Wenn andererseits
der Cache-Speicher die angefragten Daten nicht enthält, dann
wird dies "Miss" genannt. Daher werden
die Inhalte des Cache-Speichers
typischerweise so verwaltet, daß das
Verhältnis
von Hit zu Miss maximiert wird.
-
Das
Löschen
einer bestimmten Speicheradresse in einem Cache-Speicher erfolgt
nach einem Ersetzungs-Algorithmus.
-
Ein
Cache-Speicher kann in seiner Gesamtheit periodisch gelöscht werden,
oder wenn bestimmte vorgegebene Zustände auftreten. Ferner können die
einzelnen Cache-Zeilen als Teil eines Ersetzungs-Algorithmus gelöscht werden.
In Systemen, die einen Cache-Speicher enthalten, ist die Cache-Zeile
der vollständige Datenteil,
der zwischen dem Cache-Speicher und dem Hauptspeicher ausgetauscht
wird. In jedem Fall werden als unsauber ("dirty") gekennzeichnete Daten in den Hauptspeicher
zurück
geschrieben. Daten werden als "dirty" bezeichnet, wenn
sie noch nicht in den Hauptspeicher eingeschrieben sind. Cache-Zeilen, die mit dirty-Bit
gekennzeichnet sind, werden dann gelöscht. Der gelöschte Cache-Speicher
oder die gelöschte
Cache-Zeile können
dann neue Daten speichern.
-
Wenn
eine Cache-Säuberung
vorgesehen ist oder wenn vorgegebene Bedingungen für eine Cache-Säuberung
erfüllt
sind, wird der Cache-Speicher geleert. Das heißt, alle Zeilen, die "dirty" Daten im Cache-Speicher
enthalten, werden in den Hauptspeicher geschrieben.
-
Für die Intel-Familie
der P6 Mikroprozessoren (z.B. Pentium II, Celeron) existiert eine
Gruppe von Mikrooperationen, die benutzt werden, um die Cache-Zeilen
für bestimmte
Cache-Levels zu leeren.
-
Systeme,
die eine hohe Datenrate erfordern, löschen die Daten. kontinuierlich,
während
sie "dirty" werden. Dies gilt
insbesondere für
Systeme, die einen hohe Datenfluss zwischen dem Prozessor und dem
Systemspeicher haben, wie dies bei graphischen Pixelmanipulationen
der anspruchsvollsten Art für
3-D- und Video-Anwendungen der Fall ist. Die Probleme bei derzeitigen
Systemen liegen in der hohen Bandbreite zwischen dem Cache-Speicher
und dem Systemspeicher die benötigt
wird, um die Kopien vom Schreib-Kombinier-Puffer und vom Speicher-Puffer
aufzunehmen.
-
Es
muß daher
einem Prozessor erlaubt sein, die Cache-Zeile zu säubern, die
zu einer linearen Speicheradresse von allen Cache-Speichern in der
Kohärenzdomäne gehört.
-
Aus
der
US 5,530,075 A ist
bereits ein Schreib-Kombinier-Puffer
(Write-Combining-Buffer) in Verbindung mit einem Mikroprozessor
bekann, der nicht nur ein reines WRITE-COMBINE, sondern auch ein
WRITE-BACK durchführt.
Allerdings werden dabei keine Mikrooperationen abgespeichert.
-
Aufgabe
der Erfindung ist es, ein Verfahren anzugeben, mit dem ein effizientes
Cache-Flushen durchgeführt
werden kann.
-
Zur
Lösung
dieser Aufgabe dient das Verfahren nach Patentanspruch 1.
-
Der
Schreib-Kombinier-Puffer (auch Write-Combining-Buffer genannt) wird
gemäß der Erfindung
dazu verwendet, einen Löschbefehl
und eine Speicheradresse zunächst
zu speichern und anschließend
den Löschbefehl
zusammen mit der Speicheradresse an einen Bus-Controller zu übertragen,
der dann die Speicheradresse löscht.
Mit anderen Worten verwendet die Erfindung den Write-Combining Buffer
des Write-Combining Memory in einer neuen Weise.
-
Die
hier beanspruchte Erfindung wird in Einzelheiten unter Bezugnahme
auf die Zeichnungen beschrieben, in welchen gleiche Teile mit gleichen
Bezugszeichen versehen sind und wobei:
-
1 eine
Mikroprozessorarchitektur verdeutlicht; und
-
2 Flussbilder einer Ausführungsform
des Cache-Zeilen-Säuberungsprozesses
sind.
-
Per
Definition ist eine Cache-Zeile entweder vollständig valid oder vollständig invalid;
eine Cache-Zeile kann niemals teilweise valid sein. Zum Beispiel,
wenn der Prozessor nur wünscht,
ein Byte zu lesen, müssen alle
Bytes einer zugehörigen
Cache-Zeile in dem Cache-Speicher gespeichert werden; anderenfalls
tritt ein Cache-Miss auf. Ein Cache-Verzeichnis wird für die Cache-Verwaltung
verwendet. Cache-Zeilen enthalten üblicherweise mehr Daten als
in einem einzigen Bus-Zyklus übertragen
werden können.
Aus diesem Grund setzen die meisten Cache-Controller einen Burst-Modus
ein, wodurch vorgegebene Adressenfolgen es möglich machen, Daten schneller
durch einen Bus zu übertragen.
Dies wird für
das Füllen
von Cache-Zeilen oder für das
Rückschreiben
von Cache-Zeilen benutzt, da diese Cache-Zeilen einen zusammenhängenden
und ausgerichteten Adressenbereich darstellen.
-
Eine
Technik für
das Säubern
der Cache-Zeile kann einer linearen Speicheradresse zugeordnet werden.
Nach der Durchführung
löscht
das System die Cache-Zeile, die zu dem Operanden von allen Cache-Speichern
in der Kohärenzdomäne gehört. In einer
Multi-Prozessorumgebung wird die angesprochene Cache-Zeile von allen Cache-Levels
der Hierarchie in allen Mikroprozessoren des Systems (d.h. der Kohärenzdomäne) gesäubert, und
zwar in Abhängigkeit
vom Prozessorzustand. Das MESI-Protokoll (Modified, Exklusive, Shared, Invalid)
teilt jeder Cache-Zeile einen von vier Zuständen zu, die von zwei MESI-Bits
verwaltet werden. Die vier Zustände
identifizieren außerdem
die vier möglichen
Zustände
einer Cache-Zeile. Wenn sich herausstellt, daß der Prozessor im "Exklusive"- oder "Shared"-Zustand ist, dann
gehört
das Säubern
zu der Cache-Zeile,
die invalid gemacht wird. Ein weiteres Beispiel trifft zu, wenn
gefunden wird, daß sich
der Cache im "Modified"-Zustand befindet. Wenn ein Cache-Controller
ein Zurückschreiben
durchführt
und, bei einem Cache-Hit, lediglich Daten von dem Prozessor in seinen
Cache-Speicher speichert, dann muß der Cache-Zeileninhalt zum
Hauptspeicher übertragen
werden und die Cache-Zeile wird invalid gemacht.
-
Im
Vergleich zu anderen Speicher-Makrobefehlen, ist die Cache-Zeilen-Säuberung
(CLFLUSH) nicht streng geordnet, und zwar unabhängig vom Speichertyp, zu dem
die Cache-Zeilensäuberungs-Makrobefehle gehören. Im
Gegensatz dazu ist das Verhalten des Speicher-Subsystems des Prozessors
schwach geordnet. Andere Makrobefehle können verwendet werden, um das
Beladen, Speichern, oder Wiederherstellen der sequentiellen Ablauffolge
unmittelbar vor und gleich nach CLFLUSH für den Speicherzugriff stark
zu ordnen und zu garantieren.
-
Eine
Mikrooperation, die sich "clflush_micro_op" nennt, wird verwendet,
um den CLFLUSH-Makrobefehl durchzuführen.
-
In 1 ist
ein Beispiel für
einen Mikroprozessorspeicher und ein Bus-Subsystem mit den Funktionen Lesen
und Schreiben dargestellt. In 1 sind zwei
Cache-Levels in dem Mikroprozessor angenommen: Ein (L1) Cache-Speicher
auf dem Chip, welches der Cache-Level am nächsten zum Prozessor ist, und
ein Cache-Speicher eines zweiten Levels (L2), welches der Cache-Level
ist, der am weitesten vom Prozessor entfernt liegt.
-
Eine
Befehlsholeinheit 102 nimmt Makrobefehle für eine Befehlsdekodereinheit 104 auf.
Die Dekodereinheit 104 dekodiert die Makrobefehle in eine
Folge von Mikrobefehlen, die an eine Wartestation 106 und
an einen Aufzeichnungs-Zwischenspeicher und Registerdatei 108 weitergeleitet
wird. Wenn eine Instruktion in das Speicher-Subsystem eintritt,
wird es im Lade-Zwischenspeicher 112 oder Speicherungs-Zwischenspeicher 114 zunächst gehalten,
und zwar in Abhängigkeit
davon, ob es eine Lese- oder Schreibe-Speichermikroinstruktion ist.
In der Einheit des Speicher-Subsystem, in dem sich solche Zwischenspeicher
befinden, laufen diese Befehle durch Speicherauswahlsüberprüfungen,
die durch die Speicherauswahleinheit 110 vorgenommen werden.
Wenn keine Speicherabhängigkeiten
existieren, wird die Instruktion an die nächste Einheit in dem Speicher-Subsystem
weitergeleitet, nachdem sie einer physikalischen Adressenveränderung
unterzogen wurde. Im Falle eines Miss wird die Instruktion in eine
Gruppe von Puffern oder Zwischenspeichern übertragen, von wo aus sie an
das Subsystem 140 des Mikroprozessors geleitet wird. Im
Falle eines cachebaren Lese-Miss, wird die Instruktion an Lesespeicher 122 geleitet,
oder im Falle von Speicherungsfehlern für die Cache-Speicher werden die Befehle an Schreib-Zwischenspeicher 130 gesandt.
Die Schreib-Zwischenspeicher können
entweder schwach geordnete Schreib-Kombinierpuffer 132 oder
Nicht-Schreib-Kombinierpuffer 134 sein.
In der Bus-Controllereinheit 140 wird die Lese- oder Schreibmikrooperation
in eine Out-of-Order Warteschlange 144 gestellt. Wenn die
Mikrooperation cachebar ist, wird der L2 Cache 146 auf
einen Hit/Miss überprüft. Im Falle
eines Miss wird die Instruktion durch eine In-Order Warteschlange 142 zum
Vorderseitenbus 150 geleitet, um die gewünschten
Daten von einem Hauptspeicher zu holen oder zu aktualisieren.
-
Der
Weg des "clflush_micro_op" der Mikrooperation
durch das Prozessorspeicher-Subsystem ist ebenfalls in 2 beschrieben. Zu Beginn ruft die Befehlsholeinheit 102 eine Cache-Zeilen-Säuberungsinstruktion
auf, Block 202. Im Block 204 wird der Cache-Zeilen-Säuberungsbefehl
dekodiert zu dem "clflush_micro_op" Mikrovorgang durch
die Befehlsdekodereinheit. Die Mikrooperation wird dann zu einer
Wartestation 106, einem Aufzeichnungspuffer und Registerfile 208 geleitet,
Block 206. Die "clflush_micro_op" Mikrooperation wird
dann zu dem Speicher-Subsystem an einen Ladungseingang gelegt, Block 208.
Ihm wird eine Eingabe im Ladepuffer 112 in der Speicher-Ordereinheit 110 zugeordnet.
-
Das
Verhalten der "clflush_micro_op" in der Speicher-Anforderungseinheit
110 ist
spekulativ. Einfach gesagt bedeutet dies, daß die "clflush_micro_op" außer
Funktion in Bezug auf andere CLFLUSH-Makrobefehle, Lesen und Speichern
durchführen
kann. Sofern nicht MFENCE-Befehle verwendet werden, (unmittelbar
vor und nach den CLFLUSH Makrobefehlen), ist die Durchführung von "clflush_micro_op" in Bezug auf andere Speicher-Beladungen
und Speicherungen nicht garantiert in Ordnung, vorausgesetzt, daß es keine
Adressenabhängigkeiten
gibt. Das Verhalten von CLFLUSH durch das Speicher-Subsystem ist
schwach geordnet. Die folgenden Tabellen führen die Orderbedingungen für CLFLUSH
auf. Tabelle 1 listet die Verwaltungsbedingungen, die von späteren Speicher-Zugriffsbefehlen
beeinflusst werden, im Vergleich zu einem früheren CLFLUSH auf. Tabelle
2 listet das Gegenteil von Tabelle 1, indem die Verwaltungsbeschränkungseinflüsse von früheren Speicher-Zugriffsbefehlen
in Bezug auf spätere
CLFLUSH-Instruktionen
angezeigt werden. Die aufgeführten
Speicher-Zugriffstypen
sind nicht cachebarer Speicher (UC), Rückschreibespeicher (WB), und nicht-cachebarer
spekulativer Schreibkombinationsspeicherzugriff (USWC).
Tabelle
1: Anordnung von Befehlen im Speicher in Bezug auf einen älteren CLFLUSH
- Hinweis: N = nicht zugelassen, J = zugelassen
-
Tabelle
2: Anordnung von Befehlen im Speicher in Bezug auf einen früheren CLFLUSH
-
Von
der Speicher-Verwaltungseinheit 110 wird die "clflush_micro_op" Mikrooperation an
die L1 Cache-Controllereinheit 120,
Block 210 gelegt. Die "clflush_micro_op" Mikrooperation wird
an den Ladeeingang gelegt; sie wird jedoch in einem Schreib-Kombinierpuffer 132 gepipelined.
Von der L1 Cache-Controllereinheit weiter wird der "clflush_micro_op" vom der Ladepuffer
zum Speicherpuffer geschaltet.
-
Der
Entscheidungsblock 212 stellt fest, ob keine Schreib-Kombinierpuffer 132 verfügbar sind.
Wenn keine verfügbar
sind, geht der Fluss zurück
zum Block 210. Im anderen Fall geht es weiter zum Block 214. Unabhängig vom
Speichertyp und ob der L1 Cache einen Hit oder Miss ausgibt, ist
ein Schreib-Kombinierpuffer 132 vorgesehen,
um einen einlaufenden "clflush_micro_op" zu bedienen, Block 214.
Ein Steuerfeld wird jedem Schreib-Kombinierpuffer 132 in
der L1 Controllereinheit zugeordnet, um festzustellen, welche Self-snoops
an den Bus-Controller 140 gesendet
werden müssen.
Dieses Kontrollbit, das "clflush_miss" genannt wird, wird
exklusiv für
ein "clflush_micro_op" gesetzt, wenn der
L1 Cache-Speicher einen Miss ausgibt.
-
Beim
Eintreten in das Speicher-Subsystem des Mikroprozessors werden mehrere
Bits der Adresse, die den Cache-Zeilenzugriff von einem "clflush_micro_op" freigeben, auf Null
gesetzt, Block 216. In der Pentium pro Familie von Mikroprozessoren
wären dies
die unteren 5 Bits der Adresse (Adresse[4:0]). Dies wird sowohl
in dem L1 Cache, als auch in der L2 Cache-Controllereinheit 120 nach
Durchführung
des Säuberungsbefehls
getan. Das Auf-Null-Setzen hilft bei der Bestimmung, ob ein Cache-Zeilen-Hit
oder -Miss vorliegt. Da lediglich eine Kennzeichnungsübereinstimmung
festlegt, ob ein Hit oder ein Miss vorliegt, wird kein Byte-Freigabe-Vergleich
benötigt.
Es wird darauf hingewiesen, daß gemäß Definition
kein teilweiser Hit möglich
ist. Das Auf-Null-Setzen der Adressenbits [4:0] liefert ferner einen
alternativen Mechanismus zu dem, der in der Speicher-Verwaltungseinheit 110 für die Maskierung
von Leitungsteilzugriffen verwendet wird.
-
Ein
weiteres Kontrollbit, das jedem Schreib-Kombinierpuffer 132 in der
L1 Cache-Controllereinheit 120 hinzugefügt wird, wird verwendet, um
zwischen einem Schreib-Kombinierpuffer 132,
der für
ein "clflush_micro-_op" dient, und einem
anderen, der für
eine Schreib-Kombinierspeicherung vorgesehen ist, zu unterscheiden,
Block 218. Dieses Kontrollbit, das "clflush_op" genannt wird, wird exklusiv für jene Schreib-Kombinierpuffer
gesetzt, die ein "clflush_micro-_op" ausführen. Es
wird verwendet, um die Anforderung und Säuberungsattribute auszuwählen, die
von dem L1 Cache-Controller 120 zum
Bus-Controller 140 geschickt werden.
-
Im
Falle eines L1 Cache-Hits, wie er durch den Entscheidungsblock 222 bezeichnet
ist, werden sowohl "säubere L1" und "säubere L2" Attribute an den Bus-Controller 140 gesendet,
bei einer Ausgabe aus der L1 Cache-Controllereinheit 120,
Blöcke 224 und 228.
Der Bus-Controller 140 enthält den L2 Cache 146 und
externe Bus-Steuereinheiten.
-
Andererseits
wird im Falle eines L1 Cache-Miss, wie er durch den Entscheidungsblock 222 definiert wird,
das "clflush_miss" Kontrollbit gesetzt
und lediglich das "säubere L2" Attribut wird zu
den Blöcken 228 und 232 geleitet.
Dies hilft, die Wirkungsweise zu verbessern, indem das interne Selfsnooping
beim L1 Cache-Speicher weggelassen wird.
-
Bei
ihrer Ausgabe aus der Speicher-Verwaltungseinheit 110 wird
die "clflush_micro_op" Mikrooperation von
der L1 Cache-Controllereinheit 120 geblockt,
wenn keine Schreib-Kombinierpuffer 132 verfügbar wären, Block 212.
In solchem Falle gibt es einen Schreib-Kombinierpuffer 132 frei,
wie dies durch den Schreib-Kombinierzeiger mit zirkularer Zuordnung
angedeutet wird. Dies garantiert, daß keine Blockade Zustände aufgrund
des Fehlens von freien Schreib-Kombinierpuffern 132 auftreten.
Wenn sie blockiert sind, wird "clflush_micro_op" wieder angelegt,
sobald der Blockierzustand entfernt ist. Ein Beispiel, das das Absetzen
der "clflush_micro_op" Instruktion hervorrufen
würde,
ist die abgeschlossene Freigabe eines zuvor angesprochenen Schreib-Kombinierpuffers 132.
-
Die "clflush_micro_op" Mikrooperation wird
durch das Speicher-Subsystem beendet, wenn es in einen Schreib-Kombinierpuffer 132 im
L1 Cache-Controller 120 untergebracht ist. Dies gestattet
ein Pipelining: Nachfolgende Befehle können durchgeführt werden
vor dem Abschluss der "clflush_micro_op" Mikrooperation.
Das Pipelining verbessert die Gesamtwirksamkeit des Systems.
-
Es
gibt zwei. Verfahren, um einen Schreib-Kombinierpuffer freizugeben,
der einen "clflush_micro_op" Mikrovorgang bedient.
-
Ein
Schreib-Kombinierpuffer 132, der ein "clflush_micro_op" bedient, wird von den gleichen laufenden Freigabebedingungen
freigegeben, die gerade an die Schreib-Kombinierpuffer 132 in der
Familie der Intel P6 Mikroprozessoren gelegt wird. Ferner geben
auch MFENCE Makrobefehle einen Schreib-Kombinierpuffer frei, der
einen "clflush_micro_op" Mikrovorgang durchführt.
-
Ferner
geben einige Ausführungsformen
einen "clflush_micro_op" Exklusiv aus. Dies
wird getan, um zu verhindern, daß ein Schreib-Kombinierpuffer,
der einen "clflush_micro_op" über einen langen Zeitraum durchführt, wenn
der Programmierer die Verwaltung nicht unterstützen will und wenn eine Abschirmungsinstruktion
nicht verwendet wird, hängen
bleibt. Ein Steuerungsbit, das "clflush_evict" genannt wird, wird
jedem Schreib-Kombinierpuffer 132 zugeordnet, der ein "clflush_micro_op" bedient. Dieses
Kontrollbit wird gesetzt, wenn ein Schreib-Kombinierpuffer 132 einem "clflush_micro_op" zugeordnet wird.
Sobald das "clflush_evict" Bit gesetzt ist,
ist der entsprechende Schreib-Kombinierpuffer zum Zurückschreiben
markiert und das Steuerungsbit wird zurückgesetzt, Block 230.
Dieser Austreibungszustand gilt exklusiv für Schreib-Kombinierpuffer 132,
die eine "clflush_micro_op" Mikrooperation bedienen.
Es wird die Ausführung
von Programmen, die CLFLUSH verwenden, verbessert, indem nicht erlaubt
wird, daß "clflush_micro_op" Mikrooperationen
die Schreib-Kombinierpuffer 132 Möglichkeiten für längere Zeiträume belegen
und sie daher für
andere Schreib-Kombinieroperationen
freigeben.
-
Tabelle
3: Speicher zu Bus-Transaktionen für CLFLUSH
-
Es
wird darauf hingewiesen, daß dann,
wenn "clflush_miss" = "clflush_op" = '0' ist, der Anforderungstyp eine der existierenden
Transaktionen in der P6 Familie von Mikroprozessoren ist (jedoch
nicht CLFLUSH), und die Säuberungsattribute
werden dementsprechend gesetzt/gelöscht.
-
Die
Tabelle 4 weiter unten zeigt die Bedingungen, unter den die drei
Kontrollbits für
die Schreib-Kombinierpuffer 132 gesetzt und rückgesetzt
werden. Das "clflush_evict" Kontrollbit kann
nur nach dem "clflush_micro_op" Kontrollbit gesetzt
werden. Das "clflush_micro_op" wird aufgrund spekulativer
Zuordnungen der Schreib-Kombinierpuffer 132 gesetzt, während "clflush_evict" ausschließlich aufgrund
einer realen Zuordnung eines Schreib-Kombinierpuffers 132 für ein "clflush_op" gesetzt wird. Das "clflush_miss" Kontrollbit wird
ebenso bei spekulativen Schreib-Kombinierpuffer 132 Zuordnungen
gesetzt, wenn das "clflush_micro_op" den L1 Cache-Speicher
misses. Sowohl die "clflush_miss" als auch die "clflush_op" Kontrollbits werden
gelöscht
bei einer spekulativen Zuordnung von Schreib-Kombinierpuffern 132,
um irgendeinen Befehl außer
ein "clflush_micro_op" zu bedienen. Funktional
ist dies ähnlich
wie das Löschen
solcher Steuerbits bei der Aufhebung der Zuordnung eines Schreib-Kombinierpuffers,
der ein "clflush_micro_op" bedient. In einer
Prozessorverwirklichung werden die gleichen Schreibspeicher 130 für Mikrooperationen
des Schreib-Kombinierens und Nicht-Schreibkombinierens geteilt.
Die "clflush_miss" und "clflush_micro_op" Bits werden gelöscht bei
einer spekulativen Zuordnung von irgendeinem Schreibspeicher 130.
Dieses Verhalten stellt sicher, daß die drei Kontrollbits niemals
für einen
Schreibspeicher 130 gesetzt werden können, der nicht ein "clflush_micro_op" bedient. In einer
Prozessorausführung,
bei der alle L1 Cache-Controllerpuffer für sowohl Lesen als auch Schreiben
verwendet werden, wie dies bei der Familie der P6 Mikroprozessoren
ist, müssen
nur die "clflush_miss" und "clflush_op" Kontrollbits bei
der Zuordnung eines Puffers zur Bedienung eines Speichervorgangs
gelöscht werden,
Block 234. Zwischenspeicher, die dazu dienen, Lesedaten
zu bedienen, ignorieren die Werte dieser drei neuen Kontrollbits.
-
Tabelle
4: Bedingungen zum Setzen/Löschen
des neuen Kontrollbits von einem Schreib-Kombinierpuffer im L1 Cache-Controller
-
Es
wird darauf hingewiesen, daß alle
drei neuen WC Pufferkontrollbits auch bei einer "Reset" Sequenz gelöscht werden.
-
Ausführungsformen
können
verwirklicht werden, die den Bus-Controller 140 verwenden.
Wenn ein Schreib-Kombinierpuffer 132, der ein "clflush_micro_op" bedient, für das Auslagern
markiert ist, wird es zu dem Bus-Controller 140 geliefert,
Block 236. Die gesendete Anforderung ist dieselbe wie für eine Schreib-Kombiniertransaktion
für eine
Gesamtzeilen-cachebare Schreib-Kombiniertransaktion,
bis auf die Selfsnoopingattribute. Snooping wird verwendet, um die
Anwesenheit einer spezifischen Speicheradresse in dem zugehörigen Cache-Speicher
zu bestätigen.
Für eine "clflush_micro_op" Auslagerung schnüffelt die
Bus-Steuerung 140 die L1 und L2 Caches basierend auf den "säubere L1" und "säubere
L2" Anforderungsattribute,
Block 250. Ferner gibt der Bus-Controller 140 ein "Bus-Lesen-Ungültigmachen-Leitung" auf dem externen
Bus aus, Block 236. Wenn die L1 Cache-Controllereinheit 120 einen
L1 Cache-Miss feststellt, wird beispielsweise keine "säubere L1" Botschaft gesendet. Die "Bus-Lesen-Ungültigmachen"-Transaktion säubert auf
der gleichen Zeile in jedem anderen Cache-Speicher in der Kohärenzdomäne. Auf
die externe Bus-Transaktion werden alle Byte-Freigaben freigegeben,
was die Datenphase gegenüber
dem Kern markiert. Entscheidungsblöcke 238 und 152 bestimmen,
ob ein Hit oder eine modifizierte Cache-Zeile (HITM) in einem anderen
Cache-Speicher innerhalb der Kohärenzdomäne auftrat
(d.h. nicht die L1 oder L2 Caches in dem abfragenden Mikroprozessor). Wenn
HITM auftritt, dann schreibt der angesprochene Cache in den Hauptspeicher
zurück
und Daten werden zu dem abfragenden Mikroprozessor in Blöcken 244 und 254 zurückgeführt. Der
Schreib-Kombinierpuffer 132 in der L1 Cache-Controllereinheit 120 bleibt
bis zum Abschluss der Schnüffelphase
und möglicherweise
bis zur Rückübertragung
von Daten von einem anderen Cache-Speicher in der Kohärenzdomäne zugeordnet,
beispielsweise ein HITM auf einem externen Bus. Daten, die als Folge
der Schnüffelphase
oder eines Abfragezyklus zurück
zu dem Schreib- Kombinierpuffer 132 kommen,
werden ignoriert, Blöcke 246 und 248.
-
Alle
Säuberungen
sind dann abgeschlossen und die Schreib-Kombinierpuffer 132 sind im
Block 260 wieder nicht-zugeordnet.
-
Die
nachfolgende Tabelle 5 zeigt wie der externe Bus-Controller
140 alle
Schreib-Kombinierauslagerungen behandelt. Die Anforderung von dem
L1 Cache an den Bus-Controller
140 für eine "clflush_micro_op"-Auslagerung, wie beispielsweise der
CLFLUSH Makrobefehl, kann auf das gleiche Anforderungssignal wie
das für
ein Auslagern einer Vollzeilen-cachebaren Schreib-Kombinierung gelesen
werden; die Selfsnoopingattribute unter-scheiden sich jedoch. Tabelle
5: Externe Bus-Controllertransaktionen für Schreib-Kombinieraustreibungen
- Hinweis: USWC Speicherungen sind nicht
aliased in der P6 Familie von Mikroprozessoren und werden daher nicht
self-snooped.
-
Zur
Prüfbarkeit
und zu Fehlerbehebungszwecken kann ein für den Benutzer nicht sichtbares
Modusbit zu dem CLFLUSH Freigabe/Sperren Makrobefehl hinzugefügt werden.
Im gesperrten Zustand behandelt die L1 Cache-Controllereinheit 120 die
eingehende "clflush_micro_op" Mikrooperation als
einen No-Operation-Opcode ("NOP") und ordnet niemals
einen Schreib-Kombinierpuffer 132 zu. Das NOP-Verhalten
kann an uncachebaren Daten-Vorzugriffen
implementiert werden.