-
Die vorliegende Erfindung bezieht
sich auf ein Multiprozessor-Computersystem und auf ein Verfahren
zum Vorsehen eines ordnungsgemäßen Verkehrsflusses
in einem solchen System.
-
Diese Erfindung findet Anwendung
auf verzeichnisbasierten, skalierbaren Multi- bzw. Mehrprozessor-Computersysteme
mit gemeinsam genutztem Speicher, um Transaktionsverklemmung bzw.
-deadlock auf irgendeinem Knoten zu vermeiden, auch wenn Transaktionsflußkontrolle
bzw. -steuerung zwischen den Knoten nicht implementiert ist.
-
Computer haben interne Taktschaltkreise, welche
die Computerzyklen steuern. Je schneller der Takt ist, desto schneller
kann der Computer zugewiesene Aufgaben erledigen. In den frühen achtziger Jahren
betrug die durchschnittliche Taktrate eines allgemein verfügbaren Mikroprozessors
etwa 4 Megahertz. 1996 sind Mikroprozessoren mit Taktraten über 200
Megahertz üblich.
Taktratenzuwächse
folgen im allgemeinen Zuwächsen
der Transistordichte. In der Vergangenheit hat sich die Anzahl von
Transistoren pro Flächeneinheit
alle 18 Monate verdoppelt. Jedoch wird erwartet, daß Zuwächse der
Prozessortaktraten, die auf Zuwächse
der Transistordichte zurückzuführen sind,
langsamer werden. Die erhöhte
Transistordichte erfordert effektivere Kühlung, um der Hitze, die durch
gestiegene Verlustleistung erzeugt wird, entgegenzuwirken. Zusätzlich erschwert
die Notwendigkeit, Komponenten dicht zu packen, um große Leitungslängen und
damit verbundene Übertragungsverzögerungen
zu vermeiden, das Hitzeproblem.
-
Angesichts des fundamentalen Problems
mit der Verlustleistung, das durch sehr bzw. extrem hohe Taktraten
aufgeworfen wird, werden skalierbare, parallele Computerarchitekturen,
die mehrere Prozessoren verwenden, zunehmend attraktiv. Unter dem
Begriff "skalierbar" wird verstanden, daß Mehrprozessorsysteme anfänglich mit
einigen wenigen Prozessoren aufgebaut werden können und dann zu einem späteren Zeitpunkt
zu leistungsfähigen
Systemen, die Dutzende, Hunderte oder sogar Tausende von Prozessoren
enthalten, erweitert werden können.
Es werden massiv-parallele Computer, die mit relativ billigen, großvolumigen
Mikroprozessoren aufgebaut sind, hergestellt, die in der Lage sind,
die Leistung eines Supercomputers bereitzustellen. Tatsächlich sind
Mehrfachcomputersysteme für
gewisse Anwendungen wie zum Beispiel Datenbank-Management in der Lage, Leistung bereitzustellen,
die der von Systemen, die mit einem einzelnen, leistungsstarken
Prozessor aufgebaut sind, bei weitem überlegen ist trotz des gestiegenen
Overheads, der mit parallelen Systemen verbunden ist.
-
Im gleichen Maße, in dem effizientere Systemsoftware
geschrieben wird und parallele Systemarchitekturen reifen, wird
die Leistungsfähigkeit und
Nützlichkeit
von massiv-parallelen Computern dramatisch zunehmen. Um die Engpässe, die
mit dem Zugriff auf den Hauptspeicher verbunden sind, zu verkleinern,
werden massiv-parallele Systeme hergestellt und entworfen, die Hauptspeicher
auf die individuellen Prozessoren oder auf die Systemknoten, die
mehrere Prozessoren haben, ver teilen. Um den Speicherzugriff zu
beschleunigen, ist jeder Prozessor innerhalb eines parallelen Systems
typischerweise mit einem Cache ausgerüstet. Es wird allgemein zugestanden,
daß je
größer der
mit jedem Prozessor verbundene Cache, desto größer die Systemleistung ist.
-
Mehrprozessor-Computersysteme mit
mehrfachen Caches und cachekohärentem
Arbeitsspeicher können
auf einige Cachearchitekturen wie zum Beispiel Non-Uniform Memory
Architecture (NUMA) (nicht gleichförmige Speicherarchitektur)
oder Cache-Only Memory Architecture (COMA) (Nur-Cache-Speicherarchitektur)
basieren. Für
beide Arten von Architekturen werden cachekohärente Protokolle benötigt zur
Erhaltung der Kohärenz
zwischen den Inhalten der verschiedenen Caches. Zur Klarstellung soll
der Begriff "Cache" nur einen Cache zweiter Stufe, der direkt einem
Prozessor zugeordnet ist, bezeichnen. Der Begriff "Cachearbeitsspeicher"
soll andererseits nur auf den Hauptspeicher innerhalb eines Knotens
eines COMA-artigen Systems, der als ein Cachearbeitsspeicher fungiert,
auf den alle Prozessoren in diesem Knoten gleichermaßen Zugriff
haben und der direkt mit der lokalen Verbindung bzw. Zusammenschaltung
verbunden ist, angewandt werden.
-
1 ist
ein Architektur-Blockdiagramm eines parallelen Computersystems mit
NUMA-Architektur.
Das Computersystem 100 enthält eine Mehrzahl von Subsystemen
(auch bekannt als Knoten) 110, 120, ... 180,
die untereinander über
eine globale Verbindung oder Zusammenschaltung 190 verbunden
sind. Jedem Knoten ist eine eindeutige Netzknotenadresse zugewiesen.
Jedes Subsystem enthält mindestens
einen Prozessor, eine entsprechende Anzahl von Speicherverwaltungseinheiten
(memory management units, MMUs) und Caches, einen Hauptspeicher,
eine globale Schnittstelle (global interface, GI) und eine Zusammenschaltung
der lokalen Knoten (local-node interconnect, LI). Zum Beispiel enthält der Knoten 110 Prozessoren 111a, 111b, ... 111i,
MMUs 112a, 112b, ... 112i, Caches 113a, 113b,
... 113i, den Hauptspeicher 114, die globale Schnittstelle 115 und
die Zusammenschaltung der lokalen Knoten 119.
-
Bei NUMA-Architekturen ist der gesamte physikalische
Adreßraum
des Systems auf die Hauptspeicher der verschiedenen Knoten verteilt. Daher
ist die Partitionierung des globalen Adreßraumes (GA-Raumes) statisch
und beim Systemhochfahren vorab festgelegt (d. h. vor der Ausführung von Anwendungssoftware).
Dementsprechend müssen beim
ersten Mal, wenn der Knoten 110 eine Adreßposition
außerhalb
seines vorab zugewiesenen Teils des globalen Adreßraumes
lesen oder beschreiben muß,
die Daten von einer globalen Adresse in einem der anderen Subsysteme
geholt werden. Die globale Schnittstelle 115 ist zuständig für das Verfolgen
des Zustandes von Daten, die mit dem Adreßraum des Hauptspeichers 114 verbunden
bzw. assoziiert sind. Die Zustandsinformation jeder Speicherstelle
wird als ein Speichertag (M-TAG) gespeichert. Die M-TAGs können in
irgendeinem Speicher, der für
diesen Zweck bestimmt ist, gespeichert werden. Zum Beispiel können die
M-TAGs als ein Zweibit-Datenanteil jeder adressierbaren Speicherstelle
im Hauptspeicher 114, innerhalb eines separaten S-RAM-Speichers
(nicht dargestellt) oder innerhalb des Verzeichnisses 116 gespeichert
werden. Daten von den Hauptspeichern 114, 124,... 184 können in
einem oder mehreren Caches 113a, ... 113i, 123a,
... 123i und 183a, ... 183i gespeichert
werden. Um ein herkömmliches,
verzeichnisbasiertes cachekohärentes Schema
zu unterstützen,
enthalten die Knoten
110, 120, ... 180 auch
die Verzeichnisse 116, 126, ... 186 verbunden
mit den globalen Schnittstellen 115, 125, ...
bzw. 185.
-
Da die globale Schnittstelle 115 auch
dafür zuständig ist,
die globale Cachekohärenz
zu bewahren bzw. zu erhalten, enthält die globale Schnittstelle 115 einen
in Hardware und/oder Software implementierten Cachekohärenzmechanismus
zum Bewahren bzw. Erhalten der Kohärenz zwischen den entsprechenden
Caches und Hauptspeichern der Knoten 110, 120,
... 180. Cachekohärenz
ist wesentlich, damit das System 100 ordnungsgemäß Programme, die
gemeinsam genutzten Speicher verwenden, korrekt ausführen kann.
-
Die Beschreibung eines COMA-artigen Computersystems
erfolgt unter Bezug auf 2.
Die Architektur eines parallelen Computersystems mit Cache-Only
Memory Architecture (COMA) ist in vielerlei Hinsicht ähnlich der
eines NUMA-Systems. Jedoch was als Hauptspeicher 114, 124,
... 184 bei der NUMA-Architektur bezeichnet wurde, wird
bei COMA-Architektur als Cachearbeitsspeicher 214, 224, ... 284 bezeichnet.
Bei einem COMA-System ist die Verantwortung für das Verfolgen des Zustands
des gesamten adressierbaren Raumes verteilt unter die entsprechenden
M-TAGS und Verzeichnisse der verschiedenen Knoten (z. B. 210, 220 ... 280).
Die Partitionierung der Cachearbeitsspeicher (z. B. 214, 224,... 284)
des COMA-artigen Computersystems 100 ist dynamisch. Das
heißt,
daß diese
Cachearbeitsspeicher als Attraction Memory funktionieren, wobei
während
der Ausführung
von Software je nach Bedarf Platz im Cachearbeitsspeicher in seitengroßen Abschnitten
zugeordnet bzw. belegt wird. Nichtsdestoweniger kann auf Cacheblöcke bzw.
"-Zeilen" innerhalb jeder zugeordneten bzw. belegten Seite individuell
zugegriffen werden.
-
Folglich vermeidet ein COMA-Computersystem
durch Zuordnen von Speicherplatz in ganzen Seiten in den Cachearbeitsspeichern 214, 224,
... 284 Kapazitäts-
und Zuordnungsprobleme, die mit dem Im-Cache-Halten von großen Datenstrukturen
in NUMA-Systemen verbunden sind. Mit anderen Worten können einfach
durch Ersetzen des Hauptspeichers des NUMA-Systems durch gleich-
bzw. ähnlichgroße, seitenorientierte
Cachearbeitsspeicher große
Datenstrukturen nun in Gänze
im Cache gehalten werden.
-
Bei COMA-Systemen hat die globale
Schnittstelle 215 eine zweifache Verantwortung bzw. Zuständigkeit.
Wie beim NUMA-System ist sie dafür
zuständig,
sich an der Bewahrung bzw. Erhaltung der globalen Kohärenz zwischen
Caches zweiter Stufe (z. B. 213a, ... 213i, 223a,
... 223i und 283a, ... 283i) zu beteiligen.
Darüber
hinaus ist sie zuständig
für das Verfolgen
des Zustandes der Daten, die im Cachearbeitsspeicher 214 des
Knotens 210 gespeichert sind, wobei die Zustandsinformation
als Speichertags (M-TAGs) gespeichert wird. Der Adreßübersetzer 217 ist
zuständig
für das Übersetzen
lokaler physikalischer Adressen (LPAs) in globale Adressen (GAs) für ausgehende
Datenzugriffe und GAs in LPAs für ankommende
Datenzugriffe.
-
In dieser Implementierung ist der
Adreßübersetzer 217 beim
erstenmal, wenn ein Knoten (z. B. Knoten 210) auf eine
bestimmte Seite zugreift, nicht in der Lage, eine gültige Übersetzung
von einer virtuellen Adresse (VA) in eine LPA für Knoten 210 vorzusehen,
was zu einer Softwarefangstelle (Softwaretrap) führt. Ein Trapbehandlungsroutine
(nicht abgebildet) von Knoten 210 wählt eine nicht vennrendete Seite
im Cachearbeitsspeicher 214 aus, um Datenblöcke der
Seite zu halten bzw. abzulegen. M-TAGs des Verzeichnisses 216,
die mit der Seite verbunden sind, abzulegen. M-TAGs des Verzeichnisses 216, die
mit der Seite verbunden sind, werden mit einem Zustand "ungültig" initialisiert
und der Adreßübersetzer 217 wird
auch initialisiert, um Übersetzungen in/von
einer lokalen LPA dieser Seite von/zu der eindeutigen GA zu liefern,
die verwendet wird, um auf diese Seite innerhalb des gesamten Systems 200 zu verweisen.
-
Obwohl ein COMA-System beim Im-Cache-Halten
größerer Datenstrukturen
effizienter ist als ein cachekohärentes
NUMA-System, ist das Zuordnen bzw. Reservieren ganzer Seiten von
Cachearbeitsspeicher auf einmal, um größere Datenstrukturen aufnehmen
zu können,
keine kosteneffektive Lösung
für alle
Zugriffsmuster. Das liegt daran, daß es ineffizient ist, ganze
Seiten im Cache zu halten, wenn die Datenstrukturen dünn besetzt
bzw. verstreut sind oder wenn nur auf wenige Elemente der Struktur
tatsächlich
zugegriffen wird.
-
Um ein besseres Verständnis der
Betriebsweise und der Architektur der globalen Schnittstelle sowohl
des NUMA-artigen als auch des COMA-artigen Systems zu gewährleisten,
wird mit Bezug auf 3 eine
Beschreibung einer herkömmlichen,
globalen Schnittstelle gegeben. Wenn auf Strukturen von 1 Bezug genommen wird, findet
der Bezug auch Anwendung auf die entsprechenden Strukturen von 2. Jede globale Schnittstelle
(z. B. GI 115 von 1 oder
GI 215 von 2)
enthält
einen abhängigen
Agenten (Slave Agent, SA), einen Anforderungsagenten (Request Agent,
RA) und einen Verzeichnisagenten (Directory Agent, DA). Beispiele
solcher Agenten sind SA 315a, RA 315b und DA 315c. Jeder
DA ist für
die Instandhaltung bzw. das Aktuell-Halten der ihm zugeordneten
Verzeichnisse zuständig.
-
Der Zustand von Cachekopien von Knoten 110, 120,
... und 180 wird in den Verzeichnissen 116, 126,
... bzw. 186 aufgezeichnet bzw. bereitgehalten. Wie zuvor
erläutert
ist jede Kopie dadurch gekennzeichnet, daß sie eine von vier Zustandsbedingungen
hat: gemeinsam genutzt (shared, S), in Besitz (owned, O), geändert (modified,
M) oder ungültig
(invalid, I). Ein Zustand "gemeinsam benutzt" zeigt an, daß es andere
Kopien in anderen Knoten gibt, daß kein Zurückschreiben beim Ersetzen bzw.
Neubesetzen erforderlich ist und daß nur Leseoperationen auf der
Speicherstelle ausgeführt
werden können.
Ein Zustand "in Besitz" zeigt an, daß es andere Kopien in anderen
Knoten geben kann, daß ein
Zurückschreiben
beim Ersetzen bzw. Neubesetzen erforderlich ist und daß nur Leseoperationen
auf der Speicherstelle ausgeführt
werden können.
Ein Zustand "geändert" zeigt
an, daß es
keine gemeinsam genutzten Kopien in anderen Knoten gibt und daß ohne Konsequenzen an
anderer Stelle von dieser Speicherstelle gelesen und in sie geschrieben
werden kann. Ein Zustand "ungültig"
zeigt an, daß die
Kopie in der Speicherstelle jetzt ungültig ist und daß die benötigten Daten
von einem Knoten, der eine gültige
Kopie hat, beschafft werden müssen.
-
Ein RA versieht einen Knoten mit
einem Mechanismus zum Senden von Lese- und Schreibanforderungen
an die anderen Subsysteme. Ein SA ist zuständig für das Antworten bzw. Reagieren
auf Anforderungen vom DA eines anderen Knotens.
-
Anforderungen von Daten und Antworten bzw.
Reaktionen auf solche Anforderungen werden von den entsprechenden
Agenten zwischen den Knoten 110, 120, ... und 180 in
der Form von Daten-/Steuerungs-Paketen ausgetauscht, wodurch jeder
Knoten in die Lage versetzt wird, den Überblick über den Zustand aller Daten,
die darin im Cache gehalten werden, zu behalten. Die Zustands information bezüglich der
Cacheblöcke
in den Caches 113a ... 113i, 123a ... 123i und 183a ... 183i wird
in Verzeichnissen 116, 126, ... bzw. 186 gespeichert.
Die Daten-/Steuerungs-Pakete werden zwischen den Knoten über die
globale Zusammenschaltung 190 übertragen. Übertragungen von Daten-/Steuerungs-Paketen
werden durch ein herkömmliches
Netzprotokoll gesteuert bzw. geregelt wie zum Beispiel das Kollisionsentdeckungs-Mehrfachzugangs-Protokoll
(Collision Sense Multiple Access, CSMA), unter dem bzw. mittels
dessen die Knoten 110, 120, ... und 180 auf der
Netzwerkbzw. Vermittlungsschicht des Protokolls lose untereinander
gekoppelt sind. Daher kann die Ankunft der Pakete in der richtigen
Reihenfolge nicht garantiert werden, während das Ankommen der Pakete
am jeweils anderen Ende sichergestellt ist. Fälle von Paketankunft in falscher
Reihenfolge bei den Knoten 110, 120, ... und 180 kann
zu etwas führen, was
als "Eckfälle"
bzw. "Corner Cases" bezeichnet wird. Ein Eckfall bzw. Corner Case
tritt auf, wenn eine früher
ausgesendete, aber später
eingetroffene Anforderung aufgelöst
werden muß,
bevor eine später ausgesendete,
aber früher
eingetroffene Anforderung aufgelöst
wird. Wenn ein solcher Fall nicht erkannt und in richtiger Reihenfolge
aufgelöst
wird, kann die Cachekohärenz
gestört
bzw. unterbrochen werden.
-
Ein weiteres Problem, das mit der Übertragung
von Lese- und Schreibanforderungen verbunden ist, ist es, Systemblockierung
bzw. -deadlock zu verhindern, die bzw. der dadurch verursacht wird, daß mehr Anforderungen
bei einem Knoten eintreffen, als der Knoten gleichzeitig verarbeiten
kann. Es sei angenommen, daß irgendein
Knoten, der in seiner Kapazitätsgrenze
als ein Heimatknoten arbeitet, eine Anzahl y von an den Heimatagenten
gerichteten Anforderungen gleichzeitig verarbeiten kann, und daß irgendein
Knoten, der in seiner Eigenschaft als abhängiger Knoten arbeitet, eine
Anzahl z von an den abhängigen
Agenten gerichteten Anforderungen gleichzeitig verarbeiten kann.
Wenn eine Anzahl y von Anforderungen an den Heimatagenten von einem
Knoten verarbeitet werden, hat dieser Knoten seine Kapazitätsgrenze
zur Behandlung von an den Heimatagenten gerichteten Anforderungen
erreicht. In gleicher Weise hat, wenn eine Anzahl z von an den abhängigen Agenten
gerichteten Anforderungen von einem Knoten verarbeitet werden, dieser
Knoten seine Kapazitätsgrenze
zur Behandlung von an den abhängigen
Agenten gerichteten Anforderungen erreicht. Mit anderen Worten kann
dieser Knoten nicht damit beginnen, andere gleichartige Anforderungen zu
verarbeiten, bis mindestens eine von diesen laufenden Verarbeitungen
abgeschlossen ist. Wenn ein Protokoll mit Flußkontrolle implementiert wäre, das dem
System signalisierte, das Aussenden von Transaktionsanforderungen
zu stoppen, weil eine Zielknoten seine Kapazitätsgrenze zur Anforderungsverarbeitung
erreicht hat, dann kann die globale Zusammenschaltung so mit Protokollübertragungen überlastet
werden, daß das
System einen Zustand erreichen kann, in dem es nicht mehr fähig ist,
irgendwelche weiteren Fortschritte zu machen. Solch ein Zustand
ist als Systemverklemmung bzw. -deadlock bekannt. Wenn keine Flußkontrolle
implementiert wäre, würden Protokollfehler
höchstwahrscheinlich
dazu führen,
daß Anforderungen
einfach fallen gelassen bzw. verworfen würden.
-
Um den laufenden Verkehr von ausgesendeten
Anforderungen und Antworten auf diese Anforderungen in einem parallelen
Computersystem in solch einer Art zu regeln bzw. zu steuern, daß keine
Bedingung eines Systemdeadlocks, verursacht durch Versenden zu vieler
Anforderung an einen einzelnen Knoten, herbeigeführt wird, waren Systemkonstrukteure
bisher auf komplexe Flußkontrollprotokolle
zur Regelung des Transaktionsflusses angewiesen. Eine solche Lösung hat
einige Nachteile. Der erste ist die schiere Komplexität des Entwerfens
eines fehlerlosen Systems zur Transaktionssteuerung bzw. -kontrolle.
Der zweite ist, daß ein
System zur Transaktionssteuerung bzw. -kontrolle Overhead bzw. zusätzlichen
Aufwand erfordert. Ein solcher Overhead könnte in zusätzlichen Kommunikationskanälen, zusätzlichem
Speicher, der dazu bestimmt ist, die Systemsoftware zur Steuerung
bzw. Kontrolle zu speichern, und zusätzlicher Prozessornutzung,
um die Systemsoftware zur Steuerung bzw. Kontrolle auszuführen, bestehen.
Zusätzlich
dazu, den Systemoverhead zu erhöhen,
führt die
Implementierung eines softwaregesteuerten Systems zur Verkehrssteuerung
bzw. -kontrolle ausnahmslos zu langsameren Verarbeitungsgeschwindigkeiten,
während
das System die Verkehrssteuerungs- bzw. -kontrollparameter verarbeitet
und das Verkehrssteuerungs- bzw. -kontrollprotokoll implementiert.
-
Ein Artikel von Kumar et al. mit
dem Titel "Efficient and Scalable Cache Coherence Schemes for Shared
Memory Hypercube Microprocessors", veröffentlicht in Proceedings Supercomputing
1994, 14.–18.
November 1994, Washington, USA auf Seiten 498–507, beschreibt ein Mehrprozessorsystem mit
gemeinsam genutztem Speicher, das ein verzeichnisbasiertes, cachekohärentes Schema
verwendet. Der Artikel schlägt
ein begrenztes Verzeichnisschema vor, das sowohl zu einen geringeren
Speicheroverhead als auch zu kleineren Latenzzeiten beim Speicherzugriff
im Vergleich zu früheren
Schemata führt.
Der Artikel beschreibt ein Schema, das Ringeinbettung in einem Hyperkubus
in Verbindung mit Wormhole-Routing (Wurmloch-Routing) verwendet,
um Entwertungsverzögerungen
zu reduzieren.
-
In diesem Mehrprozessor mit gemeinsam genutztem
Speicher hat jeder Knoten einen Prozessor, einen Cache, einen Anteil
des globalen Speichers und des daran angeschlossenen Verzeichnisses,
eine lokale und globale Zusammenschaltung und einen Eingabepuffer
an einer globalen Schnittstelle, um geblockte bzw. in Blöcken angeordnete Nachrichten,
die von der globalen Zusammenschaltung empfangen wurden, zu speichern,
wobei der Eingabepuffer ein Puffer ist, der einen Deadlock auf dem
Ring vermeidet und eine einstellbare bzw. regelbare Größe hat,
da die Anzahl von empfangenen Nachrichten durch die Anzahl der Prozessoren
(oder Knoten, ein Prozessor pro Knoten) beschränkt ist.
-
Ein Artikel von Kuskin et al. mit
dem Titel "The Stanford FLASH Multiprocessor", veröffentlicht in
Computer Architecture News, Vol. 22, No. 2, 1. April 1994 auf Seiten
302–313,
beschreibt ein Basisprotokoll, das verzeichnisbasiert ist und zwei
Komponenten hat: eine skalierbare Verzeichnisdatenstruktur und einen
Satz von Behandlungsroutinen.
-
Das Stanford Flash System offenbart
ein CC-NUMA/COMA-ähnliches
Mehrknoten-System, bei dem eine Empfangsbehandlungsroutine und eine Übertragungsbehandlungsroutine
an der globalen MAGIC-Schnittstelle jedes Knotens Nachrichten innerhalb
des Knotens und zwischen den Knoten ähnlich wie die Anwendung steuern
bzw. verwalten, indem sie Anforderungen, I/O- oder cachekohärente, senden
und empfangen, wobei sie entsprechend die Zustände der lokalen Daten im Cache
und die Zustände
des Verzeichnisses bzw. im Verzeichnis modifizieren. Eingabe /Ausgabe-Warteschlangen
und -Puffer, die mit diesen Behandlungsroutinen verbunden sind,
vermeiden zusammen mit einem Planungsmechanismus eine Blockierung
bzw. ein Deadlock, ermöglichen
Zurückspeichern
bzw. stufenweise Bearbeitung bzw. Staging in einem Knoten und reduzieren
Latenz bzw. die Latenzzeit.
-
Was benötigt wird, ist eine effizientere
Art und Weise, den Verkehrsfluß von
Lese- und Schreibanforderungen in einem parallelen Computersystem
zu regeln, die keinen zusätzlichen
Overhead beim Systembetrieb erfordert und die den Informationsfluß auf der
globalen Zusammenschaltung nicht behindert.
-
Ein Aspekt der Erfindung sieht ein
Mehrprozessor-Computersystem gemäß Anspruch
1 vor.
-
Ein anderer Aspekt der Erfindung
sieht ein Verfahren zur Bereitstellung des geordneten Verkehrsflusses
von Speicheranforderung und Erfüllung der
Anforderung zwischen den Knoten eines Mehrprozessor-Computersystems
vor, das aus einer Mehrzahl von n Knoten besteht, ohne Rückgriff
auf ein komplexes Flußkontrollprotokoll,
wie in Anspruch 11 dargelegt.
-
Eine Ausführungsform der Erfindung kann ein
verzeichnisbasiertes, skalierbares Mehrprozessor-Computersystem
mit gemeinsam genutzten Speicher zur Verfügung stellen, das über einen
blockierungs- bzw. deadlock-freien Transaktionsfluß ohne Flußkontrollprotokoll
verfügt.
-
Diese Erfindung wird im Kontext eines
cachekohärenten,
parallelen Mehrprozessor-Computersystems
mit mehreren Knoten und gemeinsam genutztem Speicher beschrieben,
das sowohl im NUMA- als auch im COMA-Modus arbeiten kann. Jeder Knoten
des Systems hat einen einzelnen Block von Hauptspeicher, auf den
jeder Mikroprozessor innerhalb des Knotens gleichermaßen Zugriff
hat. Beim NUMA-Modus repräsentiert
der Hauptspeicherblock jedes Knotens einen Anteil des gesamten physikalischen
Adreßraums
des Systems. Beim COMA-Modus können
Speicherstellen als eine globale Adresse, die eine Heimat-Position
für eine
globale Adresse identifiziert, oder als Cache für Daten, die ihre Heimat in
einem anderen Knoten haben, verwendet werden. Jeder Mikroprozessor
hat sowohl einen Cache erster Stufe (level-1, L1) als auch einen
Cache zweiter Stufe (level-2, L2), die jenen zugeordnet sind, von
denen jeder eine Mehrzahl von Cacheblöcken hat, und die jeweils groß genug
sind, um Daten von einer einzelnen Hauptspeicheradresse zu speichern.
Nur die Caches zweiter Stufe sind abgebildet.
-
Ein Teil des Hauptspeicherblocks
jedes Knotens ist für
ein Verzeichnis der Zustände
der Cacheblöcke
bestimmt. Alternativ dazu kann das Verzeichnis der Zustände der
Cacheblöcke
in einem vom Hauptspeicherblock separaten Speicher gespeichert werden.
Für jede
Adresse eines Cacheblocks innerhalb jedes prozeßzugeordneten Cache innerhalb
dieses Knotens speichert das Verzeichnis Daten, die Information
bezüglich
der Cachekohärenz
liefern.
-
Jeder Prozessor ist über seinen
L2-Cache sowohl mit dem Hauptspeicherblock als auch mit einer Systemschnittstelle über eine
lokale Zusammenschaltung oder einen Bus verbunden. Die Systemschnittstelle
jedes Knotens ist mit der Systemschnittstelle jedes anderen Knotens über eine
im hohen Grade parallele, globale Zusammenschaltung verbunden.
-
Jede Systemschnittstelle enthält einen
Verzeichnisagenten, der dafür
zuständig
ist, das ihm zugeordnete Verzeichnis der Zustände der Cacheblöcke durch
Aktualisieren des Zustandes der Daten von jeder Hauptspeicheradresse,
die in einem Cacheblock in seinem eigenen Knoten (dem Heimat-Knoten) oder
in irgendeinem anderen Knoten kopiert ist, auf dem Laufenden zu
halten. Jede Systemschnittstelle enthält auch sowohl einen abhängigen Agenten,
der für
die Beantwortung von Anforderungen vom DA eines anderen Knotens
zuständig
ist, als auch einen Anforderungsagenten, der dem Knoten einen Mechanismus
zum Senden von Lese- und Schreibanforderungen an andere Subsysteme
zur Verfügung stellt.
Die Systemschnittstelle ist auch für das Beibehalten der Kohärenz von
Daten zuständig,
die im Hauptspeicher, ob im NUMA- oder im COMA-Modus betrieben,
gespeichert sind oder als im Cache abgelegt gehalten werden. Daher
speichert jede Adresse auch ein Zwei-Bit Datentag, das angibt, ob
Daten an der Stelle einen S-Zustand, einen O-Zustand, einen M-Zustand
oder einen I-Zustand haben.
-
Datenanforderungen und Antworten
auf diese Anforderungen werden von den entsprechenden Agenten zwischen
den Knoten in der Form von Daten-/Steuerungs-Paketen ausgetauscht,
womit jeder Knoten in die Lage versetzt wird, einen Überblick über den
Zustand aller Daten zu behalten, die darin im Cache gehalten werden.
Diese Daten-/Steuerungs-Pakete werden zwischen den Knoten über die globale
Zusammenschaltung unter der Regie bzw. dem Management eines Übertragungsprotokolls übertragen.
-
Eine Ausführungsform der Erfindung stellt ein
Verfahren und eine Vorrichtung bereit, welche die Notwendigkeit
eines aktiven Verkehrskontroll- bzw. -steuerungssystems beseitigt,
während
weiterhin ein geordneter, anforderungsbezogener Transaktionsfluß erhalten
bleibt. Dies wird durch Ermitteln der maximalen Anzahl von Anforderungen,
die irgendein Agent auf jedem Knoten zu einem gegebenen Zeitpunkt
empfangen kann, erreicht, indem ein Eingabepuffer vor jedem solchen
Agenten vorgesehen wird, der eine entsprechende Größe hat,
um vorübergehend
mindestens die maximale Anzahl von Anforderungen zu speichern, die
der Agent zu jedem gegebenen Zeitpunkt empfangen kann, und indem
dann gespeicherte Anforderungen vom Puffer übertragen werden, sobald der
Agent die in Verarbeitung befindlichen Anforderungen vollendet hat
und in der Lage ist, zusätzliche
ankommende Anforderungen zu verarbeiten. Da jeder Knoten nur eine
bestimmte, endliche Anzahl von schwebenden bzw. anhängigen Anforderungen
haben kann, ist dies die maximale Anzahl von Anforderungen, die
von einem Knoten empfangen werden kann, der als Antwortender gegenüber einem
anderen Knoten fungiert, der in seiner Eigenschaft als der Anforderer
arbeitet. Darüber
hinaus kann jeder Knoten auch Anforderungen ausgeben, die innerhalb
dieses Knotens verarbeitet werden müssen. Daher muß der Eingabepuffer
auf eine solche Größe ausgelegt
sein, daß er
nicht nur die externen Anforderungen aufnehmen kann, sondern auch die
internen.
-
Nach einer weiteren Ausführungsform
der Erfindung, die sich auf cachekohärente, parallele Computersysteme
mit mehreren Knoten bezieht, die ein oder mehrere Eingabe/Ausgabe
(Input/Output, I/O)-Caches in jedem Knoten haben können, werden Transaktionen,
die für
I/O-Einrichtungen
bestimmt sind, separat von Transaktionen, die sich auf Cachekohärenz beziehen,
in Warteschlangen eingereiht, und die Verarbeitung von Transaktionen
zur Cachekohärenz
ist niemals gezwungen, auf die Verarbeitung von I/O-bezogenen Transaktionen
zu warten. Eine solche Technik erlaubt kohärenten, direkten Speicherzugriff
von I/O-Einrichtungen.
-
Beispielhafte Ausführungsformen
der Erfindung werden nachfolgend nur als Beispiel mit Bezug auf
die beigefügten
Zeichnungen beschrieben, worin:
-
1 ein
Architektur-Blockdiagramm eines herkömmlichen, parallelen NUMA-Computersystems ist;
-
2 ein
Architektur-Blockdiagramm eines herkömmlichen, parallelen COMA-Computersystems ist;
-
3 ein
Blockdiagramm einer herkömmlichen,
globalen Schnittstelleneinheit ist;
-
4 ein
Architektur-Blockdiagramm eines verzeichnisbasierten Mehrprozessor-Computersystems mit
mehreren Knoten und gemeinsam genutztem Speicher ist, das die Endung
beinhaltet;
-
5 ein
Blockdiagramm der neuen, globalen Schnittstelleneinheit ist, das
die Erfindung beinhaltet; und
-
6 eine
Auflistung der Schritte darstellt, die mit dem Verfahren zum Verhindern
von Systemblockierung in Abwesenheit eines aktiven Verkehrssteuerungs-
bzw. -kontrollsystems einhergehen.
-
Eine Ausführungsform der Erfindung wird
im Kontext eines skalierbaren, mehrere Knoten umfassenden, verzeichnisbasierten,
cachekohärenten,
parallelen Computersystem mit gemeinsam genutztem Speicher beschrieben,
das mehrere Sparc® Mikroprozessoren einbezieht.
In diesem System können individuelle
Knoten sowohl im Non-Uniform Memory Architecture (NUMA) Modus als
auch im Cache-Only Memory Architecture (COMA) Modus gleichzeitig
arbeiten bzw. betrieben werden. Beim Betrieb im NUMA-Modus repräsentiert
der Hauptspeicher einen Teil des gesamten physikalischen Adreßraums des Systems.
Beim COMA-Modus können
Speicherstellen als eine globale Adresse verwendet werden, die eine
Heimatspeicherstelle für
eine globale Adresse angibt, oder als Cache für Daten, die ihre Heimat in einem
anderen Knoten haben. Obwohl jedem Mikroprozessor innerhalb eines
Knotens ein Cache sowohl erster Stufe (L1) als auch zweiter Stufe
(L2) zugeordnet ist, sind nur die Caches zweiter Stufe in den Zeichnungen
abgebildet.
-
In 4 wird
die Architektur des parallelen Computersystems 40, das
die Erfindung beinhaltet, durch mehrere Subsysteme (auch bekannt
als Knoten) 410, 420, 430 und 440 dargestellt.
Die verschiedenen Knoten 410, 420, 430 und 440 sind über die globale
Zusammenschaltung 450 miteinander verbunden. Obwohl ein
System mit nur vier Knoten abgebildet ist, ist die Erfindung auf
Systeme mit einer beliebigen Anzahl von miteinander verbundenen Knoten
anwendbar. Jedem Knoten ist eine eindeutige Netzwerkknotenadresse
zugewiesen. Jeder Knoten enthält
mindestens einen Prozessor, eine entsprechende Anzahl von Speicherverwaltungseinheiten
(MMUs) und Caches, einen Hauptspeicher, dem ein Teil des globalen
Speicheradreßraumes
zugewiesen ist, eine globale Schnittstelle (GI) und eine lokale Zusammenschaltung
(LI). Zum Beispiel enthält
der Knoten 410 die Prozessoren 411a, 411b ... 411i,
die MMUs 412a, 412b, ... 412i, die Cachespeicher 413a, 413b,...
-
413i, den Hauptspeicher 414,
die globale Schnittstelle 415 und die lokale Zusammenschaltung 419 des
Knotens.
-
Daten von den Hauptspeichern 414, 424, 434 ... 484 können in
einem oder mehreren der Caches 413a, ... 413i, 423a,
... 423i und 483a, ... 483i gespeichert
sein. Daher muß die
Kohärenz
zwischen den Caches 413a, ... 413i, 423a,
... 423i und 483a, ... 483i aufrechterhalten
werden, damit das System 40 Programme mit gemeinsamer Speichernutzung
richtig ausführen
kann.
-
Um ein verzeichnisorientiertes Kohärenzschema
für Caches
zu unterstützen,
enthalten die Knoten 410, 420, 430 und 440 auch
die Verzeichnisse 416, 426, 436 und 446,
die mit den globalen Schnittstellen 415, 425, 435 bzw. 445 verbunden sind.
-
Bezugnehmend auf das Blockdiagramm
in 5 enthält jede
globale Schnittstelle (d. h. die Elemente 415, 425, 435 und 445 von 4) einen Heimatagenten (HA) 502,
einen abhängigen
Agenten (slave agent, SA) 504 und einen Anforderungsagenten
(request agent, RA) 506. Der HA 502 ist für das Aktuell-Halten
des ihm zugeordneten Verzeichnisses 503 (Verzeichnis 503 entspricht
entweder Element 416, 426, 436 oder 446 von 4) durch Aktualisieren des
Zustands von Daten von jeder Hauptspeicheradresse zuständig, die
in einem Cacheblock in seinem eigenen Knoten (dem Heimatknoten)
oder in irgendeinem anderen Knoten kopiert ist.
-
Der Zustand aller exportierbaren
Speicherstellen von einem Heimatknoten (d. h. jener, die in anderen
Knoten im Cache gehalten werden können) wird in einem Verzeichnis
auf dem Laufenden gehalten. Bei dem in 4 abgebildeten System kann dieses Verzeichnis
einem der Verzeichnisse 416, 426, 436 oder 446 entsprechen.
Jede Kopie ist durch eine von vier Zustandsbedingungen gekennzeichnet:
Ein Zustand "gemeinsam benutzt", zeigt an, daß es andere Kopien in anderen
Knoten gibt, daß kein
Zurückschreiben
beim Ersetzen bzw. Neubesetzen erforderlich ist und daß nur Leseoperationen
auf der Speicherstelle ausgeführt
werden können;
ein Zustand "in Besitz" zeigt an, daß es andere Kopien in anderen Knoten
geben kann, daß ein
Zurückschreiben
beim Ersetzen bzw. Neubesetzen erforderlich ist und daß nur Leseoperationen
auf der Speicherstelle ausgeführt
werden können;
ein Zustand "geändert"
zeigt an, daß es
keine gemeinsam genutzten Kopien in anderen Knoten gibt und daß ohne Konsequenzen
an anderer Stelle von dieser Speicherstelle gelesen und in sie geschrieben
werden kann; und ein Zustand "ungültig" zeigt an, daß die Kopie
in der Speicherstelle jetzt ungültig
ist und daß die
benötigten
Daten von einem Knoten, der eine gültige Kopie hat, beschafft werden
müssen
(d. h. von einem Knoten, in dem die Kopie als S, O oder M gekennzeichnet
ist).
-
Der SA 504 ist dafür zuständig, auf
Anforderungen vom DA eines anderen Knoten zu antworten, während der
RA 506 einem Knoten einen Mechanismus zum Senden von Lese-
und Schreibanforderungen an andere Subsysteme zur Verfügung stellt.
-
Gemäß 5 enthält die globale Schnittstelle
auch eine Ausgabe-Header-Warteschlange (output header queue, OHQ) 508 und
eine Eingabe-Header-Warteschlange (input header queue, IHQ) 510. Header
enthalten andere Information als Daten, die sich auf eine Lese-
oder Schreibanforderung bezieht (z. B. eine Adresse für eine Leseanforderung).
Die globale Schnittstelle enthält auch
die Ausgabe-Daten-Warteschlange (output data queue, ODQ) 512 und
eine Eingabe-Daten-Warteschlange
(input data queue, IDQ) 514.
-
Der HA 502 ist mit der globalen
Zusammenschaltung 450 über
OHQ 508 verbunden. Die globale Zusammenschaltung 450 ist
mit dem HA 502 über IHQ 510 und
durch einen ersten Pfad 513 für I/O-Anforderungen, einen
zweiten Pfad 515 für
Cachekohärenz-Anforderungen
bzw. einen dritten Pfad 516 für Besitzanforderungs- (request-to-own)
(d. h. Schreibanforderungs-) Transaktionen verbunden. Pfad 513 schließt einen
I/O-Anforderungspuffer 518 ein, Pfad 515 schließt einen
Cachekohärenz-Anforderungspuffer 520 ein,
und Pfad 516 schließt
einen R-T-O-Puffer 522 ein. Der HA 502 sendet
auch Adressen an einen Adreßbusteil
(nicht abgebildet) der lokalen Zusammenschaltung (z. B. Element 219 von
Knoten 210) über
die Ausgabewarteschlange (OQ) 524.
-
Der SA 504 ist mit der globalen
Zusammenschaltung 450 über
OHQ 508 verbunden. Die globale Zusammenschaltung 450 andererseits
ist mit dem SA 504 über
IHQ 510, den abhängigen
Anforderungspuffer 526 bzw. den Übersetzer von globalen Adressen
in lokale, physikalische Adressen 528 verbunden. Der SA 504 sendet
Adressen zum Adreßbusteil
der lokalen Zusammenschaltung (z. B. Element 419 von Knoten 410) über OQ 524.
-
Der RA 506 ist mit der globalen
Zusammenschaltung 450 über
OHO 508 verbunden. Die globale Zusammenschaltung 450 ist
mit RA 506 über
IHQ 510 über
Pfad 529 verbunden, durch den RA 506 Antworten von Zustimmung
zu bzw. Erfüllung
von Anforderungen von allen anderen Knoten empfängt. RA 506 sendet
Adressen zum Adreßbusteil
der lokalen Zusammenschaltung (z. B. Element 419 von Knoten 410) über OQ 524.
Der RA 506 empfängt
Adressen vom Adreßbusteil
der lokalen Zusammenschaltung über
einen von zwei Pfaden, die beide durch den Transaktionsfilter 530 verlaufen.
Cachekohärenz-Transaktionen
werden über
einen ersten Pfad 532 durch die C-C-Eingabe-Warteschlange der lokalen Zusammenschaltung 534 und
den Übersetzer von
lokalen, physikalischen Adressen in globale Adressen 535 geleitet,
während
Eingabe/Ausgabe-Transaktionen über
einen zweiten Pfad 536 durch die I/O-Eingabe-Warteschlange 538 geleitet
werden. Das Transaktionsfilter 530 unterscheidet zwischen allen
anderen Transaktionen auf der lokalen Zusammenschaltung und jenen,
die zum RA 506 geleitet werden sollen. Ein M-TAG-SRAM-Speicher 540 speichert
einen aus mehreren Bits bestehenden Eintrag für jede Cacheblock-Adresse innerhalb
des Knoten, die einer bestimmten globalen Schnittstelle zugeordnet
ist. Jeder Eintrag zeigt an, ob Erlaubnis zum Lesen oder Schreiben
auf einen entsprechenden Cacheblock erteilt ist.
-
Weiterhin ist gemäß 5 ein Datenbusteil (nicht abgebildet)
der lokalen Zusammenschaltung mit der globalen Zusammenschaltung 450 über ODQ 512,
IDQ 514 verbunden.
-
Anforderungen von Daten und Antworten
auf diese Anforderungen werden zwischen Knoten vom entsprechenden
HA, SA und RA jeder globalen Schnittstelle (d. h. 415, 425, 435 und 445)
in der Form von Daten-/Steuerungspaketen ausgetauscht, wodurch jeder
Knoten in die Lage versetzt wird, den Überblick über den Zustand aller Daten,
die darin im Cache gehalten werden, zu behalten.
-
Die Zustandsinformation bezüglich Cacheblöcken in
den Cachespeichem 413a ... 413i, 423a ... 423i, 433a ... 433i und 443a ... 443i werden
in Verzeichnissen gespeichert, die der globalen Schnittstelle zugeordnet
sind. Alternativ können
die Verzeichnisse ein in Abschnitte unterteilter Anteil des Hauptspeichers
sein (z. B. 414, 424, 434 und 444)
oder das Verzeichnis kann außerhalb
der Knotens liegen. Die Daten-/Steuerungspakete werden zwischen
den Knoten über
die globale Zusammenschaltung 450 übertragen. Übertragungen von Daten-/Steuerungspaketen
werden durch ein Netzwerkprotokoll verwaltet. In einer Implementierung
des offenbarten Systems ist ein Blockierer dem Heimatagenten jeder
globalen Schnittstelle zugeordnet. Jeder Blockierer hat die Aufgabe,
neue Anforderungen eines Cacheblocks zu blockieren, bis eine ausstehende
bzw. offenstehende Anforderung für
diesen Cacheblock bedient bzw. abgehandelt wurde.
-
Wenn das System im NUMA-Modus arbeitet, erfolgt
eine typische Leseanforderung (z. B. eine Read_To_Share-Anforderung)
von Prozessor 411a von Knoten 410 in der folgenden
Art. Um die Anforderung zu initiieren, überreicht der Prozessor 411a eine
virtuelle Adresse (VA) an MMU 412a, welche die VA in eine
GA konvertiert und die GA an den Cache 413a überreicht.
Wenn es eine gültige
Kopie des Datenblocks, der von Interesse ist, im Cache 413a gibt (z.
B. eine gemeinsam genutzte oder in Besitz befindliche Kopie), dann
liefert der Cache 413a die Daten über MMU 412a an den
Prozessor 411a, wodurch die Leseanforderung abgeschlossen
ist.
-
Wenn jedoch der Cache 413a über keine
gültige
Kopie verfügt,
dann überreicht
der Cache 413a die GA der lokalen Zusammenschaltung 419 seines zugeordneten
Knotens. Wenn die GA nicht Teil des lokalen Adreßraumes von Knoten 410 ist
(d .h. Knoten 410 ist nicht der Heimatknoten für die angeforderte
Adresse), dann wird die Anforderung zum entsprechenden Heimatknoten
(d. h. Knoten 420) weitergeleitet. In diesem Fall, in dem
die angeforderten Daten nicht im Cache des anfordernden Knotens 410 gefunden
werden können,
wird das Heimatverzeichnis entweder von Knoten 410 oder 420 (416 bzw. 426)
aktualisiert, um die Transaktion widerzuspiegeln. Dies geschieht
zum Beispiel dadurch, daß das
Verzeichnis 416 aktualisiert wird, um anzuzeigen, daß Knoten 410 ein
gemeinsamer Nutzer des von Knoten 420 erhaltenen Datenblocks
ist.
-
Wenn der anfordernde Knoten 410 der
Heimatknoten für
den angeforderten Datenblock ist, wird das entsprechende M-TAG in
Verzeichnis 416 auf einen passenden M-TAG-Zustand für einen
Leseschritt hin überprüft (z. B.
modifiziert, in Besitz oder gemeinsam benutzt). Wenn der M-TAG-Zustand ungültig ist oder
wenn der anfordernde Knoten 410 nicht der Heimatknoten
ist, wird das Verzeichnis 426 auf einen passenden M-TAG-Zustand
hin überprüft. Das
Verzeichnis des Heimatknotens hat Information darüber, welche
Knoten gültige
Kopien des Datenblocks haben und welcher Knoten der Besitzer des
Datenblocks ist. Es sollte beachtet werden, daß der Heimatknoten der Besitzer
sein kann oder auch nicht. Dies würde passieren, wenn der Datenblock
innerhalb eines anderen Knotens aktualisiert würde, was ein Zurückschreiben
in den Heimatknoten erforderlich machen würde, bevor der aktualisierte
Block überschrieben
wird. Darüber
hinaus tiefem die M-TAG-Zustände in dem
Fall, daß der
anfordernde Knoten auch der Heimatknoten ist, einen Hinweis darüber, ob
die Transaktion zulässig
ist (d. h. das Heimatverzeichnis braucht in die betreffende Transaktion
nicht involviert zu werden).
-
Wenn festgestellt wird, daß der Heimatknoten
eine gültige
Kopie des angeforderten Datenblocks hat, dann liefert der Heimatknoten
die Daten an den anfordernden Knoten. Im Fall, daß der anfordernde
Knoten auch der Heimatknoten ist, ist nur eine interne Datenübertragung
erforderlich. Alternativ reagiert dann, wenn der Heimatknoten nicht
der anfordernde Knoten ist, die globale Schnittstelle des Heimatknotens
(die globale Schnittstelle 425 im obigen Beispiel) durch
Zurückholen
des angeforderten Datenblocks vom Hauptspeicher 424 oder
von einem Cacheblock, die im Besitz eines Prozessors innerhalb von
Knoten 420 ist, und sendet den Datenblock über die
globale Zusammenschaltung 450 an die globale Schnittstelle 415 des
anfordernden Knotens 410.
-
Umgekehrt wird in dem Fall, daß der Heimatknoten
keine gültige
Kopie des Datenblocks hat (d. h. der Heimatknoten ist nicht der
Besitzerknoten), die Leseanforderung mit der GA weitergeleitet zu
der globalen Schnittstelle des Knotens, welcher der Besitzer des
angeforderten Datenblocks ist (z. B. globale Schnittstelle 445 des
Besitzerknotens 440). Die globale Schnittstelle 445 reagiert
durch Zurückholen des
Datenblocks von einem der Caches innerhalb von Knoten 440 (z.
B. Besitzer-Cache 443a) und Senden des Datenblocks an die
globale Schnittstelle 415 des anfordernde Knotens 410 über die
globale Zusammenschaltung 450.
-
Beim Empfang des Datenblocks leitet
die globale Schnittstelle 415 den Datenblock an den Cache 413a weiter,
der die Daten an den anfordernden Prozessor 441a übergibt.
Der Datenblock kann im Cache abseits des kritischen Pfades für nachfolgendes
Zurückholen
durch Prozessor 441a gehalten werden.
-
Wenn eine Speicherstelle in einem
Cache (z. B. Cache 413a) für das Speichern eines anderen
Datenwertes benötigt
wird, muß der
alte Cacheblock ersetzt werden. Im allgemeinen werden Cacheblöcke, die
einen Zustand "gemeinsam benutzt" haben, "stillschweigend" ersetzt
(d. h. das Ersetzen erzeugt keine neue Transaktionen im Computersystem 400).
Mit anderen Worten bleibt bei dem obigen Beispiel der Knoten 410 als
ein gemeinsamer Nutzer des ersetzten Cacheblocks im Heimatverzeichnis
des Knotens gekennzeichnet, in dem der Cache liegt, der den zurückgeholten
Datenblock enthält.
Umgekehrt erzeugt das Ersetzen von Cacheblöcken, die entweder einen Zustand
"in Besitz" oder "modifiziert" haben, eine Zurückschreibtransaktion zur GA
des Hauptspeichers des Heimatknotens für die Daten, die ersetzt werden. In
einem solchen Fall muß das
Heimatverzeichnis, in dem die Zurückschreiboperation durchgeführt wird, aktualisiert
werden, um diese Transaktion widerzuspiegeln.
-
Über
das Auf-dem-Laufenden-Halten eines separaten Verzeichnisses bei
jedem Knoten, das zum Bereitstellen von Cachekohärenz notwendig ist, hinaus,
ist jeder Speicherstellen-GA im Hauptspeicher, die zufällig bzw.
im Übrigen
der Länge
eines Cacheblocks entspricht, ein Zweibit-Datentag, das dieselben Zustandsbezeichner
wie das Cacheverzeichnis verwendet, zugeordnet. Das heißt, daß jede Speicherstelle
zwei Bits speichert, welche die Speicherstelle als S, O, M oder
I kennzeichnen. Dies ist notwendig, weil der Hauptspeicher in einem
bestimmten Knoten auch eine Kopie von Daten speichern kann, die
an Hauptspeicherstellen in anderen Knoten vorkommen.
-
Wenn das System im COMA-Modus arbeitet, erfolgt
eine typische Leseanforderung (z. B. eine Read_To_Share-Anforderung)
von Prozessor 411a von Knoten 410 in der folgenden
Art. Um die Verarbeitung zu initiieren, überreicht der Prozessor 411a eine
VA an MMU 412a, welche die VA in eine LPA konvertiert und
die LPA an den Cache 413a überreicht. Wenn es eine gültige Kopie
des angeforderten Datenblocks im Cache 413a gibt (d. h.
eine gemeinsam genutzte oder in Besitz be findliche oder modifizierte
Kopie), dann liefert der Cache 413a die Daten an den Prozessor 411a und
die Leseanforderung ist abgeschlossen.
-
Wenn andererseits der Cache 413a über keine
gültige
Kopie des angeforderten Datenblocks verfügt, dann überreicht der Cache 413a die
LPA an die globale Schnittstelle 415. Die globale Schnittstelle 415 greift
auf die M-TAGs von Verzeichnis 416 zu, um herauszufinden,
ob eine gültige
Kopie des Datenblocks im Cachearbeitsspeicher 414 vorkommt.
-
Wenn eine solche gültige Kopie
im Cachearbeitsspeicher 414 vorkommt, wird der Datenblock von
dort zurückgeholt.
Der Datenblock wird dann an Cache 413a übergeben, der die Daten an
den Prozessor 411a über
MMU 412a liefert, wodurch die Leseanforderung abgeschlossen
ist.
-
Wenn jedoch eine gültige Kopie
des angeforderten Datenblocks weder im Cache 413a noch
im Cachearbeitsspeicher 414 aufgefunden werden kann, konvertiert
der Übersetzer
für lokale,
physikalische Adressen in globale Adressen (Details siehe Element 535 von 5) innerhalb der globalen Schnittstelle
des anfordernden Knotens 410 die LPA in eine GA, bevor
die Datenanforderung über
die globale Zusammenschaltung 450 an das Heimat-Subsystem,
dessen Adreßraum
die GA des angeforderten Datenblocks enthält, gesendet wird. Als nächstes konvertiert
der Übersetzer
für globale
Adressen in lokale, physikalische Adressen (Details siehe Element 528 von 5) innerhalb der globalen
Schnittstelle 425 des Heimatknotens 420 die GA
in eine LPA und sieht im entsprechenden Verzeichniseintrag nach, um
festzustellen, ob es eine gültige
Kopie des Datenblocks im Heimat-Cachearbeitsspeicher 424 gibt. Diese
GA-zu-LPA-Übersetzung
im Heimatknoten 420 kann eine triviale Operation sein,
wie zum Beispiel das Entfernen einer geeigneten Anzahl von führenden
bzw. höherwertigen
Bits von der GA.
-
In jedem der obigen Fälle, in
denen der Datenblock im anfordernden Knoten 410 nicht gefunden wird,
aktualisiert der Heimatknoten 420 sein Heimatverzeichnis 426,
um einen neuen gemeinsamen Nutzer des Datenblocks widerzuspiegeln.
-
Wenn eine gültige Kopie im Heimatknoten 420 existiert,
reagiert die globale Schnittstelle 425 durch Zurückholen
des Datenblocks aus dem Cachearbeitsspeicher 424 oder Cache 423a,
bevor der angeforderte Datenblock an die globale Schnittstelle 415 des
anfordernden Knotens 410 über die globale Zusammenschaltung 450 gesendet
wird.
-
Umgekehrt wird im Fall, daß der Heimatknoten 420 keine
gültige
Kopie des Datenblocks hat, die Leseanforderung mit der GA an den
Adreßübersetzer
des Besitzerknotens weitergeleitet (z. B. den Adreßübersetzer
innerhalb der globalen Schnittstelle 445 von Knoten 440).
Beim Empfang des GA vom Heimatknoten 420 konvertiert der
Adreßübersetzer
in Knoten 440 die GA in eine LPA für die globale Schnittstelle 445.
Diese GA-zu-LPA-Übersetzung
im Besitzerknoten 450 ist keine triviale Operation. Als nächstes reagiert
die globale Schnittstelle 445 des Besitzerknotens 440,
indem sie den Datenblock entweder aus dem Cachearbeitsspeicher 444 oder
einem der Caches 443a, 443b ... 443i zurückholt und den
angeforderten Datenblock an die globale Schnittstelle 415 des
anfordernden Knotens 410 über die globale Zusammenschaltung 450 sendet.
-
Wenn der Datenblock bei der globalen Schnittstelle 415 ankommt,
leitet die globale Schnittstelle 415 den Datenblock an
den Cache 413a weiter, der dann die Daten für den anfordernden Prozessor 411a bereitstellt.
Der Datenblock kann im Cache abseits des kritischen Pfades für nachfolgendes
Zurückholen
durch diesen Prozessor gehalten werden, wodurch die Lesetransaktion
abgeschlossen ist. Es wird darauf hingewiesen, daß eine GA-zu-LPA-Übersetzung
für das
Zurückgeben
der Daten nicht benötigt
wird.
-
Gelegentlich kann das Ersetzen von
ganzen Seiten, die im Cachearbeitsspeicher 414 gespeichert sind,
notwendig sein, wenn der Cachearbeitsspeicher 414 voll
oder nahezu voll wird, um Platz für das Zuordnen einer neuen
Seite bzw. neuer Seiten auf eine Leseanforderung hin zu schaffen.
Im Idealfall ist es eine Hintergrundaufgabe, daß der Knoten 410 eine
optimale Anzahl von freien Seiten im Cachearbeitsspeicher 414 behält, wodurch
sichergestellt wird, daß dem
Attractinn Memory (d. h. Cachearbeitsspeicher 414) nicht
der Speicherplatz ausgeht. Bei Ersetzung wird durch Zugriff auf
die M-TAGs, die im Verzeichnis 416 gespeichert sind, eine
Ermittlung vorgenommen, welche der Datenblöcke der zu ersetzenden Seite
gültige
Daten enthalten (entweder M-, O- oder S-Zustand). Es wird dann eine Nachricht
an das Heimatverzeichnis, das für
jeden solchen Block zuständig
ist, gesendet, die darüber
informiert, daß der
Cacheblock ersetzt werden soll.
-
Wenn der Cacheblock einen M- oder
O-Zustand hat, wird diese Transaktion ähnlich einer Zurückschreibe-Transaktion
im NUMA-Modus behandelt: der Datenwert wird in den Heimat-Cachearbeitsspeicher
oder das Heimatsystem geschrieben. Wenn der Cacheblock einen S-Zustand
hat, überträgt die Ersetzungstransaktion
keine Daten, sondern aktualisiert das lokale Verzeichnis, um die
Tatsache, daß sein
Knoten nicht länger
eine gemeinsam genutzte Kopie des Datenblocks enthält, widerzuspiegeln. Folglich
erfolgt beim Betrieb im COMA-Modus das Ersetzen nicht "stillschweigend",
da das entsprechende Verzeichnis kontinuierlich aktualisiert wird, um
jede Ersetzung von Datenblöcken
widerzuspiegeln.
-
Eine Ausführungsform der Erfindung stellt ein
Verfahren und eine Vorrichtung bereit, die die Notwendigkeit eines
aktiven Verkehrssteuerungs- bzw. -kontrollsystems eliminieren, während immer noch
ein geordneter, anforderungsbezogener Transaktionsfluß beibehalten
wird. Dies wird durch Ermitteln der maximalen Anzahl von Anforderungen
erreicht, die irgendein Knoten zu irgendeinem beliebigen Zeitpunkt
empfangen kann, und durch Bereitstellen von Eingabepuffern innerhalb
der globalen Schnittstelle jedes Knotens, welche die maximale Anzahl
von Anforderungen speichern können,
die irgendein Agent innerhalb dieser globalen Schnittstelle zu irgendeinem
beliebigen Zeitpunkt empfangen kann, und Übertragen der gespeicherten
Anforderungen vom Puffer, sobald der Knoten die in Verarbeitung
begriffenen Anforderungen abschließt und in der Lage ist, zusätzliche
eintreffende Anforderungen zu bearbeiten. Bei einigen Architekturen
könnte
man sich vorstellen, daß die
maximale Größe des Puffers etwas
kleiner ist als die Gesamtanzahl von Transaktionsanforderungen,
die gleichzeitig zu irgendeinem Agenten innerhalb des Knotens gesendet
werden kann, da der Knoten mit der Bearbeitung einer bestimmten
Anzahl von eintreffenden Transaktionen beginnen könnte. Jedoch
müßten bei
bestimmten Architekturen die Transaktionen sequentiell, nacheinander,
bearbeitet, wenn alle eintreffenden Anforderungen den Zustand desselben
Cacheblocks beeinflussen. Auch wenn es unwahrscheinlich ist, daß sich alle
Transaktionen auf einen einzelnen Cacheblock beziehen, ist die sicherste
Lösung
für diese
Architekturen, die Größe der Puffer
so zu bestimmen, daß jeder
mindestens die maximale Anzahl von eintreffenden Anforderungen behandeln
kann, die möglicherweise
gleichzeitig an den ihm zugeordneten Agenten gesendet werden könnte. Mit
anderen Worten ist der Schlüssel
zu der Erfindung, die Größe der Eingabepuffer
so zu bestimmen, daß sie
unmöglich überlaufen
können.
-
Wiederum gemäß 5 sind die Puffer, deren Größe richtig
festgelegt werden muß,
um Überlauf
zu verhindern, der I/O-Anforderungspuffer 518, der Cachekohärenz-Anforderungspuffer 520 und
der R-T-O-Puffer 522, von denen alle Header-Information in
HA 502 einspeisen, und der abhängige Anforderungspuffer 526,
der Header-Information in SA 504 einspeist. Für Anforderungstransaktionen,
die auf dem Knoten lokal sind bzw. den lokalen Knoten betreffen,
sollten die Cachekohärenz-Eingabe-Warteschlange 534 und
die I/O-Eingabe-Warteschlange 538 auch in ihrer Größe so festgelegt
werden, daß Überlauf
verhindert wird.
-
Da der Anforderungsagent (request
agent, RA) jedes Knotens zu jedem beliebigen Zeitpunkt nur eine
bestimmte, endliche Anzahl von Anforderungen ausstehend bzw. offen
haben kann, ist dies die maximale Anzahl von Anforderungen, die
von einem Heimat- oder abhängigen
Agenten vom Anforderungsagenten eines anderen Knotens empfangen
werden kann. Darüber
hinaus kann der RA jedes Knotens auch Anforderungen senden bzw.
herausgeben, die innerhalb des ihm zugeordneten Knotens bearbeitet werden
müssen.
Daher muß der
Eingabepuffer, der sowohl den Heimatagenten als auch den abhängigen Agenten
speist, in seiner Größe so ausgelegt
werden, daß er
nicht nur externe Anforderungen aufnehmen kann, sondern auch die
internen.
-
Bei der vorliegenden Implementierung
des offenbarten Systems kann jeder Knoten zu jedem Zeitpunkt bis
zu 16 Anforderungen anhängig
bzw. offen haben. Jede anhängige
bzw. offene Anforderung wird von einem Array von Anforderungszustandsmaschinen 542 auf
dem anfordernden Knoten überwacht.
In ähnlicher
Weise kann jeder Heimatagent und jeder abhängige Agent ein Maximum von
16 Anforderungen gleichzeitig bearbeiten. Auch alle eintreffenden
Anforderungen werden von einem Array von Zustandsmaschinen überwacht,
die dem empfangenden Agenten zugeordnet sind. Daher hat der Heimatagent 502 ein
Array von Heimatzustandsmaschinen 544, die bzw. das ihm
zugeordnet ist, und der abhängige
Agent 504 kann auch eine Reihe bzw. ein Array von Neben-
bzw. Folgezustandsmaschinen bzw. auf den abhängigen Agenten bezogenen Zustandsmaschinen 546 haben,
das ihm zugeordnet ist. Wenn 16 Anforderungen gerade durch einen
bestimmten Heimatoder abhängigen
Agenten erfüllt werden,
hat dieser Agent seine volle Verarbeitungskapazität erreicht
und kann nicht mit der Verarbeitung weiterer Anforderungen beginnen,
bis mindestens eine der sechzehn bereits entgegengenommenen Anforderungen
vollständig
bearbeitet ist.
-
Nach einer weiteren Ausführungsform
der Erfindung, die sich auf cachekohärente, parallele Computersysteme
mit mehreren Knoten bezieht, die einen Eingabe/Ausgabe- (Input/Output,
I/O) Cache in jedem Knoten haben, werden Transaktionen, die für I/O-Einrichtungen
bestimmt sind, separat von Transaktionen, die sich auf Cachekohärenz beziehen,
in Warteschlangen eingereiht, und die Verarbeitung von Cachekohärenz-Transaktionen
braucht niemals auf die Verarbeitung von I/O-bezogenen Transaktionen zu warten.
-
Wie man erkennen kann, stellt eine
Ausführungsform
der Erfindung ein effektives Verfahren und eine Vorrichtung bereit,
um einen geordneten Fluß von
Speicheranforderungstransaktionen ohne Rückgriff auf die Implementierung
eines komplexen Transaktionsflußprotokolls
vorzusehen. Es sollte klar sein, daß die Erfindung auf jedes cachekohärente Computersystem
anwendbar ist, das mehrere Knoten hat, wobei jeder Knoten über einen
Teil des globalen Speichers und mindestens einen Prozessor mit vorgelagertem
Cache verfügt.