-
HINTERGRUND DER ERFINDUNG
-
Gebiet der Erfindung
-
Die vorliegende Erfindung bezieht
sich auf einen Prozessor oder eine Computerarchitektur. Im Besonderen
bezieht sich die vorliegende Erfindung auf multiple Threading-Prozessor-Architekturen
und Verfahren zum Betrieb und zur Ausführung davon.
-
Beschreibung des Stands
der Technik
-
In vielen kommerziellen Rechneranwendungen
vergeht viel Zeit während
des Stallings und des Leerlaufs (idling) der Pipeline, anstatt während produktiver
Ausführung
der Programme, infolge von Cache-Fehltreffern und einer Latenzzeit
beim Zugreifen auf externe Cache-Speicher oder externe Speicher nach
den Cache-Fehltreffern. Das Stalling und das Leerlaufen sind infolge
von häufigen
Cache-Fehltreffern besonders nachteilig beim Betrieb von Datenbanken,
wie zum Beispiel OLTP, DSS, Datensuche, finanziellen Vorhersagen,
beim rechnerunterstützten mechanischen
und elektronischen Entwurf (MCAD/ECAD), Webservern, Datenbankservern
und dergleichen. Somit wird beim leerlaufenden Warten auf Daten
viel Zeit verschwendet, obwohl ein Prozessor mit einer höheren Geschwindigkeit
arbeiten kann.
-
Eine Technik, um das Stalling und
das Leerlaufen zu reduzieren, ist das Hardware-Multithreading, um damit eine Prozessorverarbeitung
während anderer
Leerlaufzyklen zu erreichen. Das Hardware-Multithreading bedingt
eine Nachbildung (replication) von einigen Prozessorressourcen,
zum Beispiel die Nachbildung von konstruierten Registern (architected
registers) für
jeden Thread. Die Nachbildung wird für die meisten Prozessorressourcen
einschließlich
der Befehls- und Datencaches, Adress-Umsetzpuffer (translation look-aside
buffers (TLB)), Befehls-Holelemente und Dispatcher, Branch-Units,
Ausführungseinheiten
und dergleichen, nicht benötigt.
-
Eine nachteilige Duplizierung von
Ressourcen ist in Bezug auf den Einsatz von integrierten Schaltungen
und deren Leistung kostenintensiv. Ein Beispiel für eine Vorrichtung,
welche Ressourcen dupliziert, ist in
US
5,361,337 beschrieben. Dort wird ein System offenbart,
das mehrere Kopien von Zustandselementen auf einem Prozessor hat,
der mit einem Multiplexer verbunden ist, um es dem Prozessor zu ermöglichen,
den Kontext der aktuellen Befehle abzuspeichern und die Ausführung von
neuen Befehlen innerhalb einem Taktzyklus wieder aufzunehmen. Die
Duplizierung von Zustandselementen und die Aufnahme von vielen Multiplexern
erhöht
den Verbrauch von integrierten Schaltungen und reduziert die Leistung.
-
Ein anderes Beispiel für eine Vorrichtung,
bei der ein hoher Grad an Duplizierung von Ressourcen erreicht wird,
ist in "The M-Machine Multicomputer" von Fillo et al., Proceedings
of Micro-28, 29. November 1995, Seiten 146–156 beschrieben. Die Vorrichtung
von Fillo enthält
vier Cache-Speicher und vier entsprechende MAP-Ausführungscluster,
jeweils einen 64-Bit-Dreifachausgabe-Pipeline-Prozessor, der aus
zwei Integer-Recheneinheiten, einer Fließkomma-Recheneinheit, dazugehörigen Registerdateien und
einem 1 KW-Befehls-Cache besteht.
-
Berekovic et al. beschreibt in "An
Algorithm-Hardware-System Approach to VLIW Multimedia Processors",
Journal of VLSI Signal Processing 20, Seiten 163–180 (1998) eine andere Prozessorarchitektur,
die duplizierte Ressourcen verwendet, um ein Multithreading zu erreichen.
Der Prozessor hat drei unabhängige
Befehlsströme,
drei Befehlsreihen und Decodereinheiten, jede wird als ein Thread-Schlitz
bezeichnet. Jeder Thread-Schlitz ist mit einem Programmzähler verbunden,
um einen logischen Prozessor zu bilden. Befehls- und Funktionseinheiten
werden unter den logischen Prozessoren gemeinsam genutzt.
-
Auf ähnliche Art und Weise diskutiert
Byrd et al. in "Multithreaded Processor Architectures", IEEE Spectrum,
V32, N8, August 1995 verschiedene Techniken für Multithreading, in denen
eine Multi-Thread-Prozessorarchitektur einen Überhang beim Umschalten von
Kontext reduziert oder eliminiert, indem multiple Hardware-Kontexte
zur Verfügung
gestellt werden, das heißt,
multiple Sätze
von Registern für
allgemeine Aufgaben, Statusregistern und Programmzählern.
-
Gulati et al offenbart in "Performance
study of a multithreaded superscalar microprocessor", Proceedings
International Symposium on High-Performance Computer Architecture,
1996 einen Prozessor, welcher Multithreading unterstützt, der
dieses aber nicht durch Hinzufügen
von duplizierten Ressourcen unterstützt, sondern durch Hinzufügen von neuen
Multithreading Ressourcen. Gulati et al. lehrt die Hinzufügung einer
Zeitplaneinheit (scheduling unit) einschließlich einer Zeitplanlogik (scheduling
logic), welche einen Befehls-FIFO aufrechterhält und die Befehle des FIFOs
von unten nach oben analysiert und Befehle ausgibt, welche zur Ausführung bereit
sind. Entsprechend werden zusätzliche
Ressourcen benötigt,
um Multithreading zu erreichen, was die Schaltungsgröße, den
Leistungsverbrauch und die Komplexität erhöht, obwohl Gulati et al. keine
Duplizierung von Ressourcen lehren.
-
Was benötigt wird, ist eine Architektur,
die ein Multithreading ohne Duplizierung oder Hinzufügung von
Hardware-Ressourcen erreicht, so dass Schaltungsfläche und
Leistung eingespart werden. Entsprechend werden verbesserte Multithreading-Schaltungen
und Betriebsverfahren benötigt,
die in ihren Ressourcen wirtschaftlich sind und einen kostenintensiven Überhang
vermeiden, welcher die Prozessorleistung reduziert.
-
Zusammenfassung der Erfindung
-
Ein Prozessor reduziert die verschwendete Zykluszeit,
welche vom Stalling und Leerlaufen resultiert und erhöht den Anteil
an Verarbeitungszeit, indem er sowohl das vertikale Multithreading
als auch das horizontale Multithreading unterstützt und implementiert. Das
vertikale Multithreading ermöglicht
ein Überlappen
oder "Verbergen" von Wartezeiten aufgrund von Cache-Fehlerraten.
Beim vertikalen Multithreading nutzen Multi-Hardware-Threads gemeinsam
dieselbe Prozessor-Pipeline. Ein Hardware-Thread ist typischerweise
ein Prozess, ein von der Funktion her reduzierter Prozess (light
weight process), ein nativer Thread oder dergleichen in einem Betriebssystem,
welches Multithreading unterstützt.
Horizontales Multithreading erhöht
die Parallelität
innerhalb der Prozessorschaltungsstruktur, zum Beispiel innerhalb
einem einzelnen integrierten Schaltungs-Die, der einen Ein-Chip-Prozessor
bildet. Um die Systemparallelität
in manchen Prozessorausführungsbeispielen
weiter zu erhöhen,
werden Multiprozessorkerne auf einem einzigen Die hergestellt. Die
Vorteile von einem horizontalen Threading bei einem Ein-Chip-Multiprozessor
werden erreicht, wenn die Prozessorkerngröße durch den technologischen Fortschritt
reduziert wird.
-
Die beschriebene Prozessorstruktur
und das Betriebsverfahren können
in vielen strukturellen Variationen implementiert werden. Zum Beispiel
werden zwei Prozessorkerne mit einem On-Chip-Set-Associative-L2-Cache
in einem System kombiniert. In einem anderen Beispiel werden vier
Prozessorkerne mit einem direkten RAMBUS-Interface ohne externen
L2-Cache kombiniert. Es sind zahllose Variationen möglich. In
manchen Systemen ist jeder Prozessorkern eine vertikale gethreadete
Pipeline.
-
In einem weiteren Aspekt einiger
Ausführungsbeispiele
von Multithreading-Systemen und -Verfahren kann ein Rechnersystem
aus vielen unterschiedlichen Prozessorvariationen aufgebaut sein, die
einen Ausführungsort
einer Vielzahl von Execution-Threads bilden, zum Beispiel in einer "1C2T"-Konfiguration
enthält
ein einzelner Prozessor-Die zwei vertikale Threads. In einer "4C4T"-Konfiguration
wird ein Multiprozessor aus vier Prozessoren auf einem einzigen
Die hergestellt, wobei jeder der vier Prozessoren vertikal Vier-Wege-Threaded ist.
Zahllose andere "nCkT"-Strukturen und Kombinationen können auf
einem oder mehreren integrierten Schaltungsdies implementiert werden,
abhängig
vom verwendeten Herstellungsprozess und den Anwendungen, für die der
Prozessor gedacht ist. Verschiedene Systeme können Cache-Speicher enthalten, welche
wahlweise konfiguriert sind, zum Beispiel als getrennte L1-Cache-Speicher
und getrennte L2-Cache-Speicher oder getrennte L1-Cache-Speicher
und gemeinsam benutzte L2-Cache-Speicher, oder getrennte L1-Cache-Speicher
und gemeinsam genutzte L2-Cache-Speicher. In einem Aspekt einiger
Ausführungsbeispiele
von Multithreading-Systemen und -Verfahren friert ein Prozessor
als Reaktion auf eine Cache-Speicher-Fehltreffer-Blockierung den gesamten
Zustand einer Pipeline beim Ausführung
eines Threads ein. Für
jeden Thread getrennt und unabhängig
voneinander führt
der Prozessor die Befehle aus und verwaltet den Maschinenzustand.
Die funktionellen Eigenschaften eines unabhängigen Thread-Zustandes werden über die
Pipeline in den Pipeline-Registern abgespeichert, um es dem Prozessor
zu ermöglichen,
die Ausführung
eines blockierten Threads zu verschieben, die Pipeline für einen
vorher leerlaufenden Thread freizugeben und um später die
Ausführung
des aufgeschobenen blockierten Threads bei genau dem Zustand des
blockierten Threads wieder aufzunehmen, der unmittelbar vor dem
Umschalten des Threads vorlag.
-
In einem anderen Aspekt von Ausführungsbeispielen
von einigen Multithreading-Systemen
und -Verfahren enthält
ein Prozessor eine "vier-dimensionale" Registerstruktur, in welcher
Registerdatenstrukturen N mal für
das vertikale Threading in Kombination mit einer dreidimensionalen
Speicherschaltung vorhanden sind. Der multidimensionale Speicher
ist aufgebaut, indem ein Speicher, wie zum Beispiel eine Registerdatei
oder ein Speicher, als eine Vielzahl von zweidimensionalen Speicherebenen aufgebaut
ist.
-
In einem anderen Aspekt von einigen
Ausführungsbeispielen
von Multithreading-Systemen und
-Verfahren implementiert ein Prozessor eine N-Bit-Flip-Flop-globale
Substitution. Um multiple Maschinenzustände zu implementieren, konvertiert
der Prozessor die 1-Bit-Flip-Flops
in den Speicherzellen des blockierten vertikalen Threads in ein
N-Bit-globales Flip-Flop, wobei N die Anzahl der vertikalen Threads
ist.
-
In einem Aspekt von einigen Ausführungsbeispielen
von Prozessoren und Prozessorverfahren verbessert der Prozessor
die Durchgangseffizienz und erhält
eine erhöhte
Parallelität
durch Einführung von
Multithreading in einem existierenden und bereitstehenden Prozessorkern.
Das Multithreading wird in zwei Schritten implementiert, welche
das vertikale und das horizontale Multithreading enthalten. Der Prozessorkern
wird ergänzt,
um multiple Maschinenzustände
zu unterstützen.
Ausführungsbeispiele
des Systemes, welche die Ergänzung
eines bestehenden Prozessorkernes vorteilhafterweise nutzen, beeinflussen
hunderte von Mannjah ren von Hardware- und Softwareentwicklung, indem
die Lebenszeit einer erprobten Prozessor-Pipelinegeneration verlängert wird.
-
In einem anderen Aspekt von einigen
Ausführungsbeispielen
von Multithreading-Systemen und
-Verfahren enthält
ein Prozessor eine Logik zur Markierung (tagging) einer Thread-Identifikation (TID)
für den
Gebrauch mit Prozessorblöcken,
welche nicht blockiert sind. Die relevanten nicht blockierten Blöcke enthalten
Cache-Speicher, Adressumsetzpuffer (TLB), eine Ladepuffer-asynchrone Schnittstelle,
eine externe Speichermanagement-Einheit (MMU)-Schnittstelle und
andere Elemente.
-
In einem weiteren Aspekt der Ausführungsbeispiele
von Multithreading-Systemen und -Verfahren enthält ein Prozessor einen Cache-Speicher,
der in eine Vielzahl von N Cache-Speicherabschnitten aufgeteilt
ist. Die Aufteilung des Cache-Speichers vermeidet eine Interferenz,
"Verschmutzung" oder ein "Übersprechen"
zwischen den Threads. Eine Technik zur Aufteilung des Cache-Speichers
nutzt die Logik zum Abspeichern und zur Kommunikation der Thread-Identifikations-(TID)-Bits.
Der Cache-Speicher nutzt die Cache-Indizierungslogik. Zum Beispiel
können
die TID-Bits beim Bit mit der höchsten
Bedeutung des Cache-Indexes eingefügt werden.
-
In einem anderen Aspekt der Ausführungsbeispiele
von Multithreading-Systemen und -Verfahren enthält ein Prozessor eine Steuerlogik
zum Umschalten von Threads, welche einen schnellen Umschaltbetrieb
von Threads als Reaktion auf eine L1-Cache-Speicher-Fehltrefferblockierung
ausführt. Der
schnelle Betrieb zum Umschalten von Threads implementiert ein oder
mehrere unterschiedliche Umschaltverfahren für Threads. Ein erster Betrieb
zum Umschalten von Threads ist das "unbewusste" (oblivious) Umschalten
eines Threads bei jedem N-ten Zyklus, in welchen die einzelnen Flip-Flops
lokal eine Thread-Umschaltung bestimmen, ohne eine Mitteilung über die
Blockierung abzugeben. Diese "unbewusste" Technik vermeidet den
Gebrauch einer zusätzlichen
globalen Verbindung zwischen den Threads für die Thread-Auswahl. Ein zweiter
Betrieb zum Umschalten von Threads ist das "semiunbewusste" (semi-oblivious)
Umschalten von Threads, für
den Gebrauch mit einem vorhandenen "Pipeline-Blockierungs"-Signal
(wenn eines vorhanden ist). Das Pipeline-Blockierungssignal hat zwei Funktionen,
erstens als eine Mitteilung einer Pipeline-Blockierung und zweitens als ein Thread-Auswahlsignal zwischen
den Threads, so dass wieder der Gebrauch einer zusätzlichen
globalen Verbindung zwischen den Threads für die Thread-Auswahl vermieden
wird. Ein dritter Betrieb zum Umschalten von Threads ist ein "intelligentes
globales Zeitplan"-Thread-Umschalten, in welchem eine Entscheidung
zum Umschalten eines Threads auf einer Vielzahl von Signalen basiert,
die folgende Signale enthält:
(1) ein L1-Datencache-Fehltreffer-Blockierungssignal, (2) ein Befehlspuffer-Leersignal,
(3) ein L2-Cache-Fehltreffersignal, (4) ein Thread-Prioritätssignal,
(5) ein Thread-Zeitsignal, (6) ein Unterbrechungssignal oder andere
Quellen zum Triggern. In manchen Ausführungsbeispielen wird das Thread-Auswahlsignal ähnlich der
Verteilung eines Taktsignales mittels eines Clocktrees, so schnell
wie möglich
ausgesendet. In manchen Systemen leitet ein Prozessor ein Auswahlsignal
für Threads,
das an die Flip-Flops angelegt wird, ab, indem ein Scan-Freigabe-(SE)-Signal
eines scanbaren Flip-Flops überlastet
wird.
-
In einem zusätzlichen Aspekt von Ausführungsbeispielen
von Multithreading-Systemen
und -Verfahren enthält
ein Prozessor eine Anti-Aliasing-Logik, die mit einem L1-Cache verbunden ist, so
dass der L1-Cache über
das Anti-Aliasing von den Threads gemeinsam benutzt wird. Der L1-Cache
ist ein virtuell indizierter, physikalisch markierter Cache-Speicher, der unter
den Threads gemeinsam benutzt wird. Die Anti-Aliasing-Logik vermeidet
Probleme, die vom multi-virtuellen Adress-Mapping auf eine virtuelle
Adresse resultieren. Die Anti-Aliasing-Logik erklärt wahlweise
duplizierte L1-Cache-Speichereinträge für ungültig oder bringt diese auf
den neuesten Stand.
-
Bei einem anderen Aspekt von einigen
Ausführungsbeispielen
des Multithreading-Systems
und -Verfahrens enthält
ein Prozessor eine Logik zur Erlangung einer sehr schnellen Funktionalität zur Behandlung
von Ausnahmen während
der Ausführung von
nichtgethreadeten Programmen, indem ein Multi-Thread-Funktionalitätstyp als
Reaktion auf eine Ausnahmebedingung aufgerufen wird. Der Prozessor
arbeitet sich während
der Ausführung
durch die multiplen Maschinenzustände, während er die Multi-Thread-Bedingungen
ausführt
oder während
er die nicht-gethreadeten Programme ausführt. Die sehr schnelle Behandlungslogik
enthält
eine Verbindung zu einer Ausnahmesignalleitung, um eine Auswahllogik
zu threaden, was ein Ausnahmesignal dazu bringt, eine Umschaltung
im Thread- und Maschinenzustand durchzuführen. Die Umschaltung im Thread- und
Maschinenzustand veranlasst den Prozessor, ohne auf die Ausgabe
der Pipeline oder der Schlange zu warten und ohne die inhärente Zeitstrafe
der Betriebsystems-Software, welche die Register abspeichert und
wieder herstellt, sofort in die Ausnahmebehandlungsroutine einzutreten
und diese wieder zu verlassen.
-
Ein zusätzlicher Aspekt von einigen
Multithreading-Systemen und -Verfahren ist ein Thread-Reservierungssystem
oder ein Thread-Verriegelungssystem, in welchem ein Threadpfad für den Gebrauch
durch einen ausgewählten
Thread reserviert wird. Eine Thread- Steuerlogik kann einen besonderen Thread
auswählen,
der mit Priorität
im Vergleich zu anderen Threads, auszuführen ist. Ein Thread mit hoher
Priorität
kann mit einem Betrieb mit strikten Zeitbegrenzungen verbunden werden,
wobei dies ein Betrieb ist, der im Vergleich zu anderen Threads
häufig
und überwiegend
ausgeführt
wird. Die Thread-Steuerlogik steuert den Betrieb des Umschaltens
der Threads, so dass ein bestimmter Hardware-Thread für den Gebrauch
durch den ausgewählten
Thread reserviert wird.
-
In einem anderen Aspekt einiger Ausführungsbeispiele
von Multithreading-Systemen und -Verfahren enthält ein Prozessor Logikunterstützungs-Leichtgewichtsprozesse
und native Threads. Die Logik enthält einen Block, welcher die
Markierung von Thread-IDs sperrt und die Aufrennung von Cache-Speichern
sperrt, da die Leichtgewichtsprozesse und die nativen Threads denselben
virtuellen Markierungsraum gemeinsam benutzen.
-
In einem weiteren zusätzlichen
Aspekt von einigen Ausführungsbeispielen
der Multithreading-Systeme und -Verfahren enthalten einige Prozessoren
eine Thread-Reservierungs-Funktionalität.
-
Kurze Beschreibung er
Figuren
-
Die Merkmale der beschriebenen Ausführungsbeispiele
werden im Besonderen in den angefügten Ansprüchen weiter ausgeführt. Jedoch
können
die Ausführungsbeispiele
der Erfindung in Bezug auf sowohl die Struktur als auch auf das
Verfahren des Betriebes am besten mit Bezug auf die folgende Beschreibung
und die begleitenden Zeichnungen verstanden werden.
-
1A und 1B sind Zeitdiagramme, die
jeweils den Ausführungsfluss
eines einzelnen Thread-Prozessors und eines vertikalen Multi-Thread-Prozessors
darstellen.
-
2A, 2B und 2C sind Zeitdiagramme, die jeweils den
Ausführungsfluss
eines Einzel-Thread-Prozessors, eines vertikalen Multi-Thread-Prozessors
und eines vertikalen und horizontalen Multi-Thread-Prozessors darstellen.
-
3 ist
ein schematisches und funktionelles Blockdiagramm, welches eine
Entwurfskonfiguration für
einen Einzelprozessor-vertikal gethreadeten Prozessor darstellt,
der zur Implementierung verschiedener Multithreading-Techniken und
-Systeme geeignet ist, welche die Multithreading-Leistung und -Funktion
verbessern.
-
4A, 4B und 4C sind Diagramme, welche ein Ausführungsbeispiel
eines pulsbasierten Hochgeschwindigkeits-Flip-Flops darstellen,
welches vorteilhaft benutzt werden kann, um ein Multithreading in einer
integrierten Schaltung zu erreichen. 4A ist ein schematisches
Blockdiagramm, welches die Steuerung und Abspeicherung von Schaltungsblöcken darstellt,
die Hochgeschwindigkeits-Multibit-Flip-Flops benutzen. 4B ist eine schematische
Schaltungsdarstellung, welche eine Multibit-bistabile Multivibrator-(Flip-Flop)-Schaltung zeigt. 4C ist ein Zeitdiagramm,
welches den Zeitablauf des Multibit-Flip-Flops darstellt.
-
5 ist
ein schematisches Blockdiagramm, das eine N-Bit-"thread-auswählbare"
Flip-Flop-Ersetzungslogik darstellt, die benutzt wird, um eine vertikal multi-gethreadete
Funktionalität
in einer Prozessor-Pipeline herzustellen, während dieselbe Schaltungsgröße wie bei
einer einzel-gethreadeten Pipeline beibehalten wird.
-
6 ist
ein schematisches Blockdiagramm, welches eine Thread-Umschaltlogik
darstellt, die sehr schnell ein Thread-Identifizierungs-(TID)-Signal erzeugt,
welches einen aktiven Thread aus einer Vielzahl von Threads identifiziert.
-
7A und 7B sind jeweils schematische Blockdiagramme,
die ein Beispiel für
einen aufgetrennten Cache-Speicher und ein Diagramm, welches ein
Beispiel für
eine Adresstechnik für
den aufgetrennten Cache-Speicher ist, zeigen.
-
8 ist
ein schematisches Blockdiagramm, das eine geeignete Anti-Aliasing-Logik
für den
Gebrauch von verschiedenen Prozessor-Implementierungen einschließlich einem
Cache, wie zum Beispiel einem L1-Cache und L2-Cache oder anderen
zeigt.
-
9 ist
ein schematisches funktionelles Blockdiagramm, das eine Entwurfskonfiguration
für einen
Einzelchip-Dualprozessor-vertikal-getreadeten Prozessor zeigt, der
zur Implementierung von verschiedenen Multi-Thread-Techniken und
System-Implementationen geeignet ist, die die Multi-Thread-Leistung
und Funktion verbessern.
-
10 ist
ein schematisches funktionelles Blockdiagramm, das einen alternativen
Entwurf für eine
Konfiguration für
einen Einzelprozessor-vertikal-gethreadeten Prozessor zeigt, welche
in der Lage ist, verschiedene Multithreading-Techniken und System-Implementierungen
zu implementieren, welche die Multithreading-Leistung und -Funktion
verbessern.
-
11 ist
ein schematisches funktionelles Blockdiagramm, welches einen alternativen
Entwurf für
eine Konfiguration für
einen Einzelchip-Dualprozessor-vertikal-gethreadeten Prozessor zeigt,
der zur Implementierung von verschiedenen Multithreading-Techniken
und System-Implementierungen geeignet ist, welche die Multithreading-Leistung
und -Funktion verbessern.
-
12 ist
ein schematisches Blockdiagramm, welches einen Prozessor und eine
Pro zessorarchitektur zeigt, die zur Implementierung verschiedener
Multithreading-Techniken und System-Implementierungen geeignet sind,
welche die Multithreading-Leistung und -Funktion verbessern.
-
13 ist
ein schematisches perspektivisches Diagramm, welches eine multidimensionale Registerdatei
zeigt.
-
14 ist
ein schematisches Schaltungsdiagramm, welches eine herkömmliche
Implementierung von Registerfenstern zeigt.
-
15 ist
ein schematisches Schaltungsdiagramm, welches eine Vielzahl von
Bitzellen eines Registerfensters der multi-dimensionalen Registerdatei zeigt,
welche eine Verschwendung von Fläche
einer integrierten Schaltung vermeidet, indem es die Bedingung nutzt,
dass gleichzeitig nur ein Fenster gelesen wird und nur ein Fenster
geschrieben wird.
-
16 zeigt
ein schematisches Schaltungsdiagramm, welches eine geeignete Bit-Speicherschaltung
darstellt, die ein Bit des lokalen Registers für die multi-dimensionale Registerdatei
mit acht Fenstern abspeichert.
-
17A und 17B sind jeweils schematisches
Diagramm und ein schematisches Blockdiagramm, welche das gemeinsame
Benutzen von Registern unter den nebeneinander liegenden Fenstern zeigen.
-
18 ist
ein schematisches Schaltungsdiagramm, das eine Implementierung einer
multi-dimensionalen Registerdatei für Register, welche von einer Vielzahl
von Fenstern gemeinsam benutzt werden, zeigt.
-
Die Benutzung von gleichen Referenzsymbolen
in unterschiedlichen Zeichnungen gibt gleiche oder identische Teile
an.
-
Beschreibung der Ausführungsbeispiele
-
Bezüglich den 1A und 1B stellen
zwei Zeitdiagramme jeweils den Ausführungsfluss 110 in einem
Einzel-Thread-Prozessor und den Ausführungsfluss 120 in
einem vertikalen Multi-Thread-Prozessor dar. Verarbeitungsanwendungen,
wie zum Beispiel Datenbankanwendungen, verbringen einen beträchtlichen
Anteil der Ausführungszeit
in einem blockierten Zustand, wo sie auf die Reaktion vom Speicher
warten. 1A ist ein hochschematisches Zeitdiagramm,
welches den Ausführungsfluss 110 eines
Einzel-Thread-Prozessors
darstellt, welcher eine Datenbankanwendung ausführt. In einem erklärenden Beispiel
ist der Einzel-Thread-Prozessor ein Vier-Wege-Superskalar-Prozessor.
Schraffierte Flächen 112 entsprechen
den Perioden der Ausführung, in
welchen der Einzel-Thread-Prozessor Befehle ausgibt. Freie Flächen 114 entsprechen
Zeitperioden, in denen der Einzel-Thread-Prozessorkern blockiert ist und auf
Daten oder Befehle vom Speicher oder einem externen Cache wartet.
Ein typischer Einzel-Thread-Prozessor, der eine typische Datenbankanwendung
ausführt,
führt zu
30% der Zeit Befehle aus, wobei 70% der Zeit in einem blockierten
Zustand vergeht. Die Rate von 30% der Benutzung ist ein Beispiel
für den
ineffizienten Gebrauch der Ressourcen durch einen Einzel-Thread-Prozessor.
-
1B ist
ein hochschematisches Zeitdiagramm, welches den Ausführungsfluss 120 von ähnlichen
Datenbankanwendungen durch einen Multi-Thread-Prozessor zeigt. Anwendungen,
wie zum Beispiel Datenbankanwendungen, haben einen großen Grad
an inhärenter
Parallelität
infolge der Orientierung an starkem Durchlauf der Datenbankanwendung
und der gemeinsamen Datenbankfunktion beim Verarbeiten einiger unabhängiger Transaktionen
zur gleichen Zeit. Das Basiskonzept zur Nutzung der Multi-Thread-Funktion
setzt Prozessorressourcen effizient ein, wenn ein Thread durch das
Ausführen
eines anderen Threads blockiert wird, während der blockierte Thread
blockiert bleibt. Der Ausführungsfluss 120 stellt
einen ersten Thread 120, einen zweiten Thread 124,
einen dritten Thread 126 und einen vierten Thread 128 dar,
wobei alle mit einer Schraffur im Zeitdiagramm dargestellt sind.
Wenn ein Thread blockiert ist, zum Beispiel der erste Thread 122,
dann schaltet ein anderer Thread, zum Beispiel der zweite Thread 124,
auf die Ausführung
in einer anderen nicht benutzten oder leerlaufenden Pipeline um. Freie
Flächen 130 entsprechen
Leerlaufzeiten, wenn alle Threads blockiert sind. Der gesamte Einsatz
des Prozessors wird durch das Multithreading deutlich verbessert.
Die illustrative Technik des Multithreadings benutzt die Nachbildung
von aufgebauten Registern für
jeden Thread und wird "vertikales Multithreading" genannt.
-
Vertikales Multithreading ist beim
Verarbeiten von Anwendungen vorteilhaft, in welchen häufige Cache-Fehltreffer
zu empfindlichen Taktstrafen führen.
Wenn die Cache-Fehltreffer
bewirken, dass ein erster Thread blockiert, dann erlaubt das vertikale Multithreading
Cache einem zweiten Thread, dass dieser ausgeführt wird, wenn der Prozessor
sonst leerlaufend bleiben würde.
Somit übernimmt
der zweite Thread die Ausführung
auf der Pipeline. Ein Kontextumschalter vom ersten Thread auf den
zweiten Thread bedingt das Abspeichern von nützlichen Zuständen des
ersten Threads und das Zuweisen von neuen Zuständen an den zweiten Thread.
Wenn der erste Thread nach dem Stalling wieder beginnt, dann werden
die abgespeicherten Zustände
wieder hergestellt und der erste Thread geht in die Verarbeitung über. Das
vertikale Multithreading geht auf Kosten der Prozessor-Ressourcen,
die zum Abspeichern und zum Wiederherstellen der Thread-Zustände benutzt
werden.
-
Bezüglich den 2A, 2B und 2C stellen drei hochgradig
schematische Zeitdiagramme jeweils den Ausführungsfluss 210 eines
Einzel-Thread-Prozessors, einen Ausführungsfluss 230 eines
vertikalen Multi-Thread-Prozessors und einen Ausführungsstrom 250 eines
kombinierten vertikalen und horizontalen Multi-Thread-Prozessors
dar. In 2A stellen die
schraffierten Flächen 212 Ausführungsperioden dar
und freie Flächen 214 stellen
Zeitperioden dar, in denen der Einzel-Thread-Prozessorkern infolge
von Blockierung leerläuft,
was die Ineffizienz eines Einzel-Thread-Prozessors darstellt.
-
In 2B enthält der Ausführungsfluss 230 in
einem vertikal gethreadeten Prozessor eine Ausführung eines ersten Threads 232 und
eines zweiten Threads 234, wobei beide im Zeitdiagramm
schraffiert sind, und eine Leerlaufzeit, die in einer freien Fläche 240 dargestellt
ist. Eine effiziente Befehlsausführung
zeigt sich, wenn ein Thread blockiert und als Reaktion auf die Blockierung
ein anderer Thread in den Zustand der Verarbeitung auf der sonst
nicht genutzten oder leerlaufenden Pipeline umschaltet. In den freien
Flächen 240 tritt
eine Leerlaufzeit auf, wenn alle Threads blockiert sind. Für den vertikalen
Multi-Thread hält
der Prozessor einen getrennten Verarbeitungszustand für T Ausfiihrungs-Threads
aufrecht. Nur ein Thread ist gleichzeitig aktiv. Der vertikale Multi-Thread-Prozessor
schaltet die Ausführung auf
einen anderen Thread bei einem Cache-Fehltreffer, zum Beispiel einem
L1-Cache-Fehltreffer,
um.
-
Ein horizontal gethreadeter Prozessor,
welcher eine Technik benutzt, die multiple Chip-Verarbeitung genannt
wird, kombiniert Multi-Prozessoren auf einem integrierten Schaltungsdie.
Die multiplen Prozessoren sind vertikal gethreadet, um einen Prozessor
mit sowohl vertikalem als auch horizontalem Threading zu bilden,
welche die Ausführungseffizienz vergrößern und
die Latenz in einer multiplikativen Art verringern. In 2C enthält der Ausführungsfluss 250 in
einem vertikal und horizontal gethreadeten Prozessor die Ausführung eines
ersten Threads 252, der auf einem ersten Prozessor ausgeführt wird,
einen zweiten Thread 254, welcher auf dem ersten Prozessor
ausgeführt
wird, einen ersten Thread 256, der auf einem zweiten Prozessor
ausgeführt
wird und einem zweiten Thread 258, der auf dem zweiten
Prozessor ausgeführt
wird. Eine Leerlaufzeit wird durch die freie Fläche 260 für sowohl
den ersten als auch den zweiten Prozessor dargestellt. Die Ausführung des
ersten Threads 252 und des zweiten Threads 254 auf
dem ersten Prozessor stellt das vertikale Threading dar. Auf ähnliche
Art und Weise stellt die Ausführung
des ersten Threads 256 und des zweiten Threads 258 auf
dem zweiten Prozessor das vertikale Threading dar. In dem beschreibenden
Ausführungsbeispiel
enthält
eine einzelne integrierte Schaltung sowohl den er sten Prozessor
als auch den zweiten Prozessor, wobei die multiplen Prozessoren
parallel arbeiten, so dass der Multithreading-Betrieb ein Horizontal-Multithreading
oder eine integrierte Schaltungschip-Multiverarbeitung (CMP) in
Kombination mit dem vertikalen Multithreading des ersten Prozessors
und des zweiten Prozessors ist. Die Kombination des vertikalen Multithreadings
und des horizontalen Multithreadings erhöht die Parallelität und die Leistung
des Prozessors und erreicht eine Ausführungswirksamkeit, welche die
Effizienz eines Prozessors übersteigt,
der nur vertikales Multithreading benutzt. Die Kombination aus vertikalem
Multithreading und horizontalem Multithreading reduziert auch mit Vorteil
die Verbindungslatenzzeit zwischen den lokalen (On-Chip) Multi-Prozessor-Aufgaben,
indem ein großer
Aufwand an Signalisierung auf Verbindungsleitungen mit hoher Latenzzeit
zwischen den integrierten Schaltungschips eliminiert wird. Horizontales Multithreading
nutzt des weiteren vorteilhaft die Prozessorgeschwindigkeit und
die Leistungsverbesserungen aus, welche inhärent von der reduzierten Schaltungsgröße bei der
Entwicklung der Siliciumverarbeitung resultieren.
-
Für
jeden vertikal gethreadeten Prozessor wird die effiziente Befehlsausführung ausgeführt, wenn
ein Thread blockiert ist und als Reaktion auf die Blockierung schaltet
ein anderer Thread auf die Ausführung
auf einer ansonsten nicht benutzten oder leerlaufenden Pipeline
um. In den freien Flächen 260 tritt
eine Leerlaufzeit auf, wenn alle Threads blockiert sind.
-
Das vertikale Multithreading wird
mit Vorteil benutzt, um die Blockierungen durch Cache-Fehltreffer
zu überwinden
oder zu verbergen und um dadurch die Ausführungen durch den Prozessor
fortzusetzen, anstatt die Ausführung
zu blockieren. Vertikales Multithreading verbessert somit die Leistung
in kommerziellen Multi-Prozessor- und Multithreading-Anwendungen. Das
vertikale Multithreading verkürzt
mit Vorteil die Zeit zum Umschalten von Kontexten vom Millisekundenbereich
in den Nanosekundenbereich. Vertikales Multithreading ist sehr von
Vorteil in allen Verarbeitungsumgebungen, einschließlich von
eingebetteten, Desktop- und Serveranwendungen und dergleichen.
-
Das horizontale Multithreading oder
die Schaltungschip-Multiverarbeitung erhöht folglich die Parallelität auf dem
Chip, indem es die zunehmend kleineren Prozessorkerngrößen nutzt.
-
Obwohl das erklärende Beispiel die Ausführung von
zwei gegensätzlichen
vertikalen Multithreading-Prozessoren zeigt, wobei jeder gegensätzliche vertikale
Multithreading-Prozessor
zwei Threads ausführt,
können
in einem anderen Beispiel eine unterschiedliche Anzahl von gegensätzlichen
Ausführungsprozessoren
unterschiedliche Anzahlen von Threads ausführen. Die Anzahl der Threads,
welche ein Prozessor ausführt,
können
gleich oder unter schiedlich zu der Zahl von Threads sein, welche
gegensätzlich
und parallel auf einem anderen Prozessor ausgeführt werden.
-
Bei manchen Prozessorentwürfen fließt das vertikale
und horizontale Multithreading in den fundamentalen Entwurf des
Prozessors mit ein, was den Vorteil hat, dass dabei modulare und
flexible Strukturen geschaffen werden, welche die Skalierbarkeit
des Entwurfes fördern.
Bei anderen Prozessorentwürfen fließt das Multithreading
in bestehende und ausgereifte Prozessorentwürfe ein, um bestehende technologische
Grundlagen zu beeinflussen und die Leistung von Multiverarbeitungs-
und Multithreading-Anwendungen zu erhöhen. Ein besonders geeignetes Beispiel
des Prozessorentwurfs zum Umbau mit Multithreading-Funktionalität ist ein
Ultra-SPARC-Prozessor. In manchen Entwürfen wird ein vertikales und horizontales
Multithreading durch einen minimalen Umbau eines bereits bestehenden
Prozessorkernes erreicht, wobei die Veränderungen beim logischen und
physikalischen Entwurf reduziert und das gesamte Überarbeiten
der Verschaltung, die Umarbeitung und die Kosten für eine massive Überarbeitung der
integrierten Schaltungen vermieden werden.
-
Bezüglich 3 stellt ein schematisches funktionelles
Blockdiagramm einen Entwurf für
eine Konfiguration für
einen einzelprozessor-vertikal-gethreadeten Prozessor 300 dar,
der zur Implementierung verschiedener Multithreading-Techniken und System-Implementierungen
geeignet ist, welche die Multithreading-Leistung und Funktion verbessern. Der
einzel-Prozessor-vertikal-gethreadete Prozessor 300 hat
eine einzige Pipeline, welche von einer Vielzahl von Maschinenzuständen oder
Threads gemeinsam benutzt wird, was eine Vielzahl von Maschinenzuständen gleichzeitig
aufrechterhält.
Momentan ist ein Thread aktiv, das heißt nicht blockiert, der ausgewählt wird
und Daten an funktionelle Blöcke
liefert, welche mit der Pipeline verbunden sind. Wenn der aktive
Thread blockiert ist, dann schaltet die Pipeline sofort auf einen
nicht-blockierten Thread um, falls es überhaupt einen nichtblockierten
Thread gibt, und beginnt mit der Ausführung des nicht-blockierten Threads.
-
Der Einzel-Prozessor-vertikal-gethreadete Prozessor 300 enthält einen
Thread 0-Maschinenzustandsblock 310,
welcher einen Maschinenzustand eines ersten Threads (Thread 0) bildet.
Der Einzel-Prozessor-vertikal-gethreadete Prozessor 30 enthält auch
einen Thread 1-Maschinenzustandsblock 312,
welcher einen Maschinenzustand eines zweiten Threads (Thead 1) bildet,
welcher den Maschinenzustand des Thread 0 abbildet. Der Thread 0-Maschinenzustandsblock 310 und
der Thread 1-Maschinenzustandsblock 312 werden in einer einzigen
integrierten Schaltungslogikstruktur hergestellt, wobei ein Hochgeschwindigkeits-Multibit-Flip-Flop-Entwurf
und eine "vierdimensionale Registerdateistruktur" verwendet wird,
und Instruktionen von Thread 0 und Thread 1 unter Benutzung eines
vertikalen Threadings an eine gemeinsam benutzte Prozessor-Pipeline 314 zugeführt werden.
Die multidimensionale Registerdatei benutzt Registerdateistrukturen,
welche N mal für
das vertikale Threading in Kombination mit einer dreidimensionalen
Speicherschaltung vorhanden sind. Der dreidimensionale Speicher
wird hergestellt, indem ein Speicher, wie zum Beispiel eine Registerdatei
oder ein Speicher, als eine Vielzahl von zweidimensionalen Speicherebenen
aufgebaut wird.
-
Als Reaktion auf ein Cache-Fehltreffer-Stalling
(Cache-Fehltreffer-Blockierung) friert der Prozessor 300 den
gesamten Pipeline-Zustand eines auszuführenden Threads in der gemeinsam
benutzten Prozessor-Pipeline 314 ein. Der Prozessor 300 gibt
Instruktionen aus, welche den Maschinenzustand eines jeden Threads
getrennt und unabhängig verwalten.
Die funktionellen Eigenschaften eines unabhängigen Thread-Zustandes werden
in der ganzen Pipeline, welche sich zu den Pipeline-Registern erstreckt,
abgespeichert, um es dem Prozessor 300 zu ermöglichen,
die Ausführung
eines blockierten Threads zu verschieben, indem der aktive Zustand
in der Pipeline eingefroren wird, die Pipeline 304 für einen
vorher leerlaufenden Thread freigibt, indem der vorher leerlaufende
Thread in der Pipeline aktiviert wird, während der Zustand des neu leerlaufenden Threads
in der Pipeline gehalten wird und später die Ausführung des
aufgeschobenen blockierten Threads zu genau dem Zustand des blockierten Threads
wieder aufgenommen wird, der unmittelbar vor der Umschaltung des
Threads lag.
-
Die gemeinsam benutzte Prozessor-Pipeline 314 ist
mit einer dualen Lade/Speichereinheit verbunden, welche eine Thread
0-Lade-/Speichereinheit 316 und eine Thread 1-Lade-/Speichereinheit
318 enthält,
die jeweils die Zugriffe zum Laden und zum Speichern der Daten der
Instruktions-Threads 0 und 1 ausführen. Die Lade-/Speichereinheiten
erzeugen eine virtuelle Adresse aller Lade- und Speicheroperationen
beim Zugriff auf einen Datencache, entkoppeln die Ladefehler von
der Pipeline über
Ladepuffer (nicht dargestellt) und entkoppeln das Speichern über Speicherpuffer.
Es wird bis zu einer Lade- oder Speicheroperation pro Zyklus ausgegeben.
-
Die gemeinsam benutzte Prozessor-Pipeline 314 und
die duale Lade-/Speichereinheit sind mit einer Datenspeicher-Schnittstelle 320 verbunden,
welche einen gemeinsam benutzten Datencache und eine gemeinsam benutzte
Datenspeicher-Managementeinheit (DMMU) enthält. Der gemeinsam benutzte
Datencache wird benutzt, um Daten von sowohl Thread 0- als auch
Thread 1-Befehlssequenzen im Cache-Speicher abzuspeichern. In einem
beispielhaften Prozessor 300 ist der Datencache ein write-through-non-allocating-l6-Kilobyte-direct mapped-32-Byte-line-Cache-Speicher.
Der Datencache ist virtuell indiziert und physikalisch markiert,
indem ein Markierungsfeld (tag array) benutzt wird, welches zwei
Anschlüsse
hat, so dass Markierungs-Updates, welche von Zeileneingaben (line
fills) resultieren, nicht mit dem Lesen der Markierungen für eingehende
Ladebefehle kollidieren. Spezielle Überwachungsbusse (snoops) des
Datencaches nutzen den zweiten Markierungsanschluss, so dass eine
eingehende Ladeanweisung ohne Verzögerung durch den speziellen Überwachungsbus
verarbeitet wird. Die gemeinsam benutzte Datenspeicher-Managementeinheit
(DMMU) führt
die Umsetzung der virtuellen auf die physikalische Adresse durch.
-
Die dualen Lade-/Speichereinheiten
sind auch mit einer externen Cache-Steuereinheit (ECU) 322 verbunden,
die mit einem externen Cache-Bus 324 verbunden ist. Die
externe Cache-Steuereinheit 322 ist auch mit einem Ultraport-Architekturverbindungs(UPA)-Bus 326 über eine
Speicherschnittstelleneinheit (MIU 328 verbunden. Die externe
Cache-Steuereinheit 322 und
die Speicherschnittstelleneinheit (MIU) 328 sind zwischen
Thread 0 und Thread 1 vereinigt, um die Funktionen der Verarbeitung
eines Cache-Fehltreffers und eine Schnittstelle zu externen Geräten zu schaffen,
um in Kombination über
einen gemeinsam genutzten Instruktionssteuerblock 330 eine
Vielzahl von Ausführungs-Threads
an den Thread 0-Maschinenzustandsblock 310 und den Thread
1-Maschinenzustandsblock 312 zuzuführen. Die vereinheitlichte
externe Cache-Steuereinheit 322 und die Speicherschnittstelleneinheit
(MIU) 328 beinhalten eine Thread-Kennzeichnungsmarkierung (TID),
um eine Transaktion zu bezeichnen und zu identifizieren, auf die über den
externen Cache-Bus 324 und den UPA-Bus 326 zugegriffen
wird. In dem Prozessor 300 wird die TID nur intern von
dem Prozessor 300 (integrierter Schaltungschip) erfasst.
Außerhalb
des integrierten Schaltungschips interagiert die Hardware mit dem
Prozessor 300, so wie sie mit einer einzelnen CPU mit einem
UPA-Bus und einer externen Cache-Bus-Schnittstelle interagiert.
Im Gegensatz dazu interagiert die Software außerhalb des integrierten Schaltungschips
mit dem Prozessor 300, so wie sie mit zwei logischen CPUs
interagiert.
-
Der Befehlssteuerblock 330 enthält einen Befehls-Cache
(L1), eine Branch-Prediction-Einheit, NFRAM,
und einer Befehlsspeicher-Managementeinheit (IMMU), wobei alle von
den multiplen Threads, Thread 0 und Thread 1, gemeinsam benutzt werden.
In einem beispielhaften Prozessor ist der Befehls-Cache ein 16-Kilobyte-Zweiwege-Set-Associative-Cache
mit 32 Byte Blöcken.
Der Befehls-Cache ist physikalisch indiziert und physikalisch markiert. Der
Satz wird im voraus berechnet als ein Teil eines "nächsten Feldes",
so dass nur Index-Bits einer Adresse benötigt werden, um den Cache-Speicher zu
adressieren. Die Befehlsspeicher- Managementeinheit
(IMMU) unterstützt
die Adressumsetzung von virtuellen auf physikalische Adressen von Befehlsprogrammzählern (PCs).
Um die Bedingungszweige vorab auszulesen, wird eine dynamische Branch-Prediction
in Hardware implementiert, die auf einer Zwei-Bit-Geschichte eines
Zweiges basiert. Bei einem beispielhaften Prozessor ist ein als nächstes zu
besetzendes Feld mit jeweils vier Befehlen in dem Befehls-Cache
verbunden, der auf die nächste
vorab auszulesende Zeile zeigt. Bis zu zwölf Befehle werden in einem
Befehlspuffer abgespeichert und an die Pipeline ausgegeben.
-
Die externe Cache-Steuereinheit 322 verwaltet
den Befehls-Cache (L1) und die Datencache-Fehltreffer und erlaubt
bei jedem anderen Zyklus einen Zugriff auf den externen Cache. Speicheroperationen,
welche im Datencache fehlschlagen, werden durch multiple Bytedatencache-Eingaben
durch zwei aufeinanderfolgende Zugriffe auf den externen Cache geheilt.
Das Vorablesen von Befehlen, welche im Befehls-Cache einen Fehltreffer
erzielen, werden durch die multiplen Byte-Befehls-Cache-Eingaben geheilt,
die vier aufeinanderfolgende Zugriffe auf den paritätsgeschützten externen
Cache benutzen.
-
Die externe Cache-Steuereinheit 322 unterstützt die
DMA-Zugriffe auf den externen Cache und hält eine Datenkohärenz zwischen
dem externen Cache und dem Hauptspeicher (nicht dargestellt) aufrecht.
-
Die Speicherschnittstelleneinheit
(MIU) 328 steuert Transaktionen auf den UPA-Bus 326.
Der UPA-Bus 326 läuft
bei einem Bruchteil (zum Beispiel 1/3) des Prozessortaktes.
-
Mit Vorteil verbessert das vertikale
Multithreading die Prozessorleistung bei der Belastung bei herkömmlichen
Anwendungen, welche hohe Cache-Fehltrefferraten mit einer hohen
Fehltrefferstrafe, niedriger Prozessorauslastung (30% bis 50% von OLTP)
und Latenzperioden, welche eine Möglichkeit darstellen, um die
Ausführung überlappen
zu lassen, um die Cache-Fehltreffer-Wartezeiten zu nutzen.
-
Vertikales Multithreading ist auch
bei Anwendungen mit sequenziellen und parallelen Verarbeitungsanwendungen
mit häufigen
Kontextumschaltungen von Vorteil.
-
Vertikales Multithreading wirft in
Bezug auf einen Prozessor einige Kosten auf in Bezug auf die Ressourcen,
die benutzt werden, um die Thread-Zustände zu speichern und wiederherzustellen.
Die Kosten verändern
sich in Abhängigkeit
von der Implementierung der Multithreading-Ressourcen. Zum Beispiel
verursacht eine Software-Implementation typischerweise einen Zeitanstieg,
der jeden Gewinn an Latenz negiert. In einem anderen Beispiel können die Pipelinestufen
dupliziert werden, während
versucht wird, so viele Ressourcen wie nur möglich gemeinsam zu benutzen,
wobei dies als Nachteil zu hohen Kosten im Siliciumbe reich führt.
-
Eine vorteilhafte Technik zur Implementierung
von vertikalem Multithreading, die als ein Hochgeschwindigkeits-Multibit-Flip-Flop-Entwurf
bezeichnet wird, enthält
den Entwurf von Pipeline-Registern (Flops) mit multiplen Speicherbits.
Die einzelnen Bits eines Flip-Flops werden einem getrennten Thread zugeordnet.
Wenn ein erster Thread blockiert, typischerweise infolge eines Cache-Fehltreffers,
dann wird das aktive Bit eines Flip-Flops von dem Pipeline-Pfadweg
entfernt und ein anderes Bit des Flip-Flops wird aktiv. Die Zustände des
blokkiertes Threads werden in einem vorübergehend inaktiven Bit des
einzelnen Flip-Flops in einer Pipeline-Stufe aufbewahrt. Der Hochgeschwindigkeits-Multibit-Flip-Flop-Entwurf
setzt die Platzierung eines Multibit-Flip-Flops am Ende der einzelnen
Pipeline-Stufen ein. Die einzelnen Bits des Multibit-Flip-Flops
sind einzeln zugänglich
und steuerbar, um ein Umschalten von einem ersten Thread auf einen
zweiten Thread zu ermöglichen,
wenn der erste Thread blockiert.
-
Bezüglich 4A stellt ein schematisches Blockdiagramm
Steuer- und Speicherblöcke
einer Schaltung dar, die Hochgeschwindigkeits-Multibit-Flip-Flops
benutzt. Ein Multibit-Flip-Flop-Speicherblock 410 enthält einen
Speicherkopfblock 412 und einen Multibit-Flip-Flop-Block 414.
Der Speicherkopfblock 412 leitet Zeitsignale und Threadauswahlsignale
dem Multibit-Flip-Flop-Block 414 zu. Eingabesignale in
den Speicherkopfblock 412 enthalten ein Taktsignal 14clk,
das extern an den Multibit-Flip-Flop-Speicherblock 410 zugeführt wird,
ein kombiniertes Scanfreigabe- und Taktfreigabesignal se_ce_1 und
ein Thread-Identifikationssignal
(TID) tid_g, das dem Multibit-Flip-Flop-Speicherblock 410 extern
von der Thread-Auswahlschaltung zugeführt wird. Der Speicherkopfblock 412 leitet
ein internes Flip-Flop-Taktsignal clk, das Inverse des internen
Flip-Flop-Taktsignales clk_1 und ein Scan-Taktsignal sclk von dem externen Takt
14clk und dem Scanfreigabe- und dem Taktfreigabesignal se_ce_1 ab.
Der Speicherkopfblock 412 gibt ein internes Thread-ID-Signal
tid auf der Basis des Thread-Identifikations-Signals (TID) tid_g
aus. Der Speicherkopfblock 412 betreibt eine oder mehrere
Flip-Flop-Zellen in dem Multibit-Flip-Flop-Block 414. Typischerweise
enthält
der Multibit-Flip-Flop-Block 414 eine bis 32 bistabile
Multivibratorzellen, obwohl mehr Zellen benutzt werden könnten. Das
interne Flip-Flop-Taktsignal clk, das Inverse des internen Flip-Flop-Taktsignales
clk_1, das Scan-Taktsignal sclk und das interne Thread-ID-Signal tid werden
von dem Speicherkopfblock 412 an den Multibit-Flip-Flop-Block 414 zugeführt.
-
Zusätzlich zu dem internen Flip-Flop-Taktsignal
clk, dem Inversen des internen Flip- Flop-Taktsignales clk_1, des Scan-Taktsignales
sclk und dem internen Thread-ID-Signal tid empfängt der Multibit-Flip-Flop-Block 414 auch
ein Eingabesignal d und ein Scanketten-Eingabesignal si.
-
Bezüglich 4B zeigt ein schematisches Schaltungsdiagramm
eine multiple Bit bistabile Multivibrator (Flip-Flop)-Schaltung.
Ein herkömmliches Flip-Flop
ist eine Einzelbit-Speicherstruktur
und wird gewöhnlich
dazu benutzt, um zuverlässig
Daten abzutasten und zu speichern. Ein Flip-Flop ist typischerweise
eine grundlegende Komponente eines Halbleiterchips mit einem einzelnen
Phasentakt und einem bestimmenden Hauptfaktor der gesamten Taktgeschwindigkeit
eines Mikrocontrollers oder Mikroprozessors. Ein neues pulsbasiertes
Multibit-Hochgeschwindigkeits-Flip-Flop 400 wird benutzt,
um die Funktionalität
und die Leistung eines Prozessors zu beschleunigen.
-
Eine einzelne Zelle des puls-basierten
Multibit-Hochgeschwindigkeits-Flip-Flops 400 enthält eine Eingangsstufe
mit einer Gegentakt-Tortreiberstufe 402. Die Gegentakt-Tortreiberstufe 402 arbeitet
als eine Gegentaktschaltung, um Pulse mit einer kurzen Dauer über einen
Inverter 438 an eine Multibit-Speicherschaltung 428 und
eine Ausgangsleitung q auszugeben. Die Gegentakt-Tortreiberstufe 402 hat
vier MOSFETs, die in Serie in einem Source-Drain-Pfadweg zwischen
den VDD- und VCC-Referenzen verbunden sind, die einen p-Kanal-MOSFET 418,
einen p-Kanal-MOSFET 420, einen n-Kanal-MOSFET 422 und
einen n-Kanal-MOSFET 424 enthalten. Der p-Kanal-MOSFET 418 und
der n-Kanal-MOSFET 424 haben Gate-Anschlüsse, welche
mit dem Eingabesignal d verbunden sind. Der p-Kanal-MOSFET 420 hat
einen Source-Drain-Pfadweg, der zwischen dem p-Kanal-MOSFET 418 und
dem Knoten 426 liegt, und einen Gate-Anschluss, der mit
dem Inversen des internen Flip-Flop-Taktsignales
clk_1 verbunden ist. Der n-Kanal-MOSFET 422 hat einen Source-Drain-Pfadweg, der zwischen
dem Knoten 426 und dem n-Kanal MOSFET 424 liegt,
und einen Gate-Anschluss, der mit dem internen Flip-Flop-Taktsignal
clk verbunden ist. Wenn das inverse Taktsignal clk_1 und das Eingabesignal
d gleichzeitig einen Low-Zustand haben, dann wird der Knoten 426 durch den
p-Kanal MOSFET 418 und den p-Kanal 420 auf einen
High-Zustand gebracht.
Wenn das interne Flip-Flop-Taktsignal clk und das Eingabesignal
d gleichzeitig einen High-Zustand haben, dann wird der Knoten 426 durch
den n-Kanal-MOSFET 424 und den n-Kanal-MOSFET 422 auf
einen Low-Zustand gebracht. Entsprechend werden die Pulse mit der kurzen
Dauer durch den Betrieb des p-Kanal-MOSFETs 420 und des
n-Kanal-MOSFETs 422 erzeugt, welche
die abzutastenden Daten am Eingabeanschluss d an den Knoten 426 auf
Anweisung des Taktsignales clk weiterleiten. Wenn das interne Flip-Flop- Taktsignal clk ausgegeben
wird, dann hält der
Knoten 426 einen Wert, der das Inverse des Eingabesignals
d ist. Die treibenden Kräfte
der Transistoren 418, 420, 422 und 424 werden
für unterschiedliche
Funktionen während
unterschiedlicher Bedingungen, wie zum Beispiel Datenabtastung und
-weiterleitung, Thread-Umschaltung und Scanning, ausgewählt.
-
Die beispielhafte Multibit-Speicherschaltung 428 enthält zwei
Speicherzellen 430 und 440, obwohl andere Ausführungsbeispiele
eine einzelne Speicherzelle oder mehrere Speicherzellen enthalten können. Eine
Speicherzelle 430 oder 440 enthält einen
Umschalter 432 bzw. 442 und ein statisches Speicherelement
oder Latch 434 bzw. 444. Der Umschalter wird benutzt,
um ein bestimmtes Latch entsprechend dem Thread-Identifizierer (TID)
auszuwählen,
der während
einem Takt-Impuls mit einer kurzen Dauer aktiv ist. Wenn das interne Flip-Flop-Taktsignal clk ausgegeben
wird, dann wird das Inverse des Eingabesignales d durch die Speicherzelle 430 oder 440,
welche durch den Thread-Identifizierer (TID) ausgewählt wird,
abgespeichert. In dem beispielhaften System wird die Speicherzelle 430 abgespeichert,
wenn der TID-Wert 0 ist, so dass das Speicherelement 434 das
Inverse des Eingabesignales d speichert. Auf ähnliche Art und Weise wird
die Speicherzelle 440 abgespeichert, so dass der Wert des
Eingabesignales d gehalten wird, wenn der TID-Wert 1 ist. Andere
Ausführungsbeispiele
eines puls-basierten Multibit-Hochgeschwindigkeits-Flip-Flops 400 können benutzt
werden, welche zusätzliche
Speicherzellen enthalten, die zum Beispiel einen Multibit-TID und
eine Vielzahl von Umschaltern, Multiplexern oder anderen funktionell
gleichwertigen Schaltern benutzen, um zwischen den Speicherzellen
auszuwählen.
-
Die Multibit-Speicherschaltung 428 ist
mit dem Knoten 426 verbunden und ist folglich mit dem Datenpfad
von dem Knoten 426 zur Ausgabeleitung q verbunden, wird
aber nicht in den Datenpfad zwischen dem Knoten 426 und
der Ausgabeleitung q eingefügt.
Im Besonderen bildet eine einzige Leitung den Eingangsanschluss
und den Ausgangsanschluss zu den Speicherzellen 430 und 440,
so dass die Multibit-Speicherschaltung 428 keine Verzögerung zwischen
dem Knoten 426 und dem Inverter 438 erzeugt. Die
Verbindung der Multibit-Speicherschaltung 428 außerhalb
des Pfades des Datenflusses verhindert eine Verzögerung des Datensignales und erhöht damit
die Ausbreitungsrate der Datensignale. Die resultierende Verbesserung
der Datenübertragungsrate
erhöht
die verfügbare
Zeit zur Signalverarbeitung in einem Rechnersystem, was die Systemverarbeitungsgeschwindigkeit
verbessert. Im Gegensatz dazu enthält eine herkömmliche
Pipeline im Allgemeinen konventionelle Speicherelemente oder Latches,
die sich im Pfad des Datenflusses befinden und dadurch die Ausbreitung
eines Signales verlangsamen und die Zeit zur Signalverarbeitung
in einem Prozessor reduzieren, was zu einer Reduzierung der Prozessorverarbeitungsgeschwindigkeit
führt.
-
Der Puls mit der kurzen Dauer am
Knoten 426 aktiviert das statische Speicherelement oder
das Latch 434, 444, welches durch das TID-Signal
ausgewählt
wird. Die Latches 434 und 444 sind zum Abtasten
von Daten in einem schmalen Zeitfenster flankengetriggert und können zum
Betrieb mit sowohl positiven Flanken als auch negativen Flanken
der Pulssignale eingerichtet werden. Das Multibit-pulsbasierte Hochgeschwindigkeits-Flip-Flop 400 ist
mit den Busauswahlleitungen verbunden, um zu bestimmen, welches
Bit aus einer Vielzahl von Bits aktiv ist. Zu jeder Zeit ist nur
ein einziges Bit aktiv und das aktive Bit hält und treibt ein Ausgangssignal über den
Inverter 438 auf der Ausgangsleitung q. Wenn das aktive
Bit mit einem der inaktiven Bits umgeschaltet wird, dann ändert sich
das Ausgangssignal des Latches 434 oder 444 entsprechend.
-
Die Bits des pulsbasierten Hochgeschwindigkeits-Flip-Flops 400 können wahlweise
abtastbar hergestellt werden.
-
Bei einem Beispiel ist das Hochgeschwindigkeits-Flip-Flop 400 ein
Master-Slave-Flip-Flop,
welches ein Einzelbit-Master-Slave-Flip-Flop ersetzt. Andere Typen
von Flip-Flops,
die in der Elektronik bekannt sind, können in Multibit-Flip-Flops
zum Gebrauch in einem Multi-Thread-Prozessor konvertiert werden.
-
Bezüglich 4C stellt ein Zeitdiagramm den zeitlichen
Ablauf des Multibit-Flip-Flops 400 dar. Das
Takt- und das invertierte Taktsignal clk und clk_1 erzeugen einen
Taktimpuls 450, so dass Daten, die genau vor dem Taktübergang
oder der "Flanke" auf der Ausgabeleitung d vorhanden sind, den Ausgangszustand
auf der Leitung q bestimmen, nachdem sich der Takt verändert hat.
Das interne Flip-Flop-Taktsignal clk wird ausgegeben, um den Taktimpuls 450 zu
erzeugen, so dass der Knoten 426 einen Wert hält, der
das Inverse des Eingangssignales d ist. Während dem Taktimpuls 450 wird
das Inverse des Eingangssignales d in der Speicherzelle 430 oder
der Speicherzelle 440 abgespeichert, so wie dies durch
den Thread-Identifizierer (TID) bestimmt wird. Das Flip-Flop 400 tastet
das Signal in einem Fenster mit kurzer Zeitdauer ab, um eine Flankentriggerfunktion
zu erzeugen.
-
Wenn das interne Flip-Flop-Taktsignal
clk nicht mehr weiter ausgegeben wird, dann wird das Signal am Knoten 426 durch
die Speicherzellen 430 und 444 bestimmt, wobei
dies durch das TID-Steuersignal bestimmt wird. Nach einer geeigneten
Verzögerung,
die ausreichend ist, um das Abtastsignal am Knoten 426 im
Latch 434 oder 444 abzuspeichern, wird ein zweiter
Puls 452 an den Knoten 426 ausgegeben, durch den
Inverter 438 invertiert und auf die Ausgangsleitung q ausgegeben.
-
In dem beispielhaften pulsbasierten
Hochgeschwindigkeits-Flip-Flop 400 sind die Latches 434 und 444 mit
Vorteil von dem direkten Pfad der Signalübertragung entfernt und verschlechtern
somit die Signalgeschwindigkeit nicht. Das pulsbasierte Hochgeschwindigkeits-Flip-Flop 400 hat
keine Einstellzeit, aber eine relativ lange Haltezeit.
-
Im Gegensatz dazu enthält ein herkömmliches
Flip-Flop ein Speicherelement, das sich im Pfad des Datenflusses
befindet, die Signalausbreitung verlangsamt und die Zeitdauer verkürzt, die
zur Signalverarbeitung benötigt
wird und dadurch die Systembetriebsgeschwindigkeit reduziert. Das
beschriebene Flip-Flop 400 enthält ein Speicherelement, das sich
nicht im direkten Pfad der Signalausbreitung befindet und kein Hindernis
für die
Systembetriebsgeschwindigkeit darstellt.
-
Bezüglich 5 stellt ein schematisches Blockdiagramm
eine N-Bit-"Threadauswählbare"-Flip-Flop-Substitutionslogik 500 dar,
welche in manchen Multithreading-Systemen
und Verfahrenskonfigurationen benutzt wird. Ein Prozessor enthält eine
Implementierung von N-Bit-Flip-Flop-Gesamtsubstitutionen, um Multimaschinenzustände zu unterstützen. Der
Prozessorenentwurf enthält
eine logische Ersetzung der 1-Bit-Flip-Flops des blokkierten vertikalen
Threads bis zu N-Bit-Gesamt-Flip-Flops, wo N die Anzahl der vertikalen
Threads ist. Die Flip-Flop-Substitutionslogik 500 konvertiert
mit Vorteil die Einzelbit-Flip-Flop-Logik
in Multibit-Flip-Flop-Logik, ohne die Oberfläche der integrierten Schaltung
zu erhöhen,
wobei dieselbe Basisfläche
beibehalten wird, so dass die Größe der integrierten
Schaltung während
der Bildung von Multi-Thread-Datenpfaden gleich bleibt. Die Flip-Flop-Substitutionslogik 500 erzeugt
mit Vorteil die Multi-Thread-Pfade, ohne Multiplexer zu benutzen,
um zwischen den Threads umzuschalten. Die Verwendung von Multiplexern
würde die
integrierte Schaltungsfläche
vergrößern und
dadurch die inhärenten
Vorteile der Flip-Flop-Substitutionslogik 500 negieren.
-
Die N-Bit-"Thread-auswählbare"-Flip-Flop-Substitutionslogik 500 wird
benutzt, um eine vertikale multi-gethreadete Funktion in einer Prozessor-Pipeline
zu erzeugen, während
dieselbe Schaltungsgröße, einschließlich der
Fläche,
dem Stufenabstandsverhältnis
(aspect ratio), der metallischen Basisfläche und den Anschlussstellen
wie bei einer Einzelgethreadeten Pipeline beibehalten wird. Die
N-Bit-"Thread-auswählbare"-Flip-Flop-Substitutionslogik 500 fügt ein zusätzliches
Bit oder eine Vielzahl von zusätzlichen
Speicherbits in jedem 1-Bit-Flip-Flop hinzu, das zur Verarbeitung
der Pipeline-Blockierungen vorhanden ist. Die N-Bit-"Thread-auswählbare"-Flip-Flop-Substitutionslogik
500 wird durch ein Scan-Freigabe(SE)-Signal eines scanbaren Flip-Flops
aktiviert, um einen aktiven Thread aus zuwählen. Der Thread wird auf der Basis
eines Thread-Identifizierungssignales (TID) ausgewählt. Die
beispielhafte N-Bit-"Thread-auswählbare"
Flip-Flop-Substitutionslogik 500 stellt eine Zwei-Bit-Substitutionslogik
dar, die einen T0-Bit-Speicher 510 und einen T1-Bit-Speicher 512 zur
Speicherung von zwei auszuführenden
Threads enthält.
Die beispielhafte N-Bit-"Thread-auswählbare"
Flip-Flop-Substitutionslogik 500 ist ein einfaches D-Flip-Flop
mit einem Einzelbit-Thread-Identifizierer (TID), welcher den T1-Bit-Speicher 512 auswählt, und
dem inversen Signal des TID-Signales, welches den T0-Bit-Speicher 510 auswählt.
-
In einer Klasse von Prozessorentwürfen wird die
N-bit-"Thread-auswählbare"
Flip-Flop-Substitutionslogik 500 mit
Vorteil benutzt, um einen bestehenden Einzel-Thread-Prozessor auf eine
multi-gethreadete Konfiguration umzustellen. Entsprechend wird die
N-Bit-"Thread-auswählbare"
Flip-Flop-Substitutionslogik 500 benutzt, um die meisten
der Standard-1-Bit-Flip-Flops in einem Prozessor durch einen Spezialtyp
von Flip-Flop (FF) zu ersetzen, der multiple Zustands-Bits hat und
der Thread-auswählbar
ist. In einer besonderen Anwendung wird die N-Bit-"Thread-auswählbare"
Flip-Flop-Substitutionslogik 500 benutzt, um einen MegaSPARC-Multiple-Thread-Prozessor
ausgehend von einem bereits bestehenden Ultra-SPARC-II-Prozessor-Kernentwurf zu
implementieren.
-
Jedes Bit in der N-Bit-"Thread-auswählbaren"
Flip-Flop-Substitutionslogik 500 korrespondiert mit einem
einzelnen Maschinenzustand eines Threads und bildet eine sogenannte
"virtuelle CPU". Nur ein Bit ist gleichzeitig aktiv, so dass nur
eine aus einer Vielzahl von virtuellen CPUs die Pipeline zur gleichen
Zeit beansprucht. Wenn die aktive virtuelle CPU einen Datencache-
oder einen Befehls-Cache-Fehltreffer empfängt, dann sendet die virtuelle CPU
eine Eingabe-Anforderungen an einen externen Cache und initiiert
eine Thread-Umschaltung,
was einer anderen virtuellen CPU ermöglicht, aktiv zu werden.
-
Obwohl das erklärende Beispiel eine N-Bit-"Thread-auswählbare"
Flip-Flop-Substitutionslogik 500 darstellt,
wobei N gleich Zwei ist und die Prozessor-Implementierung zwei Threads
verarbeitet, kann jede geeignete Anzahl von Bits für die Anzahl
N, die auf den gewünschten
Berechnungsanwendungen basiert, als auch Verarbeitungsbetrachtungen
beim Erzeugen von Speicherstrukturen und Umschaltern in einer vorgegebenen
Schaltungsgröße, implementiert
werden.
-
In dem beispielhaften Prozessor ist
die N-Bit-"Thread-auswählbare"
Flip-Flop-Substitutionslogik 500 in
den meisten, aber nicht in allen Funktionskomponenten des Prozessors
implementiert. Die N-Bit-"Thread-auswählbare" Flip-Flop-Substitutionslogik 500 wird
für Flip-Flops
in funktionellen Komponenten einschließlich Steuer-/Status-Registern
und Pipeline-Stufenregistern implementiert. Andere Komponenten des
Prozessors einschließlich
der Prozessor-Back-End-Logik, wie zum Beispiel externe Cache- und
Speicherschnittstellen-Komponenten,
können
herkömmliche
Flip-Flops implementieren. Die Back-End-Logik, welche die Cache-Eingaben-Anforderungen
bearbeitet, wird von allen virtuellen CPUs gemeinsam benutzt, so
dass eine Multibit-Flip-Flop-Konversion nicht notwendig ist.
-
Die Eingabeanforderung für die virtuelle CPU,
die ersetzt wird, wird sogar dann verarbeitet, wenn die virtuelle
CPU inaktiv ist. Wenn auf die Dateneingabeanforderung Daten zurückgegeben
werden, dann werden die Daten vorübergehend gepuffert, um sie
später,
wenn der Thread wieder aktiv wird, in den L1-Cache einzugeben (entweder
den Datencache oder den Befehls-Cache). Bis die ersetzte virtuelle
CPU aktiv wird, setzt die gegenwärtig
aktive (ersetzende) virtuelle CPU ihre Verarbeitung fort, bis die
ersetzende virtuelle CPU auf einen Thread-Umschalter, wie zum Beispiel
einen L1-Cache-Fehltreffer, trifft. Beim Auftreten des Thread-Umschaltsignales,
welches die ersetzende virtuelle CPU beendet, schaltet der Prozessor
auf eine andere virtuelle CPU um, die nicht blockiert ist (möglichst
die zuerst ersetzte virtuelle CPU). Wenn alle virtuellen CPUs blockiert sind
und auf Cache-Fehltreffer warten, ist die Pipeline frei und blockiert,
bis Daten von wenigstens einer virtuellen CPU zurückgegeben
werden.
-
Bei Fehltreffern bei einer Befehlsaufnahme behandelt
die Back-End-Logik die Eingabe in den Instruktions-Cache einer nicht-aktiven
virtuellen CPU auf eine ähnliche
Art und Weise. Um eine falsch eingestellte Thread-Umschaltung zu
vermeiden, wird eine virtuelle CPU nicht ersetzt, bis der Instruktions-Cache-Fehltreffer
eine Leerbedingung des Instruktionspuffers bewirkt.
-
In manchen vertikalen Multithreading-Prozessor-Entwürfen wird
das vertikale Multithreading mit Vorteil implementiert, indem eine
schnelle, zum Beispiel von der Dauer von Nanosekunden, Umschaltung
des Kontextes verwendet wird, welche die Leistung von sequenziellen
und parallelen Verarbeitungsanwendungen verbessert, welche häufigen Kontext-Umschaltungen unterworfen
sind. Die schnelle im Nanosekundenbereich liegende Umschaltung des
Kontextes oder des Threads ist von Vorteil im Vergleich zu herkömmlichen
Kontextumschaltungstechniken, welche im Allgemeinen in einem Zeitbereich
in der Größenordnung
von Mikrosekunden bis Millisekunden ablaufen, welche um einige Größenordnungen
langsamer sind als die hier beschriebene Kontext-Umschaltung. Die
schnelle im Nanosekundenbereich liegende Kontext-Umschaltung wird
durch die Fähigkeit
des Einfrierens der Pipeline und durch das Weiterleiten von multiplen Daten-Threads
durch eine multiple gethreadete Struktur erreicht, welche gleichzeitig
Daten von multiplen Threads zum Beispiel durch den Einsatz von multiplen
Bit-Flip-Flops abspeichert. Daten eines aktiven Threads bringen
die abgespeicherten Daten auf den neuesten Stand, während Daten
in nicht-aktiven Threads eingefroren bleiben. Das Umschalten geschieht,
indem die Thread-Pfadwege zwischen den Zuständen, wo die Daten auf den
neuesten Stand gebracht werden, und den Zuständen, wo die Daten eingefroren
bleiben, umgeschalten werden. Im Gegensatz dazu erfordert das herkömmliche
Umschalten des Kontexts das Entleeren der gesamten Pipeline und
das Abspeichern der Daten von den Registerdateien eines ersten Threads
in einem Speicher und das Wiederherstellen von Daten eines zweiten Threads
von einem Speicher in den Registerdateien. Dies alles sind sehr
zeitaufwändige
Ausführungen.
-
In manchen Anwendungen wird der Kontext typischerweise
als Reaktion auf die Interrupts umgeschalten, wobei Hardware- und
Software-Interrupts enthalten sind, wobei dies sowohl intern als
auch extern eines Prozessors geschieht. Anwendungen zur Berechnung,
welche häufigen
Kontext-Umschaltungen unterliegen, enthalten Disk-Server, Network-Server,
Web-Server, Telekommunikations-Anwendungen und dergleichen.
-
In einem beispielhaften System ist
der schnelle im Nanosekundenbereich liegende Kontext-Umschalter
in Hardware implementiert, wobei er mit Vorteil einen Überhang
von Software während dem
Abspeichern und Wiederherstellen des Prozessorzustandes eliminiert.
Bezüglich 6 stellt ein schematisches
Blockdiagramm eine Thread-Umschaltlogik 610 dar, welche
ein Thread-Identifikationssignal (TID) erzeugt, welches einen aktiven Thread
unter einer Vielzahl von Threads identifiziert.
-
Ein Prozessor enthält die Thread-Umschaltlogik 610,
um eine sehr schnelle Ausnahmeverarbeitungsfunktion zu erreichen,
während
er nicht-gethreadete Programme ausführt, indem er einen Typ einer
multi-gethreadeten Funktion als Reaktion auf die Ausnahmebedingungen
aufruft. Während
der Bearbeitung der multi-gethreadeten Bedingungen oder während der
Ausführung
der nicht-gethreadeten Programme durchläuft der Prozessor während der
Ausführung
die multiplen Maschinenzustände.
Die sehr schnelle Ausführungs-Behandlungs-Logik enthält eine
Verbindung einer Ausnahmesignalleitung zu der Thread-Auswahl-Logik,
welche ein Ausnahmesignal oder eine Falle enthält, um einen Umschalter in
den Thread- und Maschinenzustand zu bringen. Der Umschalter im Thread-
und Maschinenzustand bewirkt, dass der Prozessor sofort in die Ausnahmeverarbeitungsroutine
eintritt und diese wieder verlässt,
ohne typischerweise das Betriebssystem oder eine Software-Abarbeitung
und ohne die inhärente
Zeitstrafe der Betriebssystems-Software aufzurufen, welche die Register
abspeichert und wiederherstellt. Die Verbindung der Ausführungsleitung
direkt zu der Thread-Auswahl-Logik
bewirkt mit Vorteil eine Ausnahmebedingung, um einen Kontext oder
einen Thread-Umschalter
aufzurufen, was die Software- oder Systemüberhangsstrafe bemerkenswert
reduziert.
-
Der Gebrauch der multi-gethreadeten
Multi-Prozessor-Konfiguration in Kombination mit der Thread-Umschaltlogik 610 und
dem Einsatz von verschiedenen Compiler-Techniken beschleunigt die Ausführung von
sequenziellen Programmen. Zum Beispiel kann ein Compiler optimiert
werden, dass er automatisch spekulative parallele Threads in sequenziellen,
nicht-numerischen Programmen erzeugt. Der Compiler kann auch dahingehend
optimiert werden, dass er die Ladeinstruktionen spekulativ vor Speicherinstruktionen
verschiebt und die Lade- und Speicherinstruktionen in getrennten
parallelen Threads ausführt.
-
In einem anderen Beispiel kann der
Compiler so gesteuert werden, dass er spekulative parallele Threads
(Epochen) bei Schleifendurchläufen
mit spekulativer Ausführung
startet, in welchen die Branch-Bedingungen vorhergesagt werden.
Bei einer unsicheren Spekulation kann der Compiler die Ausführung steuern,
um eine Vielzahl von Threads auszuführen, um alle möglichen
Branch-Bedingungen zu behandeln und um die Ergebnisse von dem Thread
der richtigen Branch auszuwählen.
In manchen Prozessor-Implementierungen werden zwei zusätzliche
Bits den Leitungen des L1-Datencaches hinzugefügt, um eine Angabe abzuspeichern,
ob Daten in der Leitung spekulativ geladen oder spekulativ abgespeichert
sind, so dass nicht-spekulative Ergebnisse schnell ausgeschieden
werden.
-
Sequenzielle Programme werden auch
effizienter durch die Erweiterung eines Invalidations-basierten
Cache-Kohärenz-Protokolls,
um die Epochenzahlen einer Speicher-Snoop-Trefferbedingung mit einer spekulativ
geladenen Cache-Leitung zu vergleichen.
-
Die schnelle im Nanosekundenbereich
liegende Kontext-Umschaltung arbeitet in Verbindung mit der Thread-Umschaltlogik,
wie zum Beispiel das pulsbasierte Hochgeschwindigkeits-Flip-Flop 400, um
die Geschwindigkeit des Umschaltens des Threads zu verbessern. Das
pulsbasierte Hochgeschwindigkeits-Flip-Flop 400 ermöglicht das
virtuelle sofortige Umschalten zwischen den Threads, dem Abspeichern
des Maschinenzustandes eines blockierten Threads, und dem Wiederherstellen
eines Maschinenzustandes eines aktivierten Threads. Die schnelle
im Nanosekundenbereich liegende Kontext-Umschaltung steuert schnell
durch das pulsbasierte Hochgeschwindigkeits-Flip-Flop 400,
welcher Thread-aktiviert ist. Die Thread-Umschaltlogik 610 empfängt eine
Vielzahl von Eingabesignalen, die einen Kontext-Umschalter und einen Thread-Umschalter
aufrufen. In einem beispielhaften Prozessor enthal ten die Eingabekontakte
der Thread-Umschaltlogik 610 einen L1 Lade_Fehleranschluss,
einen L1_Instruktions Fehleranschluss, einen Instruktions_Puffer_Leeranschluss,
einen Thread_Prioritätsanschluss,
einen MT_Modusanschluss, einen externen_Interrupt-Anschluss und
einen internen_Interrupt-Anschluss. Die Thread-Umschaltlogik 610 erzeugt
auf der Basis von Signalen der Eingabeanschlüsse ein Thread-Identifikationssignal
(TID). Die Thread-Umschaltlogik 610 erzeugt
das TID-Signal mit einer Thread-Umschaltverzögerung oder einem Überhang
eines Prozessor-Zyklusses.
-
Andere Prozessoren können andere
Signale enthalten, welche ein Thread-Umschaltsignal (TID) erzeugen. Zum Beispiel
können
manche Prozessoren so konfiguriert werden, dass sie Threads bei
einem L2-Cache-Fehltreffer umschalten.
-
Die Thread-Umschaltlogik 610 erzeugt
Signale, um es dem Prozessor zu ermöglichen, den Kontext auf einen
anderen Thread umzuschalten, wobei dies als Reaktion auf einen L1-Cache-Lade-Fehltreffer
geschieht, welche einen Impuls auf den L1 Lade Fehltrefferanschluss
abgibt und als Reaktion auf einen L1-Cache-Lade-Fehltreffer, welcher einen
Impuls auf den L1_Instruktions Fehltrefferanschluss abgibt. Die
Thread-Umschaltlogik 610 erzeugt auch Signale, die es dem
Prozessor erlauben, den Kontext auf einen anderen Thread umzuschalten,
wenn ein Instruktionspuffer leer ist und um ein Signal für den Instruktions_Puffer_Leeranschluss
zu erzeugen. Die Thread-Umschaltlogik 610 schaltet auch
den Kontext als Reaktion auf externe und interne Interrupts um,
welche einen Impuls auf den externen_Interruptanschluss und den internen_Interruptanschluss
jeweils abgeben.
-
Die Thread-Umschaltlogik 610 erlaubt über die
Signale zu dem Thread_Prioritätsanschluss
die Steuerung der Thread-Auswahl auf der Basis der Priorität eines
besonderen Threads. Die Thread-Umschaltlogik 610 wird typischerweise
als ein Steuerprozessor, ein Mikrocontroller, eine Mikrocode-Steuerlogik,
eine logische Schaltung oder dergleichen implementiert, wobei alle
in der Elektronik wohlbekannt sind. Entsprechend kann ein schnelles
Umschalten des Threads beim Auftreten eines L1-Cache-Fehltreffers
ausgewählt
werden.
-
In anderen Anwendungen kann auf der
Basis, welcher Prozess oder Kontext am meisten beschäftigt ist,
ausgewählt
werden welcher Thread reserviert wird. Bei diesen Anwendungen implementiert die
Thread-Umschaltlogik 610 ein Thread-Reservierungssystem
oder ein Thread-Verriegelungssystem, in welchem ein Thread-Pfadweg
für den
Einsatz durch einen ausgewählten
Thread reserviert ist. Die Thread-Auswahllogik 610 kann
einen besonderen Thread auswählen,
der im Vergleich zu anderen Threads mit Priorität auszuführen ist. Ein Thread mit hoher
Priorität
kann mit einem Betrieb mit strikten Zeitvorgaben verbunden werden,
oder mit einem Betrieb, der im Vergleich zu anderen Threads häufig und überwiegend
ausgeführt
wird. Die Thread-Umschaltlogik 610 steuert den Thread-Umschaltbetrieb, so
dass ein besonderer Hardware-Thread für den Gebrauch durch den ausgewählten Thread
reserviert wird.
-
In einem Beispiel eines Prioritätsbetriebes enthält ein JAVATM-Server typischerweise einen Masterprozess
und eine Vielzahl von Slaveprozessen. Die Thread-Umschaltlogik 610 reserviert
einen Hardware-Thread für
den Masterprozess, der bestimmt, welchem Slaveprozess es erlaubt
wird, jederzeit ausgeführt
zu werden. Der Masterprozess wird deshalb als ein reservierter Thread
ausgewählt,
der einen bestimmten reservierten Hardware-Thread reserviert und
folglich in dem reservierten Hardware-Thread verriegelt ist. Der
Masterprozess führt
die Ausführung
in dem reservierten Hardware-Thread durch, aber ordnet nicht-reservierte
Hardware-Threads unter der Vielzahl der Slave-Threads zu.
-
In anderen Anwendungen kann die Thread-Umschaltlogik 610 so
konfiguriert sein, dass sie native Threads in einem Betriebssystem
unterstützt,
zum Beispiel Solaris-native Threads können in Java-Anwendungen unterstützt werden.
-
Die Thread-Umschaltlogik 610 enthält einen MT_Modusanschluss,
welcher Multithreading-Modussignale zur Verfügung stellt, um besondere Threads
für die
Multiprozessor-Ausführung auszuwählen.
-
Die Thread-Umschaltlogik 610 unterstützt eine
schnelle Thread-Umschaltung mit einer sehr kleinen Zeitverzögerung,
zum Beispiel drei Zyklen oder weniger. In Multithreading-Systemen und Verfahrensausführungsbeispielen
führt ein
Prozessor eine schnelle Thread-Umschaltung
als Reaktion auf eine L1-Cache-Fehltrefferblockierung durch.
-
Bei anderen Implementierungen implementiert
die Thread-Umschaltlogik 610 eine oder mehrere Thread-Umschaltverfahren.
Ein erster Thread-Umschaltbetrieb ist sich der Thread-Umschaltung
bei allen N Zyklen, in welchen die einzelnen Flip-Flops lokal eine
Thread-Umschaltung bestimmen, ohne eine Blockierung anzugeben, "bewusst".
Diese bewusste Technik, die typischerweise implementiert wird, indem
ein einzelner Zähler
zum Zählen
der Zyklen zwischen den Umschaltungen benutzt wird, vermeidet den
Gebrauch einer zusätzlichen
globalen Verbindung, wie zum Beispiel ein Draht oder Metall, zwischen
den Threads zur Thread-Auswahl.
-
Ein zweiter Thread-Umschaltbetrieb
ist eine "semi-bewusste" Thread-Umschaltung für die Benutzung mit einem Lade-Benutzungsblockierungs-
oder "Pipeline-Blockierungs"- Signal.
Das Pipeline-Blockierungssignal hat zwei Aufgaben, erstens als eine Angabe
einer Pipeline-Blockierung und zweitens als ein Thread-Auswahlsignal
zwischen den Threads, so dass wieder der Gebrauch einer zusätzlichen
globalen Verbindung zwischen den Threads zur Thread-Auswahl vermieden
wird. Eine geeignete Implementierung der semi-bewussten Thread-Umschalttechnik
benutzt eine Verbindung mit einem Lade-/Speichereinheit-globalen
Blockierungssignal (lsu_stall_e) in UltraSPARC-I und UltraSPARC-II-Prozessoren.
-
Ein dritter Thread-Umschaltbetrieb
ist eine "intelligente globale Zeitplan"-Thread-Umschaltung, in welcher eine Thread-Umschaltentscheidung
wahlweise auf der Basis eines oder mehrerer Signale programmiert
ist. Bei einem Beispiel benutzt ein intelligenter globaler Zeitplan
Signale, wie zum Beispiel: (1) ein L1-Datencache-Fehltreffer-Blockierungssignal,
(2) ein L1-Lade-Fehltreffersignal (3), ein Instruktionspuffer-Leersignal,
(4) ein Befehlsschlangen-Leersignal,
(5) ein L2-Cache-Fehltreffersignal, (6) ein Thread-Prioritätssignal,
(7) ein Thread-Zeitgebersignal,
(8) ein Interruptsignal oder andere Quellen zur Triggerung. In manchen
Ausführungsbeispielen wird
das Thread-Auswahlsignal so schnell wie möglich ausgesendet, was ähnlich zu
einer Taktbaumverteilung ist. In manchen Systemen leitet ein Prozessor ein
Thread-Auswahlsignal ab, welches an die Flip-Flops angelegt wird,
indem ein Scanfreigabesignal (SE) eines scanbaren Flip-Flops überlastet
wird.
-
Verschiedene Implementierungen von
Prozessoren enthalten eine Thread-Umschaltlogik 610, die einen
Cache in einem Prozessor in eine Vielzahl von N Cache-Teilen aufteilt.
Bezüglich 7A zeigt ein schematisches
Blockdiagramm ein Beispiel eines Caches 700, der in einen
ersten aufgeteilten Cache-Abschnitt 710 und einen zweiten
aufgeteilten Cache-Abschnitt 712 aufgeteilt wird, wobei
jeder Abschnitt eine Vielzahl von Speicherbereichen enthält. In einem
Beispiel teilen der erste aufgeteilte Cache-Abschnitt 710 und
der zweite aufgeteilte Cache-Abschnitt 712 jeweils mit
einer Kapazität
von 8 kB einen 16 kB direct-mapped-32-Byte-Line-Cache auf. Obwohl
das erklärende
Beispiel den Cache 700 zeigt, in dem dieser in zwei gleich
große
Abschnitte aufgeteilt ist, können
andere Beispiele einen Cache in jede beliebige Anzahl von Abschnitten
aufteilen. Die Cache-Abschnitte können gleich oder unterschiedlich
groß sein.
Bezüglich 7B zeigt ein Diagramm ein
Beispiel einer Adressierungstechnik für den aufgeteilten Cache 700.
Ein 64-Bit-virtueller Adressspeicher 720 enthält ein Cache-virtuelles Adressmarkierungs-Bitfeld 722 mit
virtuellen Adressbits [63 : 13], ein Thread-ID(TID)- und Index-Bitfeld 724 mit
Index-Bits [12 : 5] und ein Byte-Offset-Bitfeld 726 mit
virtuellen Adressbits [4 : 0]. Die Index-Bitfelder 724 teilen
den Cache in zwei Thread-Abschnitte, nämlich den ersten thread-aufgeteilten
Cache-Abschnitt 710 und den zweiten Thread-aufgeteilten
Cache-Abschnitt 712 auf.
-
Die Cache-Aufteilung wird wahlweise
in einem einzelnen Cache oder einer Vielzahl von Caches angewandt,
die L1-Caches, L2-Caches, externe Caches und dergleichen enthalten.
Die Cache-Aufteilung vermeidet eine Interferenz, "Übersprechen" oder
"Verunreinigung" zwischen den Threads. Eine Technik zur Cache-Aufteilung
benutzt eine Logik zum Abspeichern und zum Mitteilen von Thread-Identifizierungs-Bits
(TID). Der Cache nutzt eine Cache-Indizierungslogik. Zum Beispiel können die
TID-Bits beim Bit mit der höchsten
Wertigkeit des Cache-Indexes eingefügt werden. Das gemeinsame Benutzen eines
L2-Caches unter den Threads wird einfach implementiert, da der L2-Cache
physikalisch indiziert ist.
-
Verschiedene Prozessor-Implementierungen
enthalten eine Anti-Aliasing-Logik, die in 8 dargestellt ist, die mit einem Cache 810,
wie zum Beispiel einem L1-Cache und L2-Cache oder anderen verbunden ist. Zum
Beispiel kann ein Prozessor eine Anti-Aliasing-Logik enthalten,
die mit einem L1-Cache verbunden ist, so dass der L1-Cache über das Anti-Aliasing gemeinsam
von den Threads benutzt wird. In einem erklärenden Beispiel ist der Cache
ein 16 kB direct-mapped-virtuell-indizierter physikalisch markierter
(VIPT) Cache 810, welcher von den Threads gemeinsam benutzt
wird. Der Cache 810 wird unter Benutzung eines 64-Bit-virtuellen
Adressspeichers 820, welcher ein Cache-virtuelles Adress-Markierungsbitfeld 822,
einen Cache-Index 812 und ein Byte-Offset-Bitfeld 826 enthält, adressiert.
Der Cache-Index 812 ist so konfiguriert, dass er eine Thread-ID
(TID) 823 und ein Index-Bitfeld 824 enthält.
-
Die Anti-Aliasing-Logik speichert
die Daten von zwei unterschiedlichen Threads, welche sich auf zwei
unterschiedlich indizierte Einträge
n und n + 256 beziehen, auf dieselbe physikalische Adresse (PA) ab,
die als PA = B dargestellt ist. Die Anti-Aliasing-Logik arbeitet
während
einer Abspeicherung auf den Cache-Speicher 810 durch das
Vergleichen der physikalischen Adresse an den zwei indizierten Einträgen. Wenn
die physikalischen Adressen übereinstimmen,
dann wird der duplizierte Eintrag entweder für ungültig erklärt oder auf den neuesten Stand
gebracht. Die Anti-Aliasing-Logik vermeidet Probleme, welche vom
multivirtuellen Adress-Mapping auf eine physikalische Adresse resultieren.
Die Anti-Aliasing-Logik
erklärt
wahlweise die duplizierten L1-Cache-Einträge für ungültig oder bringt diese auf
den neuesten Stand.
-
Verschiedene Prozessor-Implementierungen
enthalten eine native Thread-Logik, welche mit der Thread-Umschaltlogik 610 und
der Anti-Aliasing-Logik verbunden ist, welche Leichtgewichtsprozesse
und native Threads unterstützt.
Die Logikunterstützungs-nativen Threads
und die Leichtgewichtsprozesse enthalten eine Logik, die das Thread-ID
markieren und die Cache-Aufteilung außer Kraft setzen, da die Leichtgewichtsprozesse
und die nativen Threads den gemeinsamen virtuellen Adressraum teilen.
Ein Leichtgewichtsprozess ist ein vereinfachter minimaler Kontextprozess
oder Thread, der typischerweise entworfen wurde, um effizient Kernel-Funktionen
auszuführen.
Der Leichtgewichtsprozess hat sehr wenig Kontext, und somit kann
die Ausführung
einfach und effektiv ein- und ausgeschalten werden. Der Leichtgewichtsprozess führt folglich
seine Aufgaben effizient ohne Thread-ID-Markierung und Cache-Aufteilung durch. Die
Thread-Umschaltlogik 610 beherbergt Leichtgewichtsprozesse,
indem die Thread-ID-Markierung und die Cache-Aufteilung außer Kraft
gesetzt wird, was mit Vorteil die Zuordnung von Cache und anderen
Ressourcen zu Threads, welche diese Ressourcen nicht nutzen, vermeidet.
-
Bezüglich 9 stellt ein schematisches funktionelles
Blockdiagramm eine Entwurfskonfiguration für einen Einzelchip-Dualprozessor-vertikal-gethreadeten
Prozessor 900 dar, der zur Implementierung verschiedener
Multithreading-Techniken und Systemimplementierungen geeignet ist,
welche die Multithreading-Leistung und Funktion verbessern. Der
Einzelprozessor-vertikal-gethreadete Prozessor 300, der
in 3 dargestellt ist,
führt alleine ein
vertikales Multithreading durch. Im Gegensatz dazu führt der
Einzelchip-Dualprozessorvertikal-gethreadete Prozessor 900 sowohl
ein horizontales Multithreading als auch ein vertikales Multithreading durch.
Der enzelchip-dualprozessor-vertikal-gethreadete Prozessor 900 hat
zwei Prozessoren auf einem einzelnen Chip, der einen ersten vertikal-multigethreadeten
Prozessor 902 und einen zweiten vertikal-multigethreadeten
Prozessor 904 enthält.
-
Der erste Multithreading-Prozessor 902 enthält einen
Thread 0-Maschinenzustandsblock 910, der
einen Maschinenzustand aus einem ersten Thread (Thread 0) bildet,
und einen Thread 1-Maschinenzustandsblock 912, der einen
Maschinenzustand aus einem zweiten Thread (Thread 1) bildet, welcher
den Maschinenzustand von Thread 0 wiedergibt. Der Thread-0-Maschinenzustandsblock 910 und
der Thread-1-Maschinenzustandsblock 912 haben
die einzeln integrierte Schaltungslogikstruktur, die einen Hochgeschwindigkeits-Multibit-Flip-Flop-Entwurf
und eine vierdimensionale Registerdatenstrukturen benutzt, und Versorgungsbefehle
von Thread 0 und Thread 1 für
eine gemeinsam benutzte Prozessor-Pipeline 904, welche
vertikales Threading nutzt. Die gemeinsam benutzte Prozessor-Pipeline 914 ist
mit einer dualen Lade-/Speichereinheit verbunden, die eine Thread
0-Lade-/Speichereinheit 916 und eine Thread 1-Lade-/Speichereinheit 918 enthält, die
Lade- und Speicherdatenzugriffe für die Instruktionsthreads
0 und 1 jeweils ausführt.
-
Die gemeinsam benutzte Prozessor-Pipeline 914 und
die duale Lade-/Speichereinheit sind mit einem gemeinsam benutzten
Datencache und einer gemeinsam benutzten Datenspeicher-Verwaltungseinheit
(DMMU) verbunden. Der gemeinsam benutzte Datencache wird benutzt,
um Daten für
Berechnungen von sowohl Thread 0 als auch Thread 1 abzuspeichern.
-
Der zweite vertikale Multithreading-Prozessor 904 enthält einen
Thread 2-Maschinenzustandsblock 940,
welcher einen Maschinenzustand eines dritten Threads (Thread 2)
und eines Thread 3-Maschinenzustandsblocks 942 bildet,
der einen Maschinenzustand eines vierten Threads (Thread 3) bildet, der
den Maschinenzustand von Thread 2 nachbildet. Der Thread 2-Maschinenzustandsblock 940 und
der Thread 3-Maschinenzustandsblock 942 haben einzeln integrierte
Schaltungslogikstrukturen, welche Hochgeschwindigkeits-Multibit-Flip-Flop-Entwürfe und
vierdimensionale Registerdatenstrukturen nutzen, und Versorgungsbefehle
von Thread 2 und Thread 3 an eine gemeinsam benutzte Prozessor-Pipeline 944,
die vertikales Threading nutzt. Die gemeinsam benutzte Prozessor-Pipeline 944 ist
mit einer dualen Lade-/Speichereinheit verbunden, die eine Thread
2-Lade-/Speichereinheit 946 und eine Thread 3-Lade-/Speichereinheit 948 enthält, die
jeweils Lade- und Speicherdatenzugriffe für die Befehls-Threads 0 bzw.
1 ausführt.
-
Die gemeinsam benutzte Prozessor-Pipeline 944 und
die duale Lade-/Speichereinheit sind mit einem gemeinsam benutzten
Datencache und einer gemeinsam benutzten Datenspeicher-Managementeinheit
(DMMU) verbunden. Der gemeinsam benutzte Datencache wird benutzt,
um Daten für
die Berechnung von sowohl Thread 2 als auch Thread 3 abzuspeichern.
-
Ein Befehlssteuerblock 960 enthält einen
Befehls-Cache (L1), eine Branch-Prediction-Einheit NFRAM und eine Befehlsspeicher-Managementeinheit
(IMMU), von denen alle von den multiplen Threads, Thread 2 und Thread
3, gemeinsam benutzt werden.
-
Die zwei dualen Lade-/Speichereinheiten sind
auch mit einer externen Cache-Steuereinheit (ECU) 922 verbunden,
die mit einem externen Cache-Bus 924 verbunden ist. Die
externe Cache-Steuereinheit 922 ist auch über eine
Speicherschnittstelleneinheit (MIU) 928 mit einem Ultraportarchitektur-Verbindungs-(UPA)-Bus
926 verbunden. Die externe Cache-Steuereinheit 922 und
die Speicherschnittstelleneinheit (MIU) 928 sind zwischen
den vier Threads, Thread 0, Thread 1, Thread 2 und Thread 3, einheitlich,
um die Funktionen der Cache-Fehltrefferverarbeitung und der Verbindung
mit externen Geräten
durchzuführen,
um in Kombination, über
gemeinsam benutzte Befehlssteuerblöcke 930 und 960 eine
Vielzahl von Execution-Threads dem Thread 0-Maschinenzustandsblock 910,
dem Thread 1-Maschinenzustandsblock 912,
dem Thread 2-Maschinenzustandsblock 940 und dem Thread 3-Maschinenzustandsblock 942 zuzuführen. Die
einheitliche externe Cache-Steuereinheit 922 und die Speicherschnittstelleneinheit
(MIU) 928 enthalten eine Thread-Identifizierungs-(TID)-Markierung um den Thread,
auf den über
den externen Cache-Bus und den UPA-Bus 926 zugegriffen
werden soll, zu spezifizieren und zu identifizieren.
-
Die einheitliche externe Cache-Steuereinheit 922 und
die Speicherschnittstelleneinheit (MIU) 928 führen die
Verarbeitung von Cache-Fehltreffern und die Verbindung mit externen
Geräten
durch. Die Verarbeitung eines Fehltreffers für einen Thread (eine virtuelle
CPU) findet dann statt, wenn der Thread nicht aktiv ist. Zusätzlich wird
die Multiverarbeitung vereinfacht, wenn ein Multithread-Prozessor
in der Art und Weise eines Einzelprozessors mit einem externen Gerät arbeitet.
Deshalb werden in manchen Prozessoren die einheitliche externe Cache-Steuereinheit 922 und
die Speicherschnittstelleneinheit (MIU) 928 als Strukturen
gemeinsam mit logischen Verbesserungen benutzt, um die multiplen
Threads zu unterstützen,
die aber nicht die Flip-Flops nutzen, um die ECU- und MIU-Funktion
für jeden
Thread zu duplizieren.
-
Die externen Cache-Bus 924 Schnittstellen und
die UPA-Bus 926 Schnittstelle werden gemeinsam zwischen
den Threads unter Benutzung eines Einzelanschluss-Identifizierers
benutzt.
-
Die externe Cache-Steuereinheit 922 verwaltet
die Befehls-Cache-(L1) und Datencache-Fehltreffer in sowohl dem
ersten vertikalen Multithreading-Prozessor 902 als auch
dem zweiten vertikalen Multithreading-Prozessor 904 und
erlaubt pro Zyklus bis zu einem Zugriff auf den externen Cache.
Die externe Cache-Steuereinheit 922 unterstützt den DMA-Zugriff,
welcher einen Treffer beim externen Cache erzielte, und hält die Datenkohärenz zwischen dem
externen Cache und dem Hauptspeicher (nicht dargestellt) aufrecht.
Die Speicherschnittstelleneinheit (MIU) 928 steuert die
Transaktionen zu dem UPA-Bus 926.
-
Der einzelchip-dualprozessor-vertikal-gethreadete
Prozessor 900 enthält
auch einen On-Chip-L2-Cache-Markierungs-RAM 938, um einen externen
Zweiwege-L2-Cache zu unterstützen.
-
Der einzelchip-dualprozessor-vertikal-
gethreadete Prozessor 900 reduziert die verschwendete Zykluszeit,
welche vom Stalling und Leerlaufen resultiert, und erhöht das Verhältnis an
Ausführungszeit, indem
er sowohl das vertikale Multithreading als auch das horizontale
Multithreading unterstützt
und implementiert. Das vertikale Multithreading erlaubt ein Überlappen
oder "Verstecken" von Cache-Fehltreffer-Wartezeiten. Beim vertikalen
Multithreading teilen sich die multiplen Hardware-Threads dieselbe
Prozessor-Pipeline. Ein Hard ware-Thread ist typischerweise ein Prozess,
ein Leichtgewichtsprozess, ein nativer Thread oder dergleichen in
einem Betriebssystem, welches Multithreading unterstützt, wie
zum Beispiel ein Solaris UNIX-Betriebssystem. Horizontales Multithreading
wird erreicht, indem eine Vielzahl von Pipelines benutzt wird und
die Parallelität
innerhalb der Prozessorschaltungsstruktur erhöht wird. Der einzelchip-dualprozessor-vertikal-gethreadete Prozessor 900 weist
das vertikale Multithreading innerhalb eines einzelnen integrierten
Schaltungsdies auf, das einen Einzel-Chip-Prozessor bildet. Für eine weitere
Erhöhung
der Systemparallelität
nutzt der einzelchip-dualprozessor-vertikal-gethreadete Prozessor 900 das
horizontale Multithreading, welches Multiprozessorenkerne nutzt,
die in einem einzigen Die gebildet werden. Fortschritte beim On-Chip-Multiprozessor-Horizontal-Threading
werden erreicht, sowie die Prozessorkerngrößen durch den technologischen
Fortschritt reduziert werden.
-
Der beispielhafte Prozessor 900 und
andere multi-gethreadeten Prozessoren, die hier beschrieben werden,
benutzten Thread-Level-Parallelitäten und arbeiten mit multiunabhängigen Threads,
erreichen dabei möglichst
einen multiplikativen Leistungsfaktor eines Prozessors mit denselben
Ressourcen und derselben Taktrate, benutzen dabei aber traditionelle
Non-Thread-Parallelitäten.
-
Die Thread-Level-Parallelität ist besonders nützlich für JavaTM-Anwendungen, von denen bekannt sind, dass
sie Multi-Execution-Threads haben. JavaTM-Verfahren,
die "Unterbrechen", "Fortsetzen", "Schlafen" und dergleichen enthalten,
enthalten eine wirksame Unterstützung
für den
gethreadeten Programmcode. Zusätzlich
sind JavaTM-Klassenbibliotheken Thread-sicher,
um Parallelität
zu fördern.
(JavaTM, Sun, Sun-Microsystems und das Sun
Logo sind Marken oder registrierte Marken von Sun Microsystems,
Inc. in den Vereinigten Staaten und anderen Ländern. Alle SPARC-Marken, einschließlich UltraSPARC
I und UltraSPARC II, werden unter Lizenz benutzt und sind Marken
von SPARC International, Inc. in den Vereinigten Staaten und anderen
Ländern. Produkte,
welche die SPARC-Marke aufweisen, basieren auf einer Architektur,
die von Sun Microsystems, Inc. entwickelt worden ist.) Darüber hinaus
unterstützt
das Thread-Modell des multi-gethreadeten Prozessors 900 und
anderer beschriebener multi-gethreadeter Prozessoren einen dynamischen
Compiler, der als ein Thread läuft,
während
ein zweiter Thread durch die aktuelle Anwendung benutzt wird. In
dem beispielhaften System führt
der Compiler eine Optimierung auf der Basis der "on-the-fly"zurückgeführten Profilinformation
durch, während
er dynamisch den Ausführungscode
modifiziert, um die Ausführung
bei jedem folgenden Durchlauf zu verbessern. Zum Beispiel kann ein
"garbage collector" als ein erster Thread ausgeführt werden, der Objekte kopiert
oder Zei gerinformation sammelt, während die Anwendung als ein
zweiter Thread ausgeführt
wird.
-
Bezüglich 10 zeigt ein schematisches funktionelles
Blockdiagramm eine alternative Entwurfskonfiguration für einen
Einzelprozessor-vertikal-gethreadeten Prozessor 1000, der
zur Implementierung verschiedener Multithreading-Techniken und Systemimplementierungen
geeignet ist, welche die Multithreading-Leistung und Funktion verbessern. Der
Einzelprozessor-vertikal-gethreadete Prozessor 1000 ist
Zweiwege-vertikal-gethreadet mit einem einzelnen Prozessor, aber
mit dualen Thread-Pipelines in einem Die. In einem erklärenden Ausführungsbeispiel
ist die Pipeline auf einem UltraSPARC IIi-Entwurf mit einer peripheren
Komponentenverbindung (PCI)-Schnittstelle begründet und arbeitet bis zu einer
Prozessortaktfrequenz von 600 MHz. Der Einzelprozessor-vertikal-gethreadete
Prozessor 1000 enthält
einen Thread 0-Maschinenzustandsblock 1010, der einen Maschinenzustand
eines ersten Threads (Thread 0) bildet und eine Prozessor-Pipeline
enthält.
Der Thread 0-Maschinenzustand
und Pipelineblock 1010 wird durch einen Thread 1-Maschinenzustandsblock 1012 abgebildet,
der einen Maschinenzustand eines zweiten Threads (Thread 1) bildet.
Der Thread 0-Maschinenzustands- und Pipelineblock 1010 und
der Nachbildungsthread 1-Maschinenzustandsblock 1012 werden
in einer einzelnen integrierten Schaltungslogikstruktur gebildet, welche
das vorher beschriebene Hochgeschwindigkeits-Multibit-Flip-Flop-Design und eine "vierdimensionale"
Registerdateistruktur benutzt. Die vierdimensionale Registerdateistruktur
wird in einer Vielzahl von Lagen von Speicherzellen gebildet. Die
Speicherzellenlagen haben eine zweidimensionale Form, die einen
Speicher zum Abspeichern von Datenbytes oder Wörtern enthalten, die eine Vielzahl
von Bits enthalten. Vertikales Threading führt eine vierte Dimension ein,
da die dreidimensionale Registerdatei für eine Vielzahl von Maschinenzuständen definiert ist,
die von den Registern dupliziert werden. Die multiple Dimensionsregisterdatei
erhöht
multiplikativ die Registerdateispeicherkapazität, ohne die integrierte Schaltungsgröße zu verändern, da
die Größe von der Anzahl
und der Dichte der Bauelemente auf der Oberfläche eines Halbleiterdies abhängt. Eine
geeignete multidimensionale Registerdatei wird detailliert im US-Patent
5,721,868 offenbart.
-
Die multiple Dimensionsregisterdateistruktur ist
sehr vorteilhaft zur Erhöhung
der Prozessorleistung, ohne die Größe zu erhöhen, und zur Verkleinerung
der Prozessorgröße, während die
Prozessorleistung gleichgehalten oder erhöht wird. Ein weiterer Vorteil
der multiplen Dimensionsregisterdatei ist, dass ein einzel-gethreadeter
Prozessor in einen multigethreadeten Prozessor konvertiert werden
kann, während
dieselbe Schaltungsbasisflächengröße, die Verdrahtungskonfiguration,
die Verpackung und ähnliches
beibehalten wird. Ent sprechend wird ein multi-gethreadeter Prozessor
vorteilhaft produziert, während
die Charakteristiken eines einzeln-gethreadeten Prozessormodelles
ausgenutzt werden.
-
Der Thread 0-Maschinenzustands- und Pipelineblock 1010 und
der abbildende Thread 1-Maschinenzustandsblock 1012 führen die
Befehle von Thread 0 und Thread 1 unter Verwendung des vertikalen
Threadings aus. Der Thread 0-Maschinenzustands- und Pipelineblock 1010 und
der nachbildende Thread 1-Maschinenzustandsblock 1012 sind
mit einer externen Cache-Steuereinheit (ECU) 1022 verbunden,
welche mit einem externen L2-Cache-statischen Arbeitsspeicher (SRAM) 1024 verbunden
ist.
-
Die externe Cache-Steuereinheit 1022 ist auch über einen
PCI-Controller 1030 mit einem peripheren Komponenten-Verbindungsbus
(PCI) 1032 verbunden. Die externe Cache-Steuereinheit 1022 ist ferner über eine
Speicher-Steuereinheit (MCU) 1028 mit einem dynamischen
Arbeitsspeicher (DRAM) 1034 und einem Ultraport-Architekturverbindungsbus (UPA) 1026 verbunden.
Die externe Cache-Steuereinheit 1022 und die Speichersteuereinheit
(MCU) 1028 sind zwischen Thread 0 und Thread 1 einheitlich
ausgeführt,
um die Funktionen der Cache-Fehltrefferverarbeitung und der Verbindung
mit externen Geräten
auszuführen,
um in Kombination dazu eine Vielzahl von Ausführungs-Threads dem Thread 0-Maschinenzustandsblock 1010 und
dem Thread 1-Maschinenzustandsblock 1012 zuzuführen. Die einheitliche
externe Cache-Steuereinheit 1022 und die Speichersteuereinheit
(MCU) 1028 enthalten eine Thread-Identifikationsmarkierung
(TID), um den Thread zu spezifizieren und zu identifizieren, auf
den über
den L2-Cache SRAM 1024, den PCI-Bus 1032, das
DRAM 1034 und den UPA-Bus 1026 zugegriffen wird.
Der PCI-Controller 1030 und der MCU 1028 werden
gemeinsam von Threads benutzt, welche einen Einzeltor-Identifizierer
benutzen. Die Thread-ID-Markierung wird in Prozessorkomponenten
implementiert, welche nicht blockieren, zum Beispiel einen Carry(logN)-Bit
TID im L1- und L2-Cache (sowohl Daten als auch Instruktions-Caches),
Adressumsetzpuffer (TLBs), asynchrone Schnittstellen von Ladepuffern,
einer externen Speicherverwaltungseinheits-(MMU)-Schnittstelle und
dergleichen. In nicht-blockierenden (non-stalling) Komponenten läuft nur
eine einzige Sache gleichzeitig durch die Komponente, so dass kein
blockierter Zustand existiert, der abgespeichert würde. Die
Thread-ID-Bits geben an, welcher Thread in der Komponente aktiv
ist.
-
Die externe Cache-Steuereinheit 1022 verwaltet
die Instruktions-(L1)-Cache- und Datencache-Fehltreffer und erlaubt
bis zu einem Zugriff pro Zyklus auf den externen Cache. Ladeoperationen, welche
im Datencache einen Fehltreffer landen, werden durch Multibyte-Datencache-Eingaben
bei zwei aufeinanderfolgenden Zugriffen auf den externen Cache ge heilt.
Speicheroperationen sind vollständig
gepipelined und schreiben direkt auf den externen Cache. Vorab-Lesebefehle,
welche einen Fehltreffer beim Instruktions-Cache landen, werden
durch Multibyte-Instruktions-Cache-Eingaben geheilt, welche vier
aufeinanderfolgende Zugriffe auf den paritätsgeschützten externen Cache benutzen.
-
Die externe Cache-Steuereinheit 1022 unterstützt DMA-Zugriffe,
welche einen Treffer im externen Cache landen, und hält die Datenkohärenz zwischen dem
externen Cache und dem Hauptspeicher (nicht dargestellt) aufrecht.
-
Die Speichersteuereinheit (MCU) 1028 steuert
die Transaktionen zu dem UPA-Bus 1026 und zu dem DRAM 1034.
Der UPA-Bus 1026 läuft
bei einem Bruchteil (zum Beispiel 1/3) des Prozessortaktes.
-
Ein beispielhafter Einzelprozessor-vertikal-gethreadeter
Prozessor 1000 ist auf einem Die aufgebaut, welches kleiner
als 100 mm2 ist, und hat eine Verlustleistung
von weniger als 10 W bei einer Taktrate von 200 MHz. Der beispielhafte
Einzelprozessor-vertikal-gethreadete Prozessor 1000 hat
einen geschätzten
Wirkungsgrad bei einem Berechnungswirkungsgrad von 30% bei einem
Single-Thread-Prozessor mit ähnlichen
Leistungsspezifikationen pro Thread.
-
Bezüglich 11 stellt ein schematisches funktionelles
Blockdiagramm eine alternative Entwurfskonfiguration für einen
Einzelchip-Dualprozessor-vertikal-gethreadeten Prozessor 1100 dar,
der zur Implementierung verschiedener Multithreading-Techniken und
Systemimplementationen geeignet ist, welche die Multithreading-Leistung
und -Funktion verbessern. Der Einzelchip-Dualprozessor-vertikal-gethreadete
Prozessor 1100 enthält
zwei Prozessorkerne auf einem einzigen Die, wobei jeder Prozessorkern
zweiwege-vertikal-gethreadet ist, was zu einer effizienten Herstellung
von vier Prozessoren auf einem Die führt. Die zwei Prozessorkerne
teilen sich gemeinsam einen On-Chip-Vierwege-Set-Associative-L2-Cache
und teilen sich gemeinsam eine externe Cache-Steuereinheit, welche
einen Zugriff auf den L2-Cache
steuert. Das gemeinsame Benutzen des On-Chip-L2-Caches führt vorteilhafterweise
zu einer Cache-Kohärenz
zwischen der Vielzahl von Prozessoren auf einem einzigen Die. In
dem beispielhaften Einzelchip-Dualprozessor-vertikal-gethreadeten
Prozessor 1100 enthält
jeder der zwei Prozessorkerne getrennte periphere Komponentenschnittstellen
(PCI), DRAM und UltraPort-Architektur-Verbindungs-(UPA)-Schnittstellen.
-
Der Einzelchip-vertikal-gethreadete
Prozessor 1000, der in 10 dargestellt
ist, führt
allein ein vertikales Multithreading durch. Im Gegensatz dazu führt der
Einzelchip-Dualprozessor-vertikal-gethreadete
Prozessor 1100 sowohl ein horizontales Multithreading als
auch ein vertikales Multithreading durch. Der Einzelchip-Dualprozessor-vertikal-gethreadete Prozessor 1100 hat
zwei Prozessoren auf einem Chip, der einen ersten vertikalen Multithreading-Prozessor 1102 und
einen zweiten vertikalen Multithreading-Prozessor 1104 enthält, wobei
beide zweiwege-vertikal-gethreadet mit einem Einzelprozessor sind,
die aber duale Thread-Pipelines in einem Die haben. In einem beispielhaften
Ausführungsbeispiel
basieren die Pipelines auf einem UltraSPARC II-Entwurf mit einer
peripheren Komponentenverbindungs-(PCI)-Schnittstelle und arbeiten bis
zu einer Prozessortaktfrequenz von 600 MHz.
-
Der erste vertikale Multithreading-Prozessor 1102 enthält einen
Thread 0-Maschinenzustandsblock 1110,
der einen Maschinenzustand eines ersten Threads (Thread 0) definiert,
und eine Prozessor-Pipeline enthält.
Der Thread 0-Maschinenzustands- und Pipeline-Block 1110 wird
durch einen Thread 1-Maschinenzustandsblock 1112 abgebildet, der
einen Maschinenzustand eines zweiten Threads (Thread 1) bildet.
Der Thread 0-Maschinenzustands- und
Pipeline-Block 1110 und der Abbildungs-Thread 1 Maschinenzustandsblock 1112 sind
in einer einzigen integrierten logischen Schaltungsstruktur hergestellt,
die ungefähr
die Hälfte
eines Halbleiterdies belegt und den vorher beschriebenen Hochgeschwindigkeits-Multibit-Flip-Flop-Entwurf
und eine "vierdimensionale" Registerdateistruktur benutzt. Bei manchen
Prozessoren kann die Registerdatei bei einem einzelnen vertikalen
Multithreading-Prozessor angeordnet sein. In anderen Prozessoren
kann die Registerdatei zwischen einer Vielzahl von vertikalen Multithreading-Prozessoren
gemeinsam benutzt werden.
-
Der Thread 0 Maschinenzustands- und
Pipeline-Block 1110 und der abbildende Thread 1 Maschinenzustandsblock 1112 führen die
Befehle des Threads 0 und des Threads 1 aus, die vertikales Threading
benutzen. Der Thread 0 Maschinenzustands- und Pipeline-Block 1110 und
der abbildende Thread 1 Maschinenzustandsblock 1112 sind
mit einer externen Cache-Steuereinheit (ECU) 1122 verbunden,
die über
einen externen Cache-Steuereinheits(ECU)-Schiedsrichter 1125 mit
einem On-Chip-L2-Cache-SRAM 1124 verbunden ist. Der L2-Cache
SRAM 1124 und der ECU-Schiedsrichter 1125 werden
gemeinsam von dem ersten vertikalen Multithreading-Prozessor 1102 und
dem zweiten vertikalen Multithreading-Prozessor 1104 gemeinsam benutzt.
In einem beispielhaften Prozessor 1100 ist der L2-Cache-SRAM 1124 ein
1-Megabyte-Vierwege-L2-Cache.
-
Die externe Cache-Steuereinheit 1122 ist auch über einen
PCI-Controller 1130 mit einem peripheren Komponenten-Verbindungs-Bus
(PCI) 1132 verbunden. Die externe Cache-Steuereinheit 1122 ist des
weiteren mit einem DRAM 1134 und einem UltraPort-Architekturverbindungs(UPA)-Bus über eine Speichersteuereinheit
(MCU) 1128 verbunden. Die externe Cache-Steuereinheit 1122 und
die Speichersteuereinheit (MCU) 1128 sind zwi schen Thread
0 und Thread 1 einheitlich, um die Funktionen der Cache-Fehltrefferverarbeitung
und der Verbindung mit externen Geräten auszuführen, um in Kombination dazu
eine Vielzahl von Ausführungs-Threads
dem Thread 0 Maschinenzustandsblock 1110 und dem Thread
1 Maschinenzustandsblock 1112 zuzuführen. Die einheitliche externe
Cache-Steuereinheit 1122 und die Speichersteuereinheit
(MCU) 1128 enthalten eine Thread-Identifikations-(TID)-Markierung, um den
Thread zu spezifizieren und zu identifizieren, auf den über den
L2-Cache-SRAM 1124, den PCI-Bus 1132, das DRAM 1134 und
den UPA-Bus 1126 zugegriffen wird. Der PCI-Controller 1130 und
das MCU 1128 werden gemeinsam zwischen Thread 0 und Thread
1 unter Verwendung eines Einzelport-Identifizierers benutzt.
-
Die externe Cache-Steuereinheit 1122 verwaltet
die Speicher-(L1)-Cache- und Datencache-Fehltreffer und erlaubt
bis zu einem Zugriff pro Zyklus auf den externen Cache. Ladeoperationen, welche
einen Fehltreffer im Datencache erzeugen, werden durch multiple
Byte-Datencache-Eingaben bei zwei aufeinanderfolgenden Zugriffen
auf den externen Cache geheilt. Speicheroperationen sind vollständig gepipelined
und schreiben direkt auf den externen Cache. Das Vorablesen von
Befehlen, welche einen Fehltreffer auf den Instruction-Cache landen, werden
durch multiple Byte-Befehls-Cache-Eingaben geheilt, welche vier
aufeinanderfolgende Zugriffe auf den paritätsgeschützten externen Cache benutzen.
-
Die externe Cache-Steuereinheit 1122 unterstützt die
DMA-Zugriffe, welche einen Treffer im externen Cache landen, und
hält die
Datenkohärenz zwischen
dem externen Cache und dem Hauptspeicher (nicht dargestellt) aufrecht.
-
Die Speichersteuereinheit (MCU) 1128 steuert
die Transaktionen zu dem UPA-Bus 1126 und zu dem DRAM 1134.
Der UPA-Bus 1126 läuft
bei einem Bruchteil (zum Beispiel 1/3) des Prozessortaktes.
-
Der zweite vertikale Multithreading-Prozessor 1104 enthält einen
Thread 2-Maschinenzustandsblock 1140,
der einen Maschinenzustand eines dritten Threads (Thread 2) bildet
und eine Prozessor-Pipeline enthält.
Der Thread 2-Maschinenzustands- und Pipeline-Block 1140 wird durch einen Thread
3 Maschinenzustandsblock 1142 abgebildet, welcher einen
Maschinenzustand eines vierten Threads (Thread 3) definiert. Der
Thread 2 Maschinenzustands- und Pipeline-Block 1140 und
der Abbildungsthread 3 Maschinenzustandsblock 1142 werden
in einer einzelnen integrierten logischen Schaltungsstruktur hergestellt,
die ungefähr
die Hälfte
eines Halbleiterdies abdeckt und die das vorher beschriebene Hochgeschwindigkeits-Multibit-Flip-Flop-Design
und eine "vierdimensionale" Registerdateistruktur benutzt. Der Thread
2-Maschinenzustands- und Pipeline-Block 1140 und der Abbildung sthread
3 Maschinenzustandsblock 1142 führen die Befehle von Thread
2 und Thread 3 unter Benutzung von vertikalem Threading aus. Der
Thread 2 Maschinenzustands- und Pipeline-Block 1140 und der Abbildungs-Thread
3 Maschinenzustandsblock 1142 sind mit einer externen Cache-Steuereinheit (ECU) 1152 verbunden,
die über
den externen Cache-Steuereinheits(ECU)-Schiedsrichter 1125 mit dem
On-Chip-L2-Cache-SRAM 1124 verbunden ist. Der L2-Cache-SRAM 1124 und
der ECU-Schiedsrichter 1125 werden gemeinsam von dem ersten
vertikalen Multithreading-Prozessor 1102 und dem zweiten
vertikalen Multithreading-Prozessor 1104 benutzt.
-
Die externe Cache-Steuereinheit 1152 ist auch über einen
PCI-Controller 1160 mit dem peripheren Komponenten-Verbindungs-(PCI)-Bus 1132 verbunden.
Die externe Cache-Steuereinheit 1152 ist des
weiteren über
eine Speichersteuereinheit MCU 1158 mit einem DRAM 1164 und
dem Ultraport-Architektur-Verbindungs-(UPA)-Bus 1126 verbunden.
Die externe Cache-Steuereinheit 1152 und die Speichersteuereinheit
(MCU) 1158 sind einheitlich zwischen Thread 2 und Thread
3, um die Funktionen der Cache-Fehltrefferverarbeitung und der Verbindung
zu externen Geräten
durchzuführen,
um in Kombination dazu eine Vielzahl von Ausführungs-Threads dem Thread 2
Maschinenzustandsblock 1140 und dem Thread 3 Maschinenzustandsblock 1142 zuzuführen. Die
einheitliche externe Cache-Steuereinheit 1152 und die Speicher-Steuereinheit
(MCU) 1158 enthalten Thread-Identifizierer-Markierungen
(TID), um den Thread zu spezifizieren und zu identifizieren, auf
den über
den L2-Cache-SRAM 1124,
den PCI-Bus 1132, den DRAM 1134 und den UPA-Bus 1126 zugegriffen wird.
Das TDI wird durch die Logik für
den Einsatz mit Prozessorblöcken
unterstützt,
welche nicht blockiert sind. Entsprechende nicht-blockierte Blöcke enthalten
Cache-Adress-Umsetzpuffer (TLB), eine Ladepuffer-asynchrone Schnittstelle,
eine Speicherpuffer-asynchrone Schnittstelle, eine externe Speicherverwaltungseinheit-(MMU)-Schnittstelle
und andere Komponenten. Der PCI-Controller 1160 und der MCU 1158 werden
gemeinsam von Thread 2 und Thread 3 benutzt, die einen Einzelport-Identifizierer benutzen.
-
Die Ladepuffer- und Speicherpuffer-Schnittstellen
sind gemeinsam benutzte Strukturen, die implementiert sind, um die
Kompatibilität
mit multiplen Threads aufrechtzuerhalten. Beim Umschalten eines Threads
verändert
ein neuer Thread nicht den Zustand einer gemeinsam benutzten Struktur
in einer Art und Weise, die nicht kompatibel ist mit dem ersetzten
Thread. Die Ladepuffer- und Speicherpuffer-Schnittstelle halten
die Thread-Kompatibilität durch
physikalische Duplizierung von Strukturen und durch das Kontrollieren
des sogenannten Lese-nach-Schreibe-Status der Speicher aufrecht.
Im Besonderen werden Ladetätigkeiten gegenüber einem
Speicherpuffer in einem alternativen Thread kontrolliert, so dass
die Lesenach-Schreibe-Statusinformation abgespeichert und erweitert
wird, um Ergebnisse von Lesenach-Schreibe-Kontrollen gegenüber allen
Speicherpuffern abzuspeichern.
-
Die Speicherpuffer-Datencache-Treffer-Bits werden
nicht zurückgesetzt.
Deshalb kann als Folge einer Thread-Umschaltung ein Laden in Thread
2 eine Zeile ersetzen, die das Ziel einer bisher nicht vollständigen Abspeicherung
in Thread 1 ist. Da die Speicherpuffer-Datencache-Treffer-Bits nicht zurückgesetzt
werden, kann eine andere Thread-Umschaltung dazu führen, dass
der Thread 1 in einer anderen Zeile abspeichert. Die Lese-nach-Schreibe-Kontrolle in dem
anderen Speicherpuffer verhindert das weitere Laden in dem anderen
Speicherpuffer und verhindert das Ersetzen einer Zeile, die ein
Ziel einer unvollständigen
Abspeicherung ist.
-
Wenn zusätzlich eine Abspeicherung in Thread
1 in den Datencache, aber nicht in den externen Cache schreibt,
ohne Lese-nach-Schreibekontrolle in dem anderen Speicherpuffer,
dann kann eine Ladeoperation in Thread 2 die auf den neuesten Stand
gebrachten Werte vor den anderen Prozessoren in dem System empfangen,
was zu einer TSO-Verletzung führt.
Deshalb sollte die vollständige Beschreibung
eines Schreibens in den Datencache für eine Speicheroperation nicht
Lese-nach-Schreibe-Threads sperren.
-
Die externe Cache-Steuereinheit 1152 verwaltet
den Befehls-(L1)-Cache und die Datencache-Fehltreffer und erlaubt
bis zu einem Zugriff pro Zyklus auf den externen Cache. Die externe
Cache-Steuereinheit 1152 unterstützt DMA-Zugriffe, welche einen
Treffer in dem externen Cache landen, und hält die Datenkohärenz zwischen
dem externen Cache und dem Hauptspeicher (nicht dargestellt) aufrecht.
-
Die Speichersteuereinheit (MCU) 1158 steuert
die Transaktionen zu dem UPA-Bus 1126 und zu dem DRAM 1134.
-
Ein beispielhafter Einzelchip-Dualprozessor-vertikal-gethreadeter
Prozessor 1100 arbeitet bei einer Taktfrequenz von bis
zu 600 MHz, ist auf einem Die aufgebaut, der kleiner als 250 mm2 ist und hat eine Verlustleistung von weniger
als 10 W bei einer Taktrate von 200 MHz. Der beispielhafte Einzelchip-Dualprozessor-vertikal-gethreadete
Prozessor 1100 hat eine geschätzte Effektivität bei der
Berechnungseffizienz von 130% bei einem Single-Thread-Prozessor mit ähnlichen
Leistungsspezifikationen pro Thread.
-
Zahllose andere Strukturen und Kombinationen
können
auf einen oder mehreren integrierten Schaltungsdies implementiert
werden, die von dem benutzten Fabrikationsprozess und von den beabsichtigten
Anwendungen für
den Prozessor abhängen.
Die anderen Prozes sorkonfigurationen können mit variierenden Anzahlen
von On-Chip- oder Off-Chip-Prozessorkernen,
variierenden Zahlen von vertikalen Threads pro Pipeline und unterschiedlichen
Konfigurationen von Schnittstellen, Speicher und Eingabe-/Ausgabe-Steuereinheiten,
Speichereinrichtungen und dergleichen konfiguriert werden. Zum Beispiel
enthält
in einer "1C2T"-Konfiguration ein einzelner Prozessor die zwei vertikalen
Threads. In einem anderen Beispiel enthält eine vorteilhafte Konfiguration
vier Prozessorkerne mit jeweils vertikalen multi-gethreadeten Kernen,
um einen viereckigen Die herzustellen. In einer "4C4T"-Konfiguration wird ein
Vierprozessor-Multiprozessor auf einem einzelnen Die hergestellt,
wobei jeder der vier Prozessoren Vierwege-vertikal-gethreadet ist.
Ein Betriebssystem steuert den Betrieb des 4C4T-Konfigurationsprozessors
als ein 16-Wege-sequenzieller Multiprozessor.
-
Manche Prozessoren können entweder
einen On-Chip- oder einen externen rücksetzbaren dynamischen RAM
(RDRAM) anstatt eines externen Caches enthalten. Verschiedene Prozessoren
können
einen On-Chip-L2-Cache enthalten. Verschiedene Systeme können Cache-Speicher enthalten,
die wahlweise konfiguriert sind, zum Beispiel als aufgetrennte L1-Cache-Speicher und aufgetrennte
L2-Cache-Speicher oder aufgetrennte L1-Cache-Speicher und gemeinsam
benutzte L2-Cache-Speicher oder gemeinsam benutzte L1-Cache-Speicher
und gemeinsam benutzte L2-Cache-Speicher.
-
Bezüglich 12 stellt ein schematisches Blockdiagramm
einen Prozessor 1200 und eine Prozessorarchitektur dar,
die zur Implementierung verschiedener Multithreading-Techniken und Systemimplementierungen
geeignet sind, welche die Multithreading-Leistung und -Funktion
verbessern. Ein Befehls-Cache 1212 liefert Befehle an eine
Decodiereinheit 1214. Der Befehls-Cache 1214 empfängt Befehle
von einer Vorab-Leseeinheit 1216, welche über eine
Cache-Steuer-/Systemschnittstelle 1222 mit Befehlen von entweder
einer Branch-Einheit 1218 oder einem
externen Cache (nicht dargestellt) versorgt wird. In manchen Prozessoren
enthält
die Cache-Steuer-/Systemschnittstelle 1222 eine externe Cache-Steuereinheit
(ECU) und eine Speicher-Schnittstellen-Einheit (MUI). Befehle von
dem externen Cache werden abgegeben, wenn die Vorab-Leseeinheit 1216 eine
virtuelle Adresse an einen Befehlsadress-Umsetzpuffer (TLB) 1220 abgibt.
Befehle von dem externen Cache werden an eine Prädecodiereinheit 1224 abgegeben
und enthalten verschiedene Steuerinformationen für den Befehls-Cache 1212.
Die verschiedenen Steuerinformationen enthalten Signale, wie zum
Beispiel eine Bezeichnung, dass ein Befehl ein Branch-Befehl ist.
-
Befehle von der Decodiereinheit 1214 werden
an einen Instruktionspuffer 1226 abge geben und werden durch
eine Dispatch-Einheit 1228 verarbeitet. In manchen Prozessoren
wird das Puffern von Instruktionen durch mehrere Instruktionspuffer 1226, die
miteinander parallel verbunden sind, realisiert. In dem beispielhaften
Prozessor 1200 gibt die Dispatch-Einheit 1228 vier decodierte
Instruktionen gleichzeitig an einen Bus 1230 ab. Die Instruktionen werden
an eine von acht Funktionseinheiten abgegeben. Die Dispatch-Einheit 1228 kontrolliert
auf Datenabhängigkeiten,
Steuerabhängigkeiten
und strukturellen Problemen, wie zum Beispiel die Verfügbarkeit von
Funktionseinheiten und Speicheranschlüssen. Die Dispatch-Einheit 1228 fertigt
dann auf der Grundlage der Kontrolloperation bis zu vier Instruktionen pro
Zyklus ab.
-
Funktionseinheiten vom Integer-Typ,
die eine Lade-/Speichereinheit 1232, eine erste Integer-Recheneinheit
(ALU) 1234 und eine zweite Integer-ALU-Einheit 1236 enthalten,
benutzen gemeinsam einen Satz von Integer-Registern 1248.
Funktionseinheiten vom Gleitkommatyp, die eine erste Gleitkommaeinheit 1238,
eine zweite Gleitkommaeinheit 1240, eine dritte Gleitkommaeinheit 1242, eine
erste graphische Einheit 1244 und eine zweite graphische
Einheit 1246 enthalten, benutzen gemeinsam die Gleitkommaregister 1250.
Die Funktionseinheiten vom Integer-Typ benutzen gemeinsam eine Integer-Vervollständigungseinheit 1252 und
die Funktionseinheiten vom Gleitkommatyp benutzen gemeinsam eine
Gleitkommavervollständigungseinheit) 1254.
Der Prozessor 1200 enthält
auch einen On-Chip-Datencache 1256 und einen Datenadress-Umsetzpuffer
(TLB) 1258.
-
Bezüglich 13 zeigt ein schematisches perpektivisches
Diagramm eine multidimensionale Registerdatei 1300, die
vorteilhaft für
den Gebrauch in einem multi-gethreadeten Prozessor ist. Sowohl Integer-
als auch Gleitkommaregisterdateien werden typischerweise nicht mit
Flip-Flops implementiert, so dass das Multibit-Flip-Flop nicht hilfreich
in der typischen Registerdatei ist, um die Speicherkapazität zu erhöhen. Die
Kapazität
der Registerdateien kann jedoch anders erweitert werden, indem andere
Techniken und Strukturen, wie die multidimensionale Registerdateistruktur 1300 verwendet
wird.
-
Eine Registerdatei ist eine Datenpfadkomponente,
die sehr bestimmend für
die Leistung in einem superskalaren Prozessor ist. Die Zugriffszeit
auf die Registerdatei ist ein Faktor, der die Prozessorzykluszeit
beeinflusst. Die Registerdatei verbraucht einen relativ großen Anteil
des superskalaren Prozessors, da eine große Anzahl von Anschlüssen sehr
nützlich in
solchen Prozessoren ist. Typischerweise werden zehn oder mehr Anschlüsse für einen
dreiskalaren Mikroprozessor benutzt und die Größe der Registerdatei steigt
mit dem Quadrat der Anzahl von Anschlüssen an.
-
Die multidimensionale Registerdatei 1300 benutzt
mit Vorteil die Fläche,
die inhärent
durch die Metalldrähte
verbraucht wird, die für
die Bitzeilen und Wortzeilen für
jede Speicherzelle benutzt werden, um N Sätze von Registern zu speichern.
Die einzelnen Sätze
der N Sätze
sind logisch eine Ebene in der dritten Dimension. Die Konfiguration
der multiplen Ebenen wird benutzt, um eine Vielzahl von Registerfenstern
zu bilden und um extra Registereinstellungen für Realzeitaufgaben, Umschaltung
von Mikroaufgaben oder Abspeicherung von multiplen Ausführungs-Threads
zu bilden. In manchen Speichern ist ein Daten-Array eines dreidimensionalen,
achtfenstrigen, mit zehn Anschlüssen
ausgestatteten Registerdatei sechsmal kleiner als eine flache Registerdatei.
Die Zugriffszeit wird durch das Verkürzen von Busleitungen und durch
das gemeinsame Benutzen eines großen Puffers zwischen den Bitzellen
verbessert. Die multidimensionale Registerdatei 1300 wird mit
Vorteil in Hochleistungssuperskalaren Prozessoren implementiert.
-
Die große Anzahl von Registern und
die erhöhte
Funktionalität
einer Registerdatei, die eine Vielzahl von Registerfenstern enthält, werden
konventionell in einem Mikroprozessor auf Kosten eines starken Anwachsens
der Schaltungsgröße, Kosten und
Schwierigkeiten bei der Implementierung implementiert. Zum Beispiel
würde eine
herkömmliche
Registerdatei mit einem Fenster von 32 Registern mit acht überlappenden
Registern zwischen den Fenstern insgesamt 128 Register enthalten,
ohne globale Register zu enthalten, und wäre um einiges größer als
herkömmliche
Registerdateien ohne Fenster. Die durch die Fenster plus die größere Anzahl
von Registern hinzugefügte
Funktionalität
macht die Implementierung einer Registerdatei mit Fenstern zu einer
Herausforderung, da RISC-Prozessoren aufgrund starkem Pipelining
auf Basisdatenpfadblöcken,
wie zum Beispiel den Registerdateien, ALUs und Cache-Speichern, zu Basiszykluszeit
neigen. Eine herkömmliche Registerdatei
mit Fenstern, die in einer herkömmlichen
Art und Weise implementiert sind, hat genau ein aktives Fenster
für alle
Leseoperationen und ein aktives Fenster für alle Schreiboperationen.
-
Die multidimensionale Registerdatei 1300 nutzt
die Tatsache aus, dass nicht auf alle Fenster gleichzeitig zugegriffen
werden muss, um einen Schaltungsaufwand zwischen den Fenstern einzusparen.
Die einzelnen Ebenen 1310 in der multidimensionalen Registerdatei 1300 stellen
ein eigenes Fenster dar. Im Sinne der Einfachheit ist die multidimensionale
Registerdatei 1300 mit vier nicht-überlappenden Fenstern dargestellt.
Das Konzept der multidimensionalen Registerdatei 1300 stellt
auf die Unterstützung
durch das Umschalten von Kontext ab, so dass die einzelnen Flächen 1310 einen
separaten Kontext darstellen. Das Umschalten von Kontext zwischen
Mikrotasks wird durch das einfache Verändern der Kontext zahl, so wie
dies in 13 dargestellt
ist, durch das Verändern
des Fensterzeigers 1312, schnell durchgeführt.
-
Die aktuelle Kontextzahl oder der
Fensterzeiger 1312 wird durch einen separaten Decoder 1314 decodiert
und eine entsprechende Ebene 1310 wird ausgewählt. Der
Registerindex für
das ausgewählte
Fenster wird in der Art und Weise einer herkömmlichen Registerdatei decodiert.
Beim Auswählen
eines Registers werden die Registerinhalte auf einen Datenbus gegeben,
der von allen Fenstern oder Kontexten gemeinsam benutzt wird. Im
Sinne der Einfachheit stellt 13 nur
einen Leseabschnitt der Logik für
die multidimensionale Registerdatei 1300 dar. Die Schreiblogik
(nicht dargestellt) enthält
einen separaten Decoder (nicht dargestellt) für einen Schreibfensterzeiger,
der eine andere Ebene 1310 auswählt. Separate Datenleitungen
sind inhärent
für einzelne
Phasen-Pipelines enthalten, so dass keine zusätzliche Leitung für den separaten
Schreibfensteranschluss enthalten sein muss. Es ist zu beachten,
dass eine zusätzliche
Fensterdecodierzeile hinzugefügt
werden kann, um eine höhere
Leistung zu erreichen.
-
Eine herkömmliche Implementierung von Registerfenstern
in einer Registerdatei führt
zu einer großen
flachen Konfiguration. Für
einen superskalaren Prozessor mit mehreren Anschlüssen resultiert die
herkömmliche
Implementation in einem einzigen Informationsbit, das verschwenderisch
zwischen einigen Metalldrähten
abgespeichert ist. 14 ist ein schematisches
Schaltungsdiagramm, das eine Bitzelle 1410 einer herkömmlichen
Implementierung eines Registerfensters einer Registerdatei mit zehn Anschlüssen einschließlich sieben
Leseanschlüssen und
drei Schreibanschlüssen
darstellt. Zehn separate Wortleitungen 1412, sieben single-ended
Abtastverstärkerleitungen
(nicht dargestellt) für
die Leseleitungen und drei single-ended Schreib-bit-Leitungen 1416 sind
enthalten, was zu einem 10X10-Gitter 1418 führt. Für einen
Vierlagenmetallprozess sind die Wortleitungen typischerweise auf
der zweiten Lage und die Bitleitungen auf der dritten Lage. Die
Betriebsspannungs- und Massepotentiale werden auf der vierten Lage
geführt
und die erste Lage wird für lokale
Verbindungen in den Bitzellen benutzt. Für einen 0,5-Mikronprozess mit
einem Metallpitch von 1,5 Micron, führt dies zu einem 10X10-Gitter 1418 in
einer Fläche
von 225 Quadratmicrons. Zwischen dem 10X10-Gitter 1418 wird ein einzelnes
Informationsbit abgespeichert, was eine schlechte Nutzung der verfügbaren Fläche für logische
Bauelemente ist. Für doppelabgetastete
Abtastverstärker
und für
ein differenzielles Schreiben sind die verschwendeten Flächen sogar
noch größer. Typischerweise
wird ein Gitter von 10X20 benötigt,
was zu einer effektiven Fläche
von 450 Microns führt,
um ein einzelnes Informationsbit abzuspeichern.
-
Das Daten-Array einer gefensterten
Registerdatei mit 128 64-Bit-Registern, das in der beispielhaften
herkömmlichen
Art und Weise implementiert ist, misst ungefähr 128 * 64 * 225 = 1,84 Quadratmillimeter
für das
single-ended Schema und 128 * 64 * 450 = 3,68 Quadratmillimeter
für die
doppel-ended Konfiguration. Für
einen 64-Bit-Superskalarprozessor mit einer relativ großen Registerdatei,
zum Beispiel 32 Registern, stellt das Daten-Array ungefähr 2/3 der
Gesamtfläche
der Registerdatei dar.
-
Bezüglich 15 stellt ein schematisches Schaltungsdiagramm
eine Vielzahl von Bitzellen 1510 eines Registerfensters
der multidimensionalen Registerdatei 1300 dar, welches
eine Verschwendung von integrierter Schaltungsfläche vermeidet, indem die Bedingung
ausgenutzt wird, dass nur ein Fenster gelesen und nur ein Fenster
gleichzeitig beschrieben wird. Die sonst verschwendete Fläche wird benutzt,
um Informationsbits einer Vielzahl von Fenstern bei einer entsprechenden
Vielzahl von Tiefen bei einer lateralen Position in der integrierten
Schaltungsfläche
abzuspeichern. Zum Beispiel wird das Bit i eines Registers j für eine Vielzahl
von Fenstern {0, 1, 2, ..., 7} bei einer Position in einem 10X10-Gitter 1518
bei einer Vielzahl von Tiefen abgespeichert. Die Vielzahl von Bits
bei einer Vielzahl von Tiefen werden durch die Spezifizierung eines
Bits i, eines Registers j und eines Fensters k adressiert. Folglich
wird eine Registerdatei mit acht Fenstern unter Benutzung von drei
zusätzlichen
Leitungen zur Spezifizierung eines ausgewählten Fensters unter acht Fenstern
adressiert. Folglich wird das 10X10-Gitter 1518 durch das Hinzufügen von
drei Adress-Leitungen zusätzlich
zu den Adress-Leitungen zur Adressierung einer 10X10-Einzelfensterregisterdatei
adressiert. Entsprechend wird das 10X10-Gitter 1518 durch 13X10-Adressleitungen
adressiert. In der beispielhaften multidimensionalen Registerdatei 1300 werden
acht Informationsbits anstatt einem Informationsbit in einer Fläche abgespeichert,
die nur um 30% größer ist
als die Fläche
für ein
Einzelfenster 10X10-Gitter 1418.
-
Für
ein Beispiel einer Abspeicherung einer single-ended-Registerdatei
benützt
jedes Bit ungefähr
36 Quadratmicrons (6,15 mal kleiner) im Vergleich
zu den 225 Quadratmicrons in einer herkömmlichen Implementierung eines
einzelnen Fensters. Die Vorzüge
sind sogar noch größer für eine double-ended-Implementierung,
in welcher ein Bit ungefähr
73 Quadratmicrons im Vergleich zu den 450 Quadratmicrons eines herkömmlichen
Doppelfensterspeichers benutzt. Der double-ended Speicher erreicht
dieselben Speicherraten, 6,15 mal kleiner, was aber sogar zu einem
größeren Gewinn
an insgesamt eingesparter Fläche
führt.
-
Das 10X10-Gitter 1518 ist
nur für
erklärende Zwecke
dargestellt. Ein Gitter kann jede geeignete Dimension (zum Beispiel
10X20 oder andere) in Abhängigkeit
von einer ge wünschten
Anwendung, Funktion und Kapazität
haben.
-
Bezüglich 16 stellt
ein schematisches Schaltungsdiagramm eine geeignete Bit-Speicherschaltung 1600 dar,
welche ein Bit des lokalen Registers für die multidimensionale Registerdatei 1300 mit acht
nicht-überlappenden
Fenstern abspeichert. Die multidimensionale Registerdatei 1300 ist
nützlich
für das
schnelle Umschalten von Kontext oder zur Implementierung von lokalen
Registern, die nicht über ein
Fenster hinweg gemeinsam benutzt werden.
-
Die beispielhafte Bit-Speicherschaltung 1600 stellt
eine Speicherzelle 1610 mit sieben Leseanschlüssen 1612,
single-ended Lesebitleitungen 1614, drei Schreibanschlüssen 1616,
unterschiedlichen Schreibbitleitungen 1618, getrennten
Lese- 1619 und Schreibfenstern 1620 und einem
decodierten (einen aktiven) aktuellen Fensterzeiger 1622.
Die Speicherzelle 1610 erlaubt keine gleichzeitigen mehrfachen
Schreiboperationen auf dasselbe Register. Die singleended Lesebitleitungen 1614 benutzen deutlich
weniger Fläche
als eine differenzielle Abtastverstärker-Implementierung (sieben
Leitungen gegen vierzehn Leitungen). Das Abtasten von single-ended
Lesebitleitungen verbessert die Leseabtastgeschwindigkeit, ohne
den Rauschbereich zu beeinträchtigen,
indem die Lesebitleitung über
die Maximalspannung des Abtastverstärkers vorbelastet wird. Zum
Beispiel wird in einem typischen 3,3 V CMOS-Prozess, unter der Annahme von TTLH,
die Lesebitleitung auf 1,31 V vorgespannt, was 0,61 V über dem
Maximalwert des Abtastverstärkers
von 0,70 V ist. Nachdem die Lesebitleitung vorgespannt ist, kann
die Auswahl einer der Speicherzellen auf der Lesebitleitung zu entweder
einer Fortsetzung des vorgespannten Zustandes führen, den der Abtastverstärker als
eine logische "1" einliest, oder kann zu einem Entladen der Bitleitung
unter den maximalen Spannungswert des Abtastverstärkers führen, was dazu
führt,
dass dieser Zustand als eine logische "0" gelesen wird.
-
Die differenziellen Schreibbitleitungen 1618 erlauben
schnelle Schreib- und zuverlässige Rauschgrenzen.
Das Benutzen eines getrennten Fensterzeigers zum Lesen und Schreiben
führt zu
einer höheren
Leistung, indem es mehr als einem Fenster erlaubt ist, in einer
Pipeline zu coexistieren. Durch das Verbieten von mehrfachen Schreibzugriffen
auf dasselbe physikalischen Register in demselben Zyklus wird der
Entwurf, ohne die Leistung zu beeinflussen, vereinfacht, da solche
Schreibzugriffe ein Anzeichen für
eine nicht-effiziente Bedingung sind und inhärent nicht geeignet sind für einen
ordentlichen Prozessor. Zwei aufeinanderfolgende Schreibzugriffe
in demselben Zyklus ohne einen dazwischenliegenden Lesezugriff sind
keine gewöhnliche Programmierpraxis.
-
Die Decodierung von Schreibadressen
findet in zwei Stufen statt. Prädecodierer
(nicht dargestellt) sind einfache statische Gatter. UND-Gatter mit
vier Eingängen
führen
die Decodierung der zweiten Stufe durch. Eines der vier Eingabesignale
ist ein Schreibfreigabesignal. Schreibdecodierer werden gesperrt, wenn
das entsprechende Schreibfreigabesignal gesperrt wird.
-
Der decodierte aktuelle Fensterzeiger 1622 vereinfacht
die Logik für
jede Bitzelle und erzeugt einen Geschwindigkeitsvorteil, da der
Zeiger parallel mit einem Registerindex decodiert werden kann.
-
Die Auswahlleitungen 1624 (rps0,
rps1, ... rps7) für
die Speicherzelle 1610 wählen ein Register N aus und
decken die volle Breite des 64-Bit-Registers ab. Die Decodierung
der Leseadressen wird in zwei Stufen unter Benutzung von Präcodierern
(nicht dargestellt), das einfache statische Gatter sind, während Endstufendecodierer
(nicht dargestellt) NAND-Gatter vom Domino-Typ mit drei Eingängen sind,
durchgeführt.
Um die Adress-Decodierungsrate deutlich zu erhöhen, werden die Leseadresssignale unterschiedlich
vorbelastet, um es einer Bewertung zu ermöglichen, sofort zu beginnen,
wenn die eingegebenen Adresssignale gültig werden.
-
Der decodierte aktuelle Fensterzeiger 1622 wird
durch acht Signale (rcwp0, rcwp1, ... recwp7) dargestellt, von denen
nur eines gleichzeitig aktiv ist. Der aktuell decodierte Fensterzeiger 1622 wählt das Fenster
innerhalb dem Register N aus, auf das zugegriffen wird. Über Kreuz
verbundene Inverter 1626 werden benutzt, um jede Bitzelle
abzuspeichern. Ein lokaler Inverter 1628 verstärkt die
Signale lokal und isoliert jede Zelle, was eine gemeinsame Benutzung von
Ladung vermeidet. Das Lesen von Daten von den einzelnen Bitzellen
wird durch einen Inverter INV2 gepuffert, der einen großen Pull-Down-Transistor
enthält
(50 Microns gegen 8 Microns für
einen entsprechenden Pull-up-Transistor). Die sieben Bitleitungen 1624 werden
vorgeladen, so dass die Lesezugriffszeit bestimmt wird durch die
Lesebitleitungs-Pulldown-Geschwindigkeit.
Der Inverter Inv1 und ein PMOS-Transistor TPFB ziehen einen Knoten cc
eines lokalen Zwischendatenbusses auf VDD.
-
Drei Schreibauswahlleitungen 1630 sind wps0,
wps1 und wps2. Es werden unterschiedliche Schreibarten implementiert,
so dass drei Paare von unterschiedlichen Schreibbitleitungen 1632 benutzt werden
(wdc0, wdt0, wdc1, wdt1, wdc2 und wdc2). Der separate decodierte
aktuelle Fensterzeiger 1622 wird für die Schreiboperationen benutzt,
so dass nur eines der acht Signale (wcwp0, wcwp1, ..., wcwp7) gleichzeitig
aktiv ist.
-
Bezüglich 17A stellt ein schematisches Diagramm
die gemeinsame Benutzung von Registern zwischen den nebeneinanderliegenden
Fenstern dar. Überlappende
Fenster er möglichen
eine Aufruffunktion, um Parameter zu einem Sender ohne zusätzliche
Lade- und Speicheroperationen zu senden. Eine Aufruffunktion hat
ein aktuelles Aufruffenster 1710, das "Ausgabe"-Register 1712 benutzt,
um Parameter zu einem danebenliegenden aktuellen Empfängerfenster 1720 weiterzuleiten,
wo die "INS"-Register 1722 Register für den Empfänger werden. Auf ähnliche
Art und Weise kann der Empfänger
beim Zurückkehren
von einem Funktionsaufruf die Ergebnisse durch die "INS"-Register 1722 zurück geben,
welche die "Ausgabe"-Register für
den ursprünglichen
Empfänger
werden.
-
Die Diskussion von 16 beschrieb,
wie Bitzellen von nebeneinanderliegenden Fenstern gemeinsam zwischen
den Metalldrähten
bleiben, welche für
den Zugriff auf eine einzelne Zelle und zur Zuführung eines Fensterdekodierungssignales
benutzt werden. Unter Benutzung desselben Konzepts für die "INS"-
und "Ausgabe"-Register bestehen alle Bits für Inn von
Fensterw alle in einem Punkt in der Schaltungsfläche fort.
Bezüglich 17B zeigt ein schematisches
Blockdiagramm eine Vierfensterregisterdatei, die einen Satz von
vier Bits enthält,
welche Daten für
das Bit; des Registers INn des Fenstersw+1 enthält,
was dasselbe ist als Bit; von Registerausgaben von
Fensterw. Für einen besonderen Fensterzeiger, zum
Beispiel Fenster0, sind zwei Bitzellen,
welche die IN- und die OUT-Register darstellen, zugreifbar.
-
Bezüglich 18 stellt
ein schematisches Schaltungsdiagramm eine Implementierung einer multidimensionalen
Registerdatei 1300 dar, die Register enthält, welche
durch eine Vielzahl von Fenstern gemeinsam benutzt werden. Eine
beispielhafte Abspeicherung 1800 enthält Bitzellen 1810,
welche Daten für
die INi und OUTi-Register
von Fensterj enthalten, wobei auf zwei Bitzellen
gleichzeitig zugegriffen werden kann, indem immer zwei mögliche adressierte
Zellen in dem Satz von acht Zellen für jede Fensterauswahl ausgewählt werden.
Zum Beispiel wählt
die Auswahl des aktuellen Fensterzeigers rcwp1 zwei Zellen aus,
cc0 als mögliches
IN-Register und ccl als ein mögliches
OUT-Register. Der Inhalt der zwei Zellen cc0 und ccl wird auf getrennten
lokalen Bussen ccIN und ccOUT ausgegeben. Die Auswahl der Daten
für jeden
Einleseanschluss des IN-Registers oder des OUT-Registers wird durch
einen Decoder (nicht dargestellt) ausgeführt. Getrennte Leitungen versorgen
die IN-Register und die OUT-Register, um das korrekte Register auszuwählen. Ein
einzelner großer
Puffer mit einem breiten Pulldown-Transistor ist in jedem Bus enthalten,
um die Bitleitungen je nach Bedingung zu entladen.
-
Eine Schreibschaltung enthält eine
spezielle Logik, um fehlerhaftes Überschreiben zwischen den IN-Registern
und den OUT-Registern zu vermeiden. Die Logik 1820, welche
das aktuelle Schreibfenster versorgt, ist ähnlich zu der Logik 1822,
welche das aktuelle Lese fenster versorgt. Ein und nur ein aktueller
Fensterzeiger (wcwp0, wcwp1, ..., wcwp7) wird benutzt und wählt zwei
Zellen aus, eine IN-Bitzelle und eine OUT-Bitzelle. Signale, welche
an den Schreibdecoderwert angelegt werden, bestimmen, ob entweder
die Daten von der IN-Bitzelle
oder der OUT-Bitzelle ausgegeben werden. Getrennte Signale wählen eine
Schreiboperation für
eine IN-Zelle (zum Beispiel wps0 in) und eine Schreiboperation für eine OUT-Zelle (zum Beispiel
wps1_out) aus. Da eine Schreiboperation datenbeschädigend ist,
wird eine Schreiboperation auf ein IN-Register unterbunden, um nicht
das entsprechende OUT-Register
zu korrumpieren und umgekehrt, was sogar dann auftreten könnte, wenn
die Schreibdaten auf einen der zwei lokalen Schreibdatenbusse ausgegeben
werden. Schreibdaten von einem Anschluss werden entweder zu dem
IN-lokalen Bus oder zu dem OUT-lokalen Bus gesendet, aber nicht
zu beiden. Die relativ große
Kapazität
der lokalen Busse könnte
eventuell den Inhalt eines der Bitzellen überschreiben, da der Schreibfensterzeiger
direkten Zugriff ermöglicht.
Um die Potentialschreibstörung
zu vermeiden, werden Pullup-Transistoren TPPU1, TPPU2, TPPU3 und TPPU4
benutzt, um die lokalen Schreibdatenleitungen von nicht-aktiven
Anschlüssen
vorzuspannen, welche wirksam als eine Lesestörung der Bitzelle mit einem
geringen Einfluss auf die Spannungswerte wirken. Eine Zustand von
zwei Schreibanschlüssen, welche
versuchen, auf dasselbe IN-Register oder dasselbe OUT-Register zu
schreiben, wird verhindert, da Multischreiboperationen auf dasselbe
Zielregister nicht erlaubt sind.
-
Die multidimensionale Registerdatei 1300 hat
viele vorteilhafte Charakteristika. Zum Beispiel eine Fähigkeit,
um Parameter von Funktionsaufrufen und Funktionsaufrufrückgaben
ohne die Notwendigkeit der Speicherung und Wiederherstellung der
Daten durch den Stack-Speicher
zu leiten, was die Leistung bedeutsam erhöht, da Lade- und Speicheroperationen
oft ein Flaschenhals in modernen Hochleistungsprozessoren sind.
-
Die Kontext-Umschaltleistung des
Prozessors 1200 wird durch kontext-umschaltbare Speicherstrukturen,
wie eine Registerdatei mit "Fenstern", verbessert. Die Fenster unterstützen unterschiedliche
"Kontexte" für
Funktionsaufrufe. In einem Beispiel ist die Registerdatei mit Fenstern
als eine multidimensionale Struktur mit "Ebenen" für ein schnelles
Umschalten des Kontextes konfiguriert.
-
In herkömmlichen Prozessoren verbraucht der
Datenarrayabschnitt ungefähr
2/3 der Gesamtfläche
einer Registerdatei. Der Gebrauch der multidimensionalen Registerdatei 1300 reduziert
mit Vorteil die Datenarraygröße um einen
Faktor von 4 für
eine Registerdatei mit acht Ebenen. Die insgesamt eingesparte Fläche hängt von
verschiedenen Entwurfsmerkmalen ab, einschließlich: (1) differenziellem
gegen single-ended Bitleseabtasten, (2) decodiertem gegen codiertem
Ebenen-/Fenster-Routing und (3) differenziellem gegen single-ended
Schreiben. Im Vergleich zu herkömmlichen
"Einzelfenster"-Registerdateien werden multiple Kontexte erreicht
im Wesentlichen ohne Kosten in Bezug auf die integrierte Schaltungsfläche, die
eine multidimensionale Registerdatei 1300 in Schaltungen
benutzt, wobei hier Leseanschluss- und Schreibanschluss-Verbindungen die
Zellfläche
der Register dominieren.
-
Zusätzlich zur starken Einsparung
von Schaltungsfläche
führt die
multidimensionale Registerdatei 1300 mit Vorteil zu schnelleren
Zugriffszeiten, die in der Hauptsache durch die Reduzierung der Gesamtkapazität auf den
Bitleitungen erreicht werden. In einer herkömmlichen "Einzelfenster"-Implementierung
verbindet nur eine Bitleitung ein Fenster im Vergleich zu allen
Fenstern in der multidimensionalen Registerdatei 1300.
Die multidimensionale Registerdatei 1300 führt zu einer
reduzierten Gesamtfläche
und kürzeren
Bitleitungen, was die Kapazität reduziert.
Ein Bitleitungstreiber kann infolge der Logik, welche von den Bitzellen
gemeinsam benutzt wird, vergrößert werden,
was die Bitleitungsentladung vergrößert. Zusätzlich führt das unabhängige Decodieren
zwischen dem Fensterzeiger und dem Registerindex zu einem schnelleren
Betrieb.
-
Die multidimensionale Registerdatei 1300 wird
mit Vorteil für
Prozessoren einschließlich
Hochleistungs-Superskalarprozessoren als eine Registerdatei benutzt,
wobei aber die angewandten Techniken und Strukturen ansonsten in
anderen Typen von Speicherbauelementen benutzt werden können. Zum Beispiel
können
multidimensionale Speicherstrukturen ansonsten in verschiedenen
VLIW-Speicherstrukturen, welche typischerweise viele Anschlüsse benutzen,
und in Prozessoren implementiert werden, die schnell Kontext umschalten,
welche verschiedene Kontexte durch eine einzige Struktur unterstützen.
-
Die beschriebene Prozessorstruktur
und das Betriebsverfahren können
in vielen strukturellen Variationen implementiert werden. Zum Beispiel
werden zwei Prozessorkerne mit einem On-Chip-Set-assoziativen L2-Cache
in einem System kombiniert. In einem anderen Beispiel werden vier
Prozessorkerne mit einer direkten RAMBUS-Schnittstelle ohne externem
L2-Cache kombiniert. Eine zahllose Anzahl von Variationen ist möglich. In
manchen Systemen ist jeder Prozessorkern eine vertikal gethreadete
Pipeline.
-
Während
die Erfindung mit Bezug zu verschiedenen Ausführungsbeispielen beschrieben
worden ist, ist es so zu verstehen, dass diese Ausführungsbeispiele
nur erklärenden
Charakter haben und dass der Bereich der Erfindung nicht durch sie
begrenzt ist. Viele Variationen, Modifikationen, Hinzufügungen und
Verbesserungen der beschriebenen Ausführungsbeispiele sind möglich. Zum
Beispiel wird der Fachmann leicht die notwendigen Schritte imple mentieren
können,
um die hier offenbarten Strukturen und Verfahren zur Verfügung zu
stellen und wird verstehen, dass die Prozessparameter, Materialien
und Dimensionen nur als Beispiel angegeben wurden und verändert werden
können,
um die gewünschten
Strukturen als auch Modifikationen zu erreichen, welche innerhalb
dem Bereich der Erfindung liegen. Variationen und Modifikationen
der Ausführungsbeispiele,
die hier offenbart sind, können
auf der hier fortgesetzten Beschreibung und dem Wissen und der Erfahrung
des Fachmanns ohne den Bereich der Erfindung zu verlassen, so wie
er in den folgenden Ansprüchen
beschrieben ist, basieren. Zum Beispiel kann, obwohl die beispielhaften
Prozessoren eine vorgegebene Anzahl von Threads pro Pipeline und
eine vorgegebene Anzahl von Pipelines pro integriertem Schaltungschip
enthalten, in Abhängigkeit von
den gewünschten
Prozessoranwendungen, Halbleiterherstellungstechniken und verschiedenen Größenparametern
des Prozessors, in anderen Beispielen eine unterschiedliche Anzahl
von Threads und Pipelines implementiert werden.
-
Die hier enthaltenen Beschreibungen
beziehen sich auf viele Aspekte der Prozessorstruktur und der Verarbeitungstechniken,
wobei diese strukturelle und funktionelle Aspekte von verschiedenen
Prozessorkomponenten enthalten. Die Strukturen und Techniken sind
so beschrieben, dass sie sehr nützlich
in der Kombination sind. Jedoch sind auch verschiedene Strukturen
und Techniken innovativ und sehr vorteilhaft, wenn sie alleine oder
in vielen verschiedenen Unterkombinationen verwendet werden. Die
Erfindung wird durch die Ansprüche
allein abgegrenzt und verschiedene Begrenzungen, welche in der Beschreibung
beschrieben sind, die aber nicht in einem besonderen Anspruch enthalten
sind, sollen nicht als inhärenter
Bestandteil des Anspruchs durch bloße Einbeziehung in die Beschreibung
betrachtet werden.