-
GEBIET DER
ERFINDUNG
-
Die
vorliegende Erfindung betrifft allgemein das Gebiet multithreading-fähiger bzw.
Multithread-Prozessoren und im Besonderen ein Verfahren und eine
Vorrichtung zum zum Ausführen
einer Umschaltoperation für
Kontext (oder Threads) in einem multithreading-fähigen Prozessor.
-
STAND DER
TECHNIK
-
Das
Design der multithreading-fähigen
(MT) Prozessoren wurde in letzter Zeit zunehmend als attraktive
Option zur Verbesserung der Leistung von Prozessoren betrachtet.
Das Multithreading in einem Prozessor stellt unter anderem das Potenzial
bereit, verschiedene Prozessorressourcen effektiver zu nutzen und
im Besonderen zur effektiveren Nutzung der Ausführungslogik in einem Prozessor.
Durch die Zufuhr mehrerer Threads an die Ausführungslogik eines Prozessors
können
im Besonderen Taktzyklen, die sich ansonsten durch ein Anhalten
oder eine andere Verzögerung
der Verarbeitung eines bestimmten Threads im Ruhezustand befinden
würden,
für die Behandlung
eines anderen Threads verwendet werden. Ein Anhalten der Verarbeitung
eines bestimmten Threads kann eine Folge einer Reihe von Ereignissen
in einer Prozessor-Pipeline sein. Zum Beispiel führt ein Cache-Miss oder eine
falsch vorhergesagte Verzweigung (d.h. eine Operation mit langer
Latenzzeit) für
einen in einem Thread enthaltenen Befehl für gewöhnlich zu der Verarbeitung
des relevanten Anhaltens des Threads. Der negative Effekt von Operationen
mit langer Latenzzeit auf die Effizienz einer Ausführungslogik
wird verstärkt
durch die Steigerungen des Durchsatzes von Ausführungslogiken in letzter Zeit,
welche Fortschritte in Bezug auf die Speicherzugriffsraten und die
Speicherabrufraten überholt
haben.
-
Multithreading-fähige Computeranwendungen
werden zunehmend zur Regel in Anbetracht der Unterstützung, die
für derartige
multithreading-fähige Anwendungen
durch eine Reihe weit verbreiteter Betriebssysteme bereitgestellt
wird, wie zum Beispiel Windows NT® oder
Unix. Multithreading-fähige
Computeranwendungen sind besonders effizient auf dem Gebiet der
Multimedia-Anwendungen.
-
Multithreading-fähige Prozessoren
können grob
in zwei Kategorien eingeteilt werden (d.h. feine oder grobe Designs
bzw. Strukturen), und zwar gemäß der Thread-Verschachtelung
oder des Wechsel- bzw. Umschaltsystems, die in dem jeweils relevanten Prozessor
eingesetzt werden. Feine multithreading-fähige
Designs unterstützen
mehrere aktive Threads in einem Prozessor und verschachteln für gewöhnlich zwei
verschiedene Threads Zyklus für Zyklus.
Grobe multithreading-fähige
Designs verschachteln für
gewöhnlich
Befehle bzw. Anweisungen unterschiedlicher Threads beim Eintreten
eines gewissen Ereignisses mit langer Latenzzeit, wie etwa eines
Cache-Miss. Ein grobes multithreading-fähiges Design wird erörtert in „Evaluation
of Multithreaded Uniprocessors for Commercial Application Environments" von R. Eickenmayer,
R. Johnson et al., The 23rd Annual International Symposium on Computer Architecture,
Seiten 203 – 212,
Mai 1996. Die Unterscheidungen zwischen feinen und groben Designs werden
ferner erörtert
in "Architectural
and Implementation Tradeoffs in the Design of Multiple-Context Processors" von J. Laudon, A.
Gupta, Multithreaded Computer Architectures: A Summary of the State
of the Art, editiert von R.A. Iannuci et al., Seiten 167 – 200, Kluwer
Academic Publishers, Norwell, Massachusetts, USA, 1994. Laudon schlägt ferner
ein verschachteltes System vor, das das Umschalten bzw. Wechseln
eines feinen Designs Zyklus für
Zyklus kombiniert mit den vollen Pipeline-Verriegelungsschachtelungen eines groben
Designs (oder gesperrtes System). Zu diesem Zweck schlägt Laudon
einen „Rückzugs"-Befehl vor, der
einen bestimmten Thread (oder Kontext) für eine bestimmte Anzahl von
Zyklen nicht verfügbar
macht. Ein derartiger „Rückzugs"-Befehl kann ausgegeben
werden nach dem Auftreten vorbestimmter Ereignisse, wie etwa eines
Cache-Miss. Auf diese Weise vermeidet Laudon die Notwendigkeit für die Ausführung eines
tatsächlichen
Thread-Wechsels, indem einer der Threads einfach nicht verfügbar gemacht
wird.
-
Das
U.S. Patent US-A-5.761.522 offenbart ein Programmsteuerungssystem
mit einer Mehrzahl von Programmen und einer entsprechenden Anzahl von
Ausführungseinrichtungen
zum Ausführen
der Programme, einem Speicher zum Speichern der Programme, mit Programmzählern, von
denen jeder eine Adresse aus dem Speicher erzeugt, und einer Auswahleinrichtung
zum Auswählen
einer Ausgabe eines der Programmzähler sowie zum Bereitstellen der
Ausgabe an den Speicher. Die Programmzähler werden sequentiell bei
jeder Eingabe gemäß einer Programmzähler-Umschaltregel
umgeschaltet.
-
ZUSAMMENFASSUNG
DER ERFINDUNG
-
Vorgesehen
ist gemäß der vorliegenden
Erfindung ein Verfahren zum Ausführen
einer Thread-Umschaltoperation in einem Multithread-Prozessor. Die
Verteilung einer ersten vorbestimmten Menge von Befehlsdaten für einen
ersten Thread von einer Befehlsdatenquelle in einem Multithread-Prozessor
wird detektiert. Als Reaktion auf das Detektieren der Verteilung
der ersten vorbestimmten Menge von Befehlsdaten für den ersten
Thread beginnt die Verteilung von Befehlsdaten für einen zweiten Thread von
der Befehlsdatenquelle.
-
Weitere
Merkmale der vorliegenden Erfindung werden aus den beigefügten Zeichnungen
und aus der folgenden genauen Beschreibung deutlich.
-
KURZE BESCHREIBUNG
DER ZEICHNUNGEN
-
Die
vorliegende Erfindung wird in den Abbildungen der anhängigen Zeichnungen
beispielhaft und ohne Einschränkung
veranschaulicht, wobei ähnliche
bzw. identische Elemente mit den gleichen Bezugszeichen bezeichnet
sind. In den Zeichnungen zeigen:
-
1 ein
Blockdiagramm eines Beispiels für eine
Pipeline eines Prozessors, in der die vorliegende Erfindung implementiert
werden kann;
-
2 ein
Blockdiagramm eines beispielhaften Ausführungsbeispiels eines Prozessors
in Form eines multithreading-fähigen
Universal-Mikroprozessors, in dem die vorliegende Erfindung implementiert werden
kann;
-
3 ein
Blockdiagramm weiterer Einzelheiten in Bezug auf die Architektur
eines Ausführungsbeispiels
einer Mikrobefehls-Umsetzungs-Engine, die
in dem Universal-Mikroprozessor aus 2 vorhanden
ist;
-
4 ein
Blockdiagramm ausgesuchter Komponenten eines beispielhaften multithreading-fähigen Mikroprozessors
und zeigt speziell verschiedene funktionale Einheiten, die eine
Pufferfähigkeit
bereitstellen, als logische Partition bzw. Unterteilung zur Berücksichtigung
mehrerer Threads;
-
5 ein
Blockdiagramm weiterer Einzelheiten in Bezug auf ein Beispiel für einen
Befehls-Streaming-Puffer gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung;
-
6 ein
Blockdiagramm der logischen Komponenten der Thread-Umschaltungs-Steuerlogik
gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung;
-
7 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zur Bestimmung eines Anfangs-Threads, wenn
sich mehrere Threads in dem multithreading-Prozessor im Ruhezustand
befinden bzw. inaktiv sind;
-
8 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Verteilen eines Verzweigungsbefehls eines aktuellen
Threads von einer Befehlsquelle;
-
9 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Auftreten eines Anhaltens mit langer Latenzzeit;
-
10 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Auftreten einer internen Pipeline-Löschoperation;
-
11 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Auftreten eines Zustands „kein Datenfluss" in Bezug auf einen
bestimmten Thread;
-
12 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Verteilen einer vorbestimmten Befehlsdatenmenge für einen
bestimmten Thread von einem Befehls-Streaming-Puffer an einen Befehls-Vordecodierer;
-
13 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Auftreten einer externen Pipeline-Löschoperation;
-
14 ein
Flussdiagramm des Verfahrens gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Detektieren eines eingefügten Flusses innerhalb eines
Befehlsstroms für
einen aktuellen Thread;
-
die 15A und 15B schematische Darstellungen
der Struktur der entsprechenden Ausführungsbeispiele der Thread-Umschalt-Steuerlogik gemäß der vorliegenden
Erfindung, die in der Abbildung aus 6 als Blockdiagramm
dargestellt ist; und
-
16 eine
schematische Darstellung der Logik gemäß einem Ausführungsbeispiel
der vorliegenden Erfindung zum Einfügen einer Ablaufmarkierung
(oder eines eingefügten
Flusses bzw. Ablaufs) in einen Befehlsstrom;
-
GENAUE BESCHREIBUNG
-
Beschrieben
werden ein Verfahren und eine Vorrichtung zum Wechseln bzw. Umschalten
von Threads in einem multithreading-fähigen
Prozessor. In der folgenden Beschreibung sind zu Erläuterungszwecken
zahlreiche besondere Einzelheiten ausgeführt, um ein umfassendes Verständnis der
vorliegenden Erfindung zu vermitteln. Für den Fachmann auf dem Gebiet
ist es jedoch ersichtlich, dass die vorliegende Erfindung auch ohne
diese besonderen Einzelheiten ausgeführt werden kann.
-
Im
Sinne der vorliegenden Patentschrift umfasst der Begriff „Verteilen" (englisch: „Dispatch") das tatsächliche
bzw. praktische Senden oder Ausbreiten von Daten von einem Standort
oder einer funktionalen Einheit sowie die Schritte, die in Vorbereitung
auf das eigentliche Senden oder Ausbreiten der Daten getroffen werden.
Der Begriff „Verteilen" umfasst zum Beispiel
das Anordnen von Daten in einer bestimmten Reihenfolge bzw. Anordnung
oder einem bestimmten Zustand der Bereitschaft zum Verteilen von einem
Speicherort oder Puffer.
-
Prozessor-Pipeline
-
Die
Abbildung aus 1 zeigt ein High-Level-Blockdiagramm
eines Ausführungsbeispiels
der Prozessor-Pipeline 10, in der die vorliegende Erfindung
implementiert werden kann. Im Sinne der vorliegenden Patentschrift
umfasst der Begriff „Prozessor" jede Vorrichtung
bzw. Maschine, die eine Folge von Befehlen (z.B. Makro- oder Mikrobefehle)
ausführen kann
und umfasst, ohne darauf beschränkt
zu sein, Universal-Mikroprozessoren, Mikroprozessoren für einen
bestimmten Zweck, Grafiksteuereinheiten, Audio-Steuereinheiten,
Multimedia- Steuereinheiten, Multimedia-Steuereinheiten,
Mikrocontroller oder Netzwerksteuereinheiten. Ferner bezieht sich
der Begriff „Prozessor" unter anderem auf
CISC-Prozessoren (Rechner mit komplexem Befehlsvorrat), RISC-Prozessoren
(Rechner mit begrenztem Befehlsvorrat) oder VLIW-Prozessoren (Prozessoren mit
sehr langem Befehlswort). Die Pipeline 10 weist eine Reihe
von Pipe-Stufen auf, beginnend mit einer Erfassungs-Pipe-Stufe 12,
in der Befehle (z.B. Makrobefehle) abgerufen und der Pipeline 10 zugeführt werden.
Zum Beispiel kann ein Makrobefehl aus einem Cache-Speicher abgerufen
werden, der integral in dem Prozessor vorgesehen oder diesem eng
zugeordnet ist, oder er kann über
einen Prozessorbus aus einem externen Hauptspeicher abgerufen werden.
Aus der Erfassungs-Pipe-Stufe 12 werden
die Makrobefehle zu einer Decodierungs-Pipe-Stufe 14 weitergeleitet,
wo Makrobefehle umgesetzt werden in Mikrobefehle (auch als „Mikrocode" bezeichnet), die sich
zur Ausführung
in dem Prozessor eignen. Die Mikrobefehle werden danach weiter an
eine Zuweisungs-Pipe-Stufe 16 geleitet, wo Prozessorressourcen
den verschiedenen Mikrobefehlen gemäß der Verfügbarkeit und dem Bedarf zugewiesen
werden. Die Mikrobefehle werden danach in einer Ausführungsstufe 18 ausgeführt, bevor
sie in einer Rückzugs-Pipe-Stufe 20 zurückgezogen
werden.
-
Mikroprozessorarchitektur
-
Die
Abbildung aus 2 zeigt ein Blockdiagramm eines
exemplarischen Ausführungsbeispiels eines
Prozessors 30 in Form eines Universal-Mikroprozessors,
in dem die vorliegende Erfindung implementiert werden kann. Der
Mikroprozessor 30 ist nachstehend als ein multithreading-fähiger (MT)
Prozessor beschrieben und ist somit in der Lage, mehrere Befehls-Threads
(oder Kontexte) gleichzeitig zu verarbeiten. Eine Reihe der nachstehend
in der Beschreibung bereitgestellten Lehren. ist jedoch nicht spezifisch
für einen
multithreading-fähigen
Prozessor und kann auch in einem Prozessor mit nur einem Thread
angewandt werden. In einem exemplarischen Ausführungsbeispiel kann der Prozessor 30 einen Mikroprozessor
mit Intel Architektur (IT) umfassen, der den Befehlssatz der Intel
Architektur ausführen kann.
-
Der
Mikroprozessor 30 umfasst ein geordnetes (in-order) Front-End und ein ungeordnetes (out-of-order)
Back-End. Das geordnete Front-End weist eine Busschnittstelleneinheit 32 auf,
die als die Leitung zwischen dem Prozessor 30 und anderen Komponenten
(z.B. einem Hauptspeicher) eines Computersystems fungiert, in dem
der Mikroprozessor 30 eingesetzt werden kann. Zu diesem
Zweck koppelt die Busschnittstelleneinheit 32 den Mikroprozessor 30 mit
einem Prozessorbus (nicht abgebildet), über den Daten und Steuerinformationen
von dem Mikroprozessor 30 empfangen und weitergeleitet werden
können.
Die Busschnittstelleneinheit 32 weist eine Front Side Bus
(FSB) Logik 34 auf, welche Datenübertragungen bzw. Kommunikationen über den Prozessorbus
steuert. Die Busschnittstelleneinheit 32 empfängt gemäß der Abbildung
Busanforderungen 38 von einer Speicherausführungseinheit 42 und sendet
Snoops oder Busrückführungen
an die Einheit, wobei diese eine lokale Speicherfunktion in dem Mikroprozessor 30 bereitstellt.
Die Speicherausführungseinheit 42 weist
einen unifizierten Daten- und Befehls-Cache 44,
einen Translation Lookaside Buffer (TLB) 46 und einen Speicheranordnungspuffer 48 auf.
Die Speicherausführungseinheit 42 empfängt Befehlserfassungsanforderungen 50 von
einer Mikrobefehls-Umsetzungs-Engine 54 und
führt dieser Originalbefehle 52 (d.h.
codierte Makrobefehle) zu, wobei die Engine die empfangenen Makrobefehle
in eine entsprechende Gruppe von Mikrobefehlen umwandelt. Die Mikrobefehls-Umsetzungs-Engine 54 ist weiter
unten im Text näher
beschrieben.
-
Von
der Mikrobefehls-Umsetzungs-Engine 54 werden decodierte
Befehle (d.h. Mikrobefehle) zu einer Trace-Zustellungs-Engine 60 übermittelt.
Die Trace-Zustellungs-Engine 60 weist einen Trace-Cache 62,
einen Trace-Verzweigungsprädiktor
(BTB) 64, einen Mikrocode-Sequencer 66 und eine
Mikrocode (uop) Warteschlange 68 auf. Die Trace-Zustellungs-Engine 60 fungiert
als ein Mikrobefehls-Cache und ist die primäre Quelle für Mikrobefehle für eine nachgelagerte
Ausführungseinheit 70.
Durch die Bereitstellung einer Caching-Funktion für Mikrobefehle in
der Prozessor-Pipeline ermöglicht
die Trace-Zustellungs-Engine 60 und
im Besonderen der Trace-Cache 62 die Optimierung der von
der Mikrobefehls-Umsetzungs-Engine 54 vorgenommenen Umsetzungsarbeit,
so dass eine erhöhte
Mikrobefehlsbandbreite vorgesehen wird. In einem exemplarischen
Ausführungsbeispiel
kann der Trace-Cache 62 einen 256 Satz, 8-fach-Satz-Assoziativspeicher
umfassen. Der Begriff „Trace" kann in dem vorliegenden Ausführungsbeispiel
eine Folge bzw. Sequenz von Mikrobefehlen betreffen, die in Einträgen des
Trace-Cache 62 gespeichert ist, wobei jeder Eintrag Zeiger
auf die Trace bildende vorangehende oder folgende Mikrobefehle aufweisen.
Auf diese Weise erleichtert der Trace-Cache 62 die Hochleistungs-Ablaufsteuerung
dadurch, dass die Adresse des nächsten
Eintrags, auf den zugegriffen werden soll, um einen folgenden Mikrobefehl
zu erhalten, bekannt ist, bevor ein aktueller Zugriff abgeschlossen
ist. Traces können
in einem Ausführungsbeispiel
als „Blöcke" von Befehlen betrachtet
werden, die durch Trace-Köpfe
voneinander unterschieden werden können und die enden, wenn eine
indirekte Verzweigung auftritt oder eine von vielen gegebenen Schwellenwertbedingungen
erreicht wird, wie etwa die Anzahl der bedingten Verzweigungen,
die in einem Trace enthalten sein können, oder die maximale Anzahl
von der Mikrobefehle insgesamt, die einen Trace umfassen.
-
Der
Trace-Cache-Verzweigungsprädiktor 64 stellt
lokale Verzweigungsprädiktionen
bereit, welche Traces in dem Trace-Cache 62 betreffen. Der Trace-Cache 62 und
der Mikrocode-Sequencer 66 stellen
Mikrobefehle an die Mikrocode-Warteschlange 68 bereit,
von wo die Mikrobefehle danach einem Out-of-Order-Ausführungs-Cluster
zugeführt
werden. Folglich kann der Mikroprozessor 30 so betrachtet
werden, dass er ein In-Order-Front-Ende aufweist, mit der Busschnittstelleneinheit 32,
der Speicherausführungseinheit 42,
der Mikrobefehls-Umsetzungs-Engine 54 und
der Trace-Zustellungs-Engine 60 und einem nachstehend im
Text beschriebenen Out-of-Order-Back-End.
-
Aus
der Mikrocode-Warteschlange 68 ausgegebene Mikrobefehle
werden in einem Out-of-Order-Cluster 71 empfangen, das
einen Scheduler 72, eine Registerumbenennungseinrichtung 74,
eine Zuweisungseinrichtung 76, einen Umordnungspuffer bzw.
Reorder Buffer 78 und eine Wiedergabewarteschlange 80 umfasst.
Der Scheduler 72 weist eine Reihe von Reservierungsstationen
auf und arbeitet so, dass er Mikrobefehle zeitlich einteilt und
zur Ausführung
durch die Ausführungseinheit 70 ausgibt.
Die Registerumbenennungseinrichtung 74 führt eine Funktion
der Registerumbenennung in Bezug auf verdeckte ganzzahlige und Gleitkommaregister
aus (die an Stelle jedes der acht Universalregister oder jedes der
acht Gleitkommaregister verwendet werden können, wenn ein Prozessor 30 einen
Befehlsvorrat der Intel Architektur ausführt). Die Zuordnungs- bzw. Zuweisungseinrichtung 76 weist
Ressourcen der Ausführungseinheit 70 und
des Clusters 71 Mikrobefehlen gemäß der Verfügbarkeit und des Bedarfs zu.
Wenn unzureichende Ressourcen für
die Verarbeitung eines Mikrobefehls zur Verfügung stehen, ist die Zuordnungseinrichtung 76 verantwortlich für die Aktivierung
eines Anhaltesignals 82, das durch die Trace-Zustellungs-Engine 60 an
die Mikrobefehls-Umsetzungs-Engine 54 geleitet
wird, wie dies unter 58 dargestellt ist. Mikrobefehle,
deren Quellenfelder durch die Registerumbenennungseinrichtung 74 angepasst
worden sind, werden in strenger Programmreihenfolge in einem Umordnungspuffer 78 platziert.
Wenn Mikrobefehle in dem Umordnungspuffer 78 die Ausführung abgeschlossen
haben und für
den Rückzug
bzw. die Rückordnung
bereit stehen, werden danach aus einem Umordnungspuffer entfernt
und in der richtigen Reihenfolge abgerufen (d.h. gemäß der ursprünglichen
Programmreihenfolge). Die Wiedergabewarteschlange 80 leitet Mikrobefehle
weiter, die von der Ausführungseinheit 70 wiedergegeben
werden sollen.
-
Die
Ausführungseinheit 70 weist
in der Abbildung eine Gleitkomma-Ausführungs-Engine 84,
eine ganzzahlige Ausführungs-Engine 86 und
einen Level-0-Datencache 88 auf. In einem exemplarischen Ausführungsbeispiel,
in dem der Mikroprozessor 30 einen Befehlsvorrat der Intel
Architektur ausführt, kann
die Gleitkomma-Ausführungs-Engine 84 ferner MMX® Befehle
ausführen.
-
Mikrobefehls-Umsetzungs-Engine
-
Die
Abbildung aus 3 zeigt ein Blockdiagramm mit
näheren
Einzelheiten zu der Architektur eines exemplarischen Ausführungsbeispiels
der Mikrobefehls-Umsetzungs-Engine 54. Die Mikrobefehls-Umsetzungs-Engine 54 arbeitet
effektiv als eine „Miss
Handler" für den Trace-Cache,
wobei sie Mikrobefehle im Falle eines Trace-Cache-Miss dem Trace-Cache 64 zuführt.
-
Zu
diesem Zweck arbeitet die Mikrobefehls-Umsetzungs-Engine 54 so,
dass sie die Erfassungs- und Decodierungs-Pipe-Stufen 12 und 14 für den Fall
eines Trace-Cache-Miss bereitstellt. Die Mikrobefehls-Umsetzungs-Engine 54 weist
in der Abbildung einen Zeiger auf den nächsten Befehl (NIP) 100,
einen Befehls-Translation
Lookaside BUffer (TLB) 102, einen Verzweigungsprädiktor 104,
einen Befehls-Streaming-Puffer 106, einen Befehls-Vordecodierer 108,
eine Befehlsleitlogik 110, einen Befehlsdecodierer 112 und
eine Verzweigungsadressen-Berechnungseinrichtung 114 auf.
Der Zeiger auf den nächsten
Befehl (NIP) 100, der Verzweigungsprädiktor 104 und der
Befehls-Streaming-Puffer 106 bilden gemeinsam eine Verzweigungs-Prädiktionseinheit
(BPU) 99. Der Befehlsdecodierer 112 und die Verzweigungsadressen-Berechnungseinrichtung 114 bildet
gemeinsam eine Befehls-Umsetzungseinheit
(IX-Einheit) 113.
-
Der
Zeiger auf den nächsten
Befehl (NIP) 100 gibt Anforderungen für. den nächsten Befehl an den Unified-Cache 44 aus.
In dem exemplarischen Ausführungsbeispiel,
in dem der Mikroprozessor 30 einen multithreading-fähigen Mikroprozessor
umfasst, der zwei Threads verarbeiten kann, so kann der Zeiger auf
den nächsten
Befehl (NIP) 100 einen Multiplexer (MUX) (nicht abgebildet)
aufweisen, der zwischen Befehlszeigern auswählt, die entweder einem ersten
oder zweiten Thread zugeordnet sind, um in die von dort ausgegebene
nächste
Befehlsanforderung aufgenommen zu werden. In einem Ausführungsbeispiel
verschachtelt der Zeiger auf den nächsten Befehl 100 Anforderungen
für die
ersten und zweiten Threads Zyklus für Zyklus („Ping Pong"), wobei angenommen wird, dass Befehle
für beide Threads
angefordert worden sind, und wobei die Ressourcen des Befehls-Streaming-Puffers 106 für beide
Threads nicht erschöpft
sind. Die Anforderungen des Zeigers auf den nächsten Befehl können somit
entweder 16, 32 oder 64 Bytes betreffen, abhängig davon, ob sich die erste
Anforderungsadresse in der oberen Hälfte einer ausgerichteten 32-Byte-
oder 64-Byte-Zeile befindet. Der Zeiger auf den nächsten Befehl 100 kann
durch die Verzweigungs-Prädiktionseinheit 104,
die Verzweigungsadressen-Berechnungseinrichtung
oder durch den Trace-Cache 62 umgeleitet werden, wobei
es sich bei einer Trace-Cace-Miss-Anforderung um die Umleitungsanforderung
mit der höchsten
Priorität
handelt.
-
Wenn
der Zeiger auf den nächsten
Befehl 100 eine Befehlsanforderung an den Unified-Cache 44 richtet,
erzeugt er einen Zwei-Bit-„Anforderungsbezeichner", der der Befehlsanordnung
zugeordnet ist und die Funktion eines „Tag" für
die relevante Befehlsanforderung erfüllt. Wenn als Reaktion auf
eine Befehlsanforderung Daten zurückgegeben werden, gibt der
Unified-Cache 44 die folgenden Tags oder Bezeichner gemeinsam
mit den Daten aus:
- 1. dem „Anforderungsbezeichner", der durch den Zeiger
auf den nächsten
Befehl 100 vorgesehen wird;
- 2. einem „Chunk-Bezeichner" von drei Bit, der
den zurückgegebenen
Chunk identifiziert; und
- 3. einem „Thread-Bezeichner", der den Thread identifiziert,
dem die zurückgegebenen
Daten angehören.
-
Anforderungen
für den
nächsten
Befehl werden von dem Zeiger auf den nächsten Befehl 100 an den
Befehls-TLB 102 weitergeleitet, der eine Adressverweisoperation
ausführt
und eine physikalische Adresse an den unifizierten Cache 44 bereitstellt.
Der unifizierte Cache 44 stelle einen entsprechenden Makrobefehl
an den Befehls-Streaming-Puffer 106 bereit. Jede Anforderung
eines nächsten
Befehls wird auch direkt von dem Zeiger auf den nächsten Befehl 100 zu
dem Befehls-Streaming-Puffer 106 geleitet, um es zu ermöglichen,
dass der Befehls-Streaming-Puffer 106 den Thread identifiziert,
zu. dem ein von dem unifizierten Cache 44 empfangener Makrobefehl
gehört.
Die Makrobefehle von ersten und zweiten Threads werden danach durch
den Befehls-Streaming-Puffer 106 an
den Befehls-Vordecodierer 108 ausgegeben, der eine Reihe
von Längenberechnungs-
und Byte-Markierungsoperationen
in Bezug auf einen empfangenen Befehlsstrom (von Makrobefehlen)
ausführt.
Im Besonderen der Befehls-Vordecodierer 108 erzeugt eine
Reihe von Byte-Markierungsvektoren,
die unter anderem dazu dienen, Makrobefehle innerhalb des Befehlsstroms
abzugrenzen, der zu der Befehlsleitlogik 110 geleitet wird.
Die Befehlsleitlogik 110 verwendet danach die Byte-Markierungsvektoren,
um diskrete Makrobefehle zum Zwecke der Decodierung zu dem Befehlsdecodierer 112 zu
leiten. Makrobefehle werden auch von der Befehlsleitlogik 110 zum
Zwecke der Berechnung der Verzweigungsadresse zu der Verzweigungsadressen-Berechnungseinrichtung 114 geleitet.
Danach werden Makrobefehle von dem Befehlsdecodierer 112 zu
der Trace-Zustellungs-Engine
bzw. Trace Delivery Engine 60 geleitet.
-
Multithreading-Implementierung
-
Aus
dem in der Abbildung aus 2 veranschaulichten exemplarischen
Ausführungsbeispiel des
Mikroprozessors 30 ist ersichtlich, dass eine begrenzte
Duplizierung oder Replikation von Ressourcen gegeben ist. Zur Bereitstellung
einer Multithreading-Fähigkeit
in einem Prozessor, in dem eine begrenzte Replikation der funktionalen
Einheiten gegeben ist, ist es erforderlich, zwischen den Threads eine
gewisse gemeinsame Nutzung von Ressourcen zu implementieren. Hiermit
wird festgestellt, dass das verwendete System zur gemeinsamen Nutzung
von Ressourcen von der Anzahl der Threads abhängig ist, welche der Prozessor
gleichzeitig verarbeiten kann. Da funktionale Einheiten in einem
Prozessor für
gewöhnlich
eine gewisse Pufferfunktion (oder Speicherfunktion) und Ausbreitungs-
bzw. Verteilungsfunktion bereitstellen, kann der Aspekt der gemeinsamen
Nutzung von Ressourcen so gesehen werden, dass dies folgendes umfasst:
(1) das Speichern und (2) Verarbeiten/Verteilen von Bandbreite gemeinsam
nutzenden Komponenten. In einem Prozessor, der zum Beispiel die
gleichzeitige Verarbeitung von zwei Threads unterstützt, können die
Pufferressourcen in verschiedenen funktionalen Einheiten statisch
oder logisch zwischen zwei Threads aufgeteilt werden. In ähnlicher
Weise muss die Bandbreite, die durch einen Pfad für die Ausbreitung
bzw. Verbreitung von Informationen zwischen zwei funktionalen Einheiten
bereitgestellt wird, zwischen den beiden Threads aufgeteilt und
zugeordnet werden. Da diese Aspekte der gemeinsamen Nutzung von
Ressourcen an einer Reihe von Stellen in einer Prozessor-Pipeline
auftreten können,
können
an diesen verschiedenen Stellen unterschiedliche Methoden für die gemeinsame
Nutzung von Ressourcen eingesetzt werden, und zwar gemäß den Vorgaben
und den Merkmalen der jeweiligen Stelle. Hiermit wird festgestellt,
dass verschiedene Methoden für
die gemeinsame Nutzung von Ressourcen für verschiedene Stellen geeignet
sein können
in Anbetracht unterschiedlicher Funktionalitäten und Betriebseigenschaften.
-
Die
Abbildung aus 4 zeigt ein Blockdiagramm ausgewählter Komponenten
für ein
Ausführungsbeispiel
des Mikroprozessors 30 aus 3 und veranschaulicht
verschiedene funktionale Einheiten, die eine Pufferfähigkeit
bereitstellen, als logisch partitioniert, so dass sie zwei Threads
behandeln (d.h. Thread 0 und Thread 1). Die logische Partitionierung für die beiden
Threads der Puffer- (oder Speicher-) und Verarbeitungsfunktionen
einer funktionalen Einheit kann erreicht werden, indem eine erste
vorbestimmte Gruppe von Einträgen
in einer Pufferressource einem ersten Thread zugeordnet wird, und wobei
eine zweite vorbestimmte Gruppe von Einträgen in der Pufferressource
einem zweiten Thread zugeordnet wird. Dies kann speziell dadurch
erreicht werden, dass zwei Paare von Lese- und Schreibzeigern bereitgestellt
werden, wobei ein erstes Paar von Lese- und Schreibzeigern einem
ersten Thread zugeordnet ist, und wobei ein zweites Paar von Lese- und
Schreibzeigern einem zweiten Thread zugeordnet ist. Die erste Gruppe
von Lese- und Schreibzeigern kann auf eine erste vorbestimmte Anzahl
von Einträgen
in einer Pufferressource beschränkt
sein, während
die zweite Gruppe von Lese- und Schreibzeigern auf eine zweite vorbestimmte
Anzahl von Einträgen
in der gleichen Pufferressource beschränkt sein kann. In dem veranschaulichten
Ausführungsbeispiel
sind der Befehls-Streaming-Puffer 106, der Trace-Cache 62 und
eine Befehlswarteschlange 103 so dargestellt, dass sie
jeweils eine Speicherkapazität
bereitstellen, die logisch auf die ersten und zweiten Threads verteilt
sind.
-
Der
Aspekt der Bandbreitenzuweisung für einen Pfad zwischen funktionalen
Einheiten in einem Prozessor wird nachstehend im Text näher beschrieben.
-
Befehls-Streaming-Puffer
-
In
Bezug auf die Abbildung aus 3 speist der
Befehls-Streaming-Puffer 106 einen
Befehlsstrom in einen einzelnen Befehlsdecodierer 112 (d.h. es
existiert keine Decodierer-Replikation).
Zum die einzelne Decodierungsressource effektiv zu nutzen, ist es
wünschenswert
sicherzustellen, dass die Bandbreite des Pfads zwischen dem Befehls-Streaming-Puffer 106 und
dem Befehlsdecodierer 112 und folglich die „Decodierungsbandbreite" des Befehlsdecodierers 112 effizient unterteilt
und zugewiesen bzw. zugeordnet werden kann. Vorgesehen wird gemäß der vorliegenden
Erfindung somit ein Verfahren, durch welches eine Thread-Umschaltung
in Bezug auf zwei Befehlsströme
implementiert wird, die von dem Befehls-Streaming-Puffer 106 zugeführt werden.
Das vorliegende Verfahren der Thread-Umschaltung implementiert einen
Thread-Umschaltalgorithmus,
der versucht, die folgenden Ziele für das Thread-Umschalten zu
erreichen:
- • Das
Ausführen
eines Thread-Wechsels, wenn ein weiterer Thread Daten aufweist,
die nachgeschaltet (Downstream) verteilt werden können (z.B.
von dem Befehls-Streaming-Puffer 106);
- • Das
Umschalten von Threads, wenn ein aktueller Thread falsch ausgeführt wird
(z.B. wenn ein aktueller Thread ein Löschen des Back-Ends empfängt);
- • Das
Thread-Umschalten, um in der Downstream-Pipeline Fortschritte nach
vorne zu machen, bevor der Thread-Wechsel vorgenommen wird (z.B. indem
sichergestellt wird, dass mindestens ein vollständiger Befehl für einen
aktuellen Thread aus dem Befehls-Streaming-Puffer 106 ausgegeben
wird, bevor ein Thread-Wechsel von einem aktuellen Thread zu einem
Ziel-Thread ausgeführt
wird);
- • Das
Verhindern, dass ein Thread andere Threads verkümmern lässt ( z.B. indem eine Thread-Umschaltoperation
für einen
aktuellen Thread nur dann ausgeführt
wird, wenn eine vorbestimmte Menge von Befehlsdaten für einen
aktuellen Thread sich entlang der Prozessor-Pipeline ausgebreitet
hat, ohne dass andere Thread-Umschaltmechanismen
aufgerufen worden sind); und
- • Das
Amortisieren eines Thread-Umschaltabzugs (z.B. durch Ausgabe einer
vorbestimmten Mindestmenge von Befehlsdaten, bevor nach einer genommenen
Abzweigung gesucht wird, welche eine Thread-Umschaltoperation auslösen kann).
-
Die
vorliegende Erfindung wird nachstehend in Bezug auf ein exemplarisches
Ausführungsbeispiel
beschrieben, das für
die Auswahl zwischen Thread-Daten verwendet wird, gepuffert in dem
Befehls-Streaming-Puffer 106, zur Ausbreitung entlang eines
unitären
Pfads in Richtung des Befehlsdecodierers 112. Es ist jedoch
leicht ersichtlich, dass die Lehren der vorliegenden Erfindung an
jeder Stelle in einer Prozessor-Pipeline für die Zwecke des Thread-Umschaltens
oder Interleaving bzw. Verschachtelns eingesetzt werden können. Die
Abbildung aus 5 zeigt ein Blockdiagramm mit
näheren Einzelheiten
in Bezug auf die Struktur und die Architektur des Befehls-Streaming-Puffers 106.
Im Besonderen weist der Befehls-Streaming-Puffer 106 in
der Darstellung eine Speicheranordnung mit vier Einträgen 120 (Eintrag
0 – Eintrag
3) auf, die logisch partitioniert bzw. aufgeteilt sind in eine erste
Partition 122, die für
das Speichern von Befehlen eines ersten Threads (Thread 0) vorgesehen
ist, und eine zweite Partition 124, die für das Speichern
von Befehlen eines zweiten Threads (Thread 1) vorgesehen ist. In
einem Ausführungsbeispiel
bietet jeder der Einträge 120 Platz
für 8 Informations-Chunks,
und somit stellt der Befehls-Streaming-Puffer 106 16 Chunks
Daten-Cache je Thread
bereit.
-
Der
Befehls-Streaming-Puffer 106 weist ferner einen Zuordnungsblock 125 auf,
der das Schreiben und Lesen von Daten an und aus den logischen Partitionen 122 und 124 steuert.
-
Jede
der Partitionen 122 und 124 weist eine entsprechende
Zuordnungslogik 126 auf, die in dem Zuordnungsblock 125 vorhanden
ist. Jede Zuordnungslogik 126 weist einen Schreibzeiger 128 und
einen Lesezeiger 130 auf, die jeweils auf einen Eintrag 120 in
der zugeordneten Partition 122 bzw. 124 verweisen.
Jede Zuordnungslogik 26 empfängt einen Befehlsstrom von
dem Unified-Cache 44 und schreibt Chunks (d.h. 8 Bytes)
des Befehlsstroms in einen Eintrag 120 der ersten oder
der zweiten Partition 122 bzw. 124 gemäß den Thread-Spezifikationen. Durch
Prüfen
des jedem Daten-Chunk zugeordneten „Thread-Bezeichners" ist jede Zuordnungslogik 26 im Besonderen
in der Lage zu bestimmen, an welche Partition aus dem Unified-Cache 44 empfangene
Daten geschrieben werden sollen.
-
Jede
der Zuordnungslogiken 126 gibt Daten aus einer entsprechenden
Partition 122 oder 124 an einen MUX 132 aus,
der zwischen den Ausgaben der Partitionen 122 und 124 auf
der Basis eines Thread-Auswahlsignals 134 auswählt, das
durch die Thread-Umschalt-Steuerlogik 136 aktiviert bzw.
geltend gemacht wird. In dem exemplarischen Ausführungsbeispiel der vorliegenden
Erfindung ist es demgemäß die Thread-Umschalt-Steuerlogik 136,
die den Thread-Verschachtelungs- bzw. Umschaltmechanismus implementiert.
Die Thread-Umschalt-Steuerlogik 136 überwacht
gemäß der Darstellung
ferner die Ausgaben jeder der Partitionen 122 und 124 über die
Leitungen 138 und 140, so dass sie bestimmen kann,
wenn ein Daten-Chunk von einer der Partitionen 122 oder 124 verteilt
wird, und um zu identifizieren, von welcher der Partitionen das
Chunk verteilt worden ist. Das durch den MUX 132 zur Ausgabe
ausgewählte
Daten-Chunk wird danach in der Prozessor-Pipeline nach unten an
den Befehlsvordecodierer 108 und schließlich an zum Decodieren an
den Befehlsdecodierer 122 verteilt.
-
Die
Abbildung aus 6 zeigt ein Blockdiagramm der
logischen Komponenten der Thread-Umschalt-Steuerlogik 136.
Im Besonderen weist die Thread-Umschalt-Steuerlogik 136 gemäß der Abbildung
eine Switch-On-Idle-Logic (Einschalt- Ruhezustandslogik) 150, eine
Switch-On-Branch-Logic (Einschalt-Verzweigungslogik) 152,
eine Long-Latency-Stall-Logic
(Anhaltelogik mit langer Latenzzeit) 154, eine innere Löschlogik 156,
eine Logik für
keinen Datenfluss 158, eine Logik für einen erzwungenen Thread-Wechsel 160,
eine externe Löschlogik 162 und
eine Logik für
eingefügten
Ablauf 164 auf. Während
die Logiken 150 bis 164 in der Abbildung aus 6 als
diskrete Logiken dargestellt sind, gibt es eine umfassende gemeinsame
Komponentennutzung zwischen den verschiedenen Logiken, wie dies nachstehend
im Text beschrieben ist. Jede der Logiken 150 bis 164 implementiert
eine spezielle Funktion, die eine Aktivierung bzw. Geltendmachung
oder eine Deaktivierung bzw. Aufhebung der Geltendmachung des Auswahlsignals 134 an
den MUX 132 bewirken kann, so dass ein Thread-Wechsel bzw.
eine Thread-Umschaltoperation gemäß der nachstehenden Beschreibung
bewirkt wird. Die in jeder der Logiken 150 bis 164 enthaltene
Funktionalität
ist nachstehend im Text in Bezug auf die Flussdiagramme der Abbildungen
der 7 bis 14 näher beschrieen. Einzelheiten
eines besonderen Ausführungsbeispiels sind
in Bezug auf die Abbildungen der 15–16 beschrieben.
-
Die Switch-On-Idle-Logic
(Einschalt-Ruhezustandslogik) (150)
-
Die
Switch-On-Idle-Logic (Einschalt-Ruhezustandslogik) 150 bestimmt,
welcher Thread einer Mehrzahl von Threads als Start-Thread ausgewählt wird,
wenn alle Threads sich im Ruhezustand (Idle) befinden. Die Abbildung
aus 7 zeigt ein Flussdiagramm eines Verfahrens gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zur Bestimmung eines Start-Threads, wenn sich
zwei Threads in einem multithreading-fähigen Prozessor im Ruhezustand
befinden. Hiermit wird festgestellt, dass das Verfahren 200 auch
Anwendung in einem Multithreading-Prozessor finden kann, der mehr
als zwei Threads unterstützt.
Das Verfahren 200 kann in der Switch-On-Idle-Logic 150 implementiert
werden. Das Verfahren 200 beginnt mit dem Schritt 202 mit
einem Ruhezustand des Threads, in dem sich beide Threads (d.h. Thread
0 und Thread 1) in dem Ruhezustand befinden. In dem Schritt 204 wird
ein erster Thread (z.B. Thread 0) durch Aktivierung oder Deaktivierung
des Auswahlsignals 134 ausgewählt, und zwar zum Beispiel
nur auf der Basis der Anzeige in dem Mikrocode nach einem Pipeline-Löschereignis
(z.B. einem Pipeline-„Nuke" bzw. Löschvorgang).
In dem Entscheidungskästchen 206 wird
bestimmt, ob eine Anforderung für
einen Befehl von Thread 1 empfangen worden ist, bevor eine Anforderung
für einen
Befehl von Thread 0 empfangen worden ist. In Bezug auf die Abbildung
aus 5 ist es ersichtlich, dass die Thread-Umschalt-Steuerlogik 136 so
gekoppelt ist, dass sie über
ein Thread-Signal 137 von dem Zeiger auf den nächsten Befehl 100 eine
Anzeige in Bezug auf den nächsten
aus dem Unified-Cache 44 abgerufenen Befehl empfängt. Auf diese
Weise ist die Thread-Umschalt-Steuerlogik 136 und im Besonderen
die Switch-On-Idle-Logic 150 in der Lage, den Thread zu
identifizieren, an den die nächste
Befehlsanforderung gerichtet ist. Wenn in erneutem Bezug auf die
Abbildung aus 7 eine Anforderung für einen
Befehl von Thread 1 vor einer Anforderung für einen Befehl von Thread 0
empfangen wird, wird in dem Schritt 208 ein Thread-Wechsel
vorgenommen. Alternativ bleibt die aktuelle Thread-Auswahl in dem
Schritt 210 erhalten. Das Verfahren 200 endet
mit dem Schritt 212.
-
Die Switch-On-Branch-Logic
(Einschalt-Verzweigungslogik) (152)
-
In
einem Mikroprozessor 30, wie etwa dem in der Abbildung
aus 2 dargestellten Prozessor, der einen Verzweigungs-Prädiktionsmechanismus verwendet,
ist natürlich
die Möglichkeit
für eine
falsch vorhergesehene Verzweigung gegeben. Aus diesem Grund schlägt die vorliegende
Erfindung eine Thread-Umschaltmethode vor, die beim Auftreten einer
vorhergesehenen Verzweigungsprädiktion
durch die Verzweigungs-Prädiktionseinheit,
die in dem Befehlsstrom eines bestimmten Befehls AUSZUFÜHREN/GENOMMEN
ist, einen Thread-Wechsel ausführt.
Dies erfolgt zur Reduzierung der Zuordnung von Prozessorressourcen
an einen bestimmten Thread angesichts der Möglichkeit, dass der relevante
Verzweigungsbefehl falsch vorhergesagt worden ist sowie der spekulativen
Beschaffenheit des Befehlsstroms, der auf den Verzweigungsbefehl
folgt. Auf diese Weise kann verhindert werden, dass ein spekulativer
Befehlsstrom für
einen Thread, der einer falsch vorhergesehenen Verzweigung folgen
kann, zu tief in die Prozessor-Pipeline eindringt, zu Lasten eines
weiteren Threads, der für
eine größere Strecke auch
keinen Verzweigungsbefehl aufweisen kann.
-
Die
Abbildung aus 8 zeigt ein Flussdiagramm eines
Verfahrens 200 gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor bezüglich
der Ablaufsteuerung (oder Verteilung) eines Verzweigungsbefehls
eines aktuellen Threads (z.B. Thread 0) von dem Befehls-Streaming-Puffer 106 zu dem
Befehlsvordecodierer 108. Das Verfahren 220 beginnt
mit dem Schritt 222, in dem ein Verzweigungsbefehl durch
den Zuordnungsblock 125 so ablaufgesteuert wird, dass er
von einer logischen Partition 122 oder 124 der
Anordnung ausgegeben wird (z.B. von der logischen Partition 122,
die dem Thread 0 zugeordnet ist). Die Thread-Umschalt-Steuerlogik 136 und
im Besonderen die Switch-On-Branch-Logic 152 empfängt ein
Verzweigungsidentifikationssignal 224 (BPsbsawbranch) von
dem Zuordnungsblock 125 gemäß der Abbildung aus 5.
-
Das
Verzweigungsidentifikationssignal 224 wird durch den Zuordnungsblock 125 aktiviert,
um einen Verzweigungsbefehl zu identifizieren, der durch die Verzweigungsprädiktionseinheit 99 als
GENOMMEN prädiziert
wird. Im Besonderen nimmt die Verzweigungsprädiktionseinheit bzw. der Verzweigungsprädiktor 104 eine
Prädiktion
vor, ob ein bestimmter Verzweigungsbefehl genommen oder nicht genommen
wird unter Verwendung einer beliebigen einer Reihe allgemeiner Prädiktionen,
Methoden oder Algorithmen (z.B. auf der Basis einer aufgezeichneten Verzweigungshistorie
für den
relevanten Verzweigungsbefehl). Der Verzweigungsprädiktor 104 setzt dann
ein dem relevanten Befehl zugeordnetes Bit, das mit dem Befehl entlang
der Prozessor-Pipeline in Verbindung mit dem „Anforderungsbezeichner" ausgebreitet worden
ist, so dass eine Zuordnung zu der relevanten Zuordnung durch den
Zuordnungsblock 125 möglich
ist. Hiermit wird festgestellt, dass das Verzweigungsidentifikationssignal 224 nur
für Verzweigungsbefehle
aktiviert wird, für
die GENOMMEN (TAKEN) prädiziert
bzw. vorhergesagt wird, und nicht für Befehle, für die NICHT
GENOMMEN (NOT TAKEN) prädiziert
wird. In einem alternativen Ausführungsbeispiel
der vorliegenden Erfindung kann das Verzweigungsidentifikationssignal 224 auch
aktiviert werden, wenn ein beliebiger Verzweigungsbefehl auftritt,
für den
eine Prädiktion
vorgenommen worden ist.
-
Die
Abbildung aus 15 veranschaulicht das
Verzweigungsidentifikationssignal 224, das eine Eingabe
an ein UND-Gatter 225 bereitstellt.
-
In
dem Entscheidungskästchen 226 wird
bestimmt, ob eine vorbestimmte Mindestmenge von Befehlsdaten (z.B.
eine vorbestimmte Mindestanzahl von Chunks) für den aktuellen Thread (Thread
0) von dem Befehls-Streaming-Puffer 106 verteilt (oder
gesendet) worden ist. Zu diesem Zweck und in Bezug auf die Abbildung
aus 15A weist die Umschalt-Steuerlogik 136 einen
Zähler
in Form eines Schrittzählers
für gesendete
Chunks 228 auf, der einen Zählwert der von einer aktuellen
Logikpartition 122 oder 124 des Befehls-Streaming-Puffers 106 verteilten
Chunks vor einem Thread-Wechsel führt. Der Schrittzähler für gesendete
Chunks 228 wird durch die Ausgabe eines UND-Gatters 230 inkrementiert,
wobei das Gatter drei Eingänge
empfängt. Ein
Signal BPready 232 wird durch den Zuordnungsblock 125 aktiviert,
um anzuzeigen, dass ein Chunk für
die Verteilung von der relevanten Logikpartition 122 oder 124 bereit
steht. Ein Thread-Signal 234, das dem EINTRAG zugeordnet
ist (von der Thread-Umschalt-Steuerlogik 136), identifiziert
den Thread (und entsprechend die logische Partition 122 oder 124),
zu dem das für
die Verteilung bereit stehende Chunk gehört. Ein Signal NOT(IStall) 236 zeigt
an, dass kein Anhaltezustand an der Befehlsleitlogik 110 empfangen
worden ist. Beim Aktivieren der Signale 232–236 wird
der Ausgang des UND-Gatters 230 aktiviert bzw. geltend
gemacht, und der Schrittzähler
für gesendete Chunks 228 wird
heraufgesetzt, um die Ablaufsteuerung eines Chunks zur Verteilung
von dem Befehls-Streaming-Puffer 106 aufzuzeichnen.
-
Die
Thread-Umschalt-Steuerlogik 136 weist ferner ein Register „Chunks
vor Wechsel bei Verzweigung" 238 auf,
das in einem Ausführungsbeispiel
der vorliegenden Erfindung über
einen Steuerregisterbus 240 programmierbar ist, um einen
Wert zu speichern, der eine vorbestimmte Anzahl von Chunks anzeigt, die
einer Ablaufsteuerung des Befehls-Streaming-Puffers 106 unterzogen
werden müssen,
bevor eine Thread-Umschaltoperation als Reaktion auf einen Verzweigungsbefehl
auftreten kann. In einem alternativen Ausführungsbeispiel der vorliegenden
Erfindung kann ein Wert, der die vorbestimmte Anzahl von Chunks
anzeigt, fest verdrahtet werden. Die Umschalt- Steuerlogik 136 weist ferner
einen Komparator 242 auf, der eine Vergleichsoperation
in Bezug auf den Ausgang des Schrittzählers 228 und des
Registers 238 vornimmt und ein Signal an das UND-Gatter 244 aktiviert,
wenn der durch den Schrittzähler 228 angezeigte
Wert einen Wert überschreitet,
der in dem Register 238 gespeichert ist. Die Geltendmachung des
Ausgangssignals des Komparators 242 entspricht einer positiven
Bestimmung in dem Entscheidungskästchen 226 aus 8.
-
Das
UND-Gatter 230 stellt ferner einen Eingang in das UND-Gatter 225 bereit,
und die Aktivierung der Ausgabe des UND-Gatters 230 in Verbindung mit
der Aktivierung des Verzweigungsidentifikationssignals 224 bewirken
die Geltendmachung der Ausgabe des UND-Gatters 225 (d.h.
ein Signal für eine
gesendete Verzweigung 227) als Eingang in das UND-Gatter 244.
Die Geltendmachung des Signals für
eine gesendete Verzweigung 227 stellt das Auftreten des
detektierten Ereignisses in dem Schritt 222 dar.
-
Nach
einer positiven Bestimmung in dem Entscheidungskästchen 226 fährt das
Verfahren 200 mit dem Entscheidungskästchen 248 fort, in
dem bestimmt wird, ob eine vorbestimmte Menge von Befehlsdaten (z.B.
eine vorbestimmte Mindestanzahl von Chunks) für einen alternativen Thread
(z.B. Thread 1) aussteht und zur Verteilung von der logischen Partition 124 des
Befehls-Streaming-Puffers 106 bereit
steht. Diese Bestimmung ist dahingehend vorteilhaft, dass sie das
Auftreten eines Thread-Wechsels
verhindert, wenn unzureichende Befehlsdaten in dem Befehls-Streaming-Puffer 106 für den Ziel-Thread
gepuffert worden sind, um einen Thread-Wechsel zu diesem ziel-Thread
zu gewährleisten.
Ein Thread-Wechsel kann im Besonderen mehr Taktzyklen verbrauchen
als wie sie potenziell erforderlich wären, um erneut Befehlsdaten
für einen aktuellen
Thread bereitzustellen. Zum Beispiel kann eine Thread-Umschaltoperation
sechs Zyklen voraussetzen, während
eine hohe Wahrscheinlichkeit gegeben sein kann, dass Befehlsdaten
für einen
aktuellen Thread innerhalb von drei Taktzyklen empfangen werden.
-
In
erneutem Bezug auf die Abbildung aus 15 kann
eine beispielhafte Implementierung der Thread-Umschalt-Steuerlogik 136 ein
Register „Ausstehende
Chunks vor Wechsel" aufweisen,
das über den
Steuerregisterbus 240 programmierbar ist, so dass es einen
Wert speichert, der eine vorbestimmte Mindestanzahl von Chunks für einen
Ziel-Thread (z.B. Thread 1) anzeigt, die in einer Anordnungspartition
(z.B. Partition 124) gepuffert werden sollte, bevor ein
Thread-Wechsel zu einem Ziel-Thread zulässig ist. In einem alternativen
Ausführungsbeispiel
der vorliegenden Erfindung kann der diese vorbestimmte Anzahl von
Chunks anzeigende Wert wiederum fest verdrahtet werden. Die Thread-Umschalt-Steuerlogik 136 weist
ferner einen Schrittzähler „Ausstehende Chunks
zählen" 252 auf,
der einen Zählwert
der Anzahl der Chunks für
einen Ziel-Thread führt
(d.h. nicht einen aktuellen Thread), die in dem Befehls-Streaming-Puffer 106 gespeichert
werden. Der Schrittzähler 252 wird
durch ein Signal „IPD
ausstehenden Chunk senden" 254 inkrementiert,
das durch den Zuordnungsblock 125 aktiviert wird, wenn
von dem Unified-Cache 44 empfangener Chunk von Befehlsdaten einem
Eintrag in dem Puffer 106 zugeordnet ist. Der Zuordnungsblock 125 verwendet
den vorstehend beschriebenen „Thread-Bezeichner", der jedem als Reaktion
auf eine Anforderung des nächsten
Befehls abgerufenen Chunk zugeordnet ist, um zu identifizieren,
ob ein bestimmter Chunk für
den Ziel-Thread bestimmt ist und nicht für den aktuellen Thread. Ein Komparator 256 vergleicht
die entsprechenden in dem Register 250 und dem Schrittzähler 252 gespeicherten
Werte und aktiviert ein Ausgangssignal an das UND-Gatter 244,
wenn der durch den Schrittzähler 202 geführte Wert
den Wert überschreitet,
der in dem Register 250 gespeichert ist. Die Aktivierung bzw.
Geltendmachung des Ausgangssignals des Komparators 256 entspricht
einer positiven Bestimmung in dem in der Abbildung aus 8 dargestellten
Entscheidungskästchen 248.
-
Nach
einer positiven Bestimmung in dem Entscheidungskästchen 248 fährt das
Verfahren 220 mit dem Entscheidungskästchen 260 fort, wo
bestimmt wird, ob eine vorbestimmte Menge von Befehlsdaten für den aktuellen
Thread entlang der Pipeline des Mikroprozessors 30 einer
Ablaufsteuerung unterzogen worden ist. Diese Bestimmung ist dahingehend
vorteilhaft, dass sie den Fortschritt des aktuellen Threads nach
vorne vor einer Thrad-Umschaltoperation gewährleistet. In einem exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung, das den Befehlsvorrat der Intel Architektur
(IA) einsetzt, wird bestimmt, ob drei (3) Chunks von Befehlsdaten für den aktuellen
Thread ablaufgesteuert worden sind, da dies mindestens einen vollständigen Befehl für den aktuellen
Thread gewährleistet.
-
In
einem alternativen Ausführungsbeispiel der
vorliegenden Erfindung kann auf die Bestimmung in dem Entscheidungskästchen 260 verzichtet
werden, da das Detektieren der Ablaufsteuerung des Verzweigungsbefehls,
das selbst mindestens einen vollständigen Befehl darstellt, eine
Konformität
mit der Bestimmung in dem Entscheidungskästchen 260 gewährleistet.
-
In
Bezug auf die Abbildung aus 15A kann
ein exemplarisches Ausführungsbeispiel
der Thread-Umschalt-Steuerlogik 136 einen
Komparator 262 aufweisen, der bestimmt, ob der von dem
Schrittzähler „Gesendeter
Chunk" 228 geführte Zählwert größer oder
gleich einem vorbestimmten Mindestwert von zum Beispiel 3 ist. In
alternativen Ausführungsbeispielen
der vorliegenden Erfindung kann dieser vorbestimmte Mindestwert
entweder programmierbar oder fest verdrahtet sein. Wenn der durch den
Schrittzähler 228 geführte Wert
größer oder gleich
dem vorbestimmten Mindestwert ist, so aktiviert der Komparator 262 ein
Ausgangssignal an das UND-Gatter 244. Die Aktivierung des
Ausgangssignals des Komparators 262 entspricht einer positiven Bestimmung
in dem Entscheidungskästchen 260, dargestellt
in 8.
-
Nach
einer positiven Bestimmung in dem Entscheidungskästchen 260 wird in
dem Schritt 264 eine Thread-Umschaltoperation ausgeführt, sofern die
Bedingungen aus den Entscheidungskästchen 226, 248 und 260 erfüllt werden.
Wenn eine der Bedingungen aus den Entscheidungskästchen 226, 248 oder 260 hingegen
nicht erfüllt
wird, wird in dem Schritt 266 eine aktuelle Thread-Auswahl
geführt. Das
Verfahren 220 endet danach mit dem Schritt 268.
-
Hiermit
wird festgestellt, dass die durch den Schritt 222 und die
Entscheidungskästchen 226, 248 und 260 dargestellten
Bedingungen die vier Eingänge
in das UND-Gatter 244 aus 15A darstellen, und
für den
Fall, dass diese Bedingungen alle erfüllt werden, wird der Ausgang
des UND-Gatters 244 aktiviert und stellt einen Eingang
in ein ODER-Gatter 245 berreit. Der Ausgang des ODER-Gatters 245 bildet
das Thread-Auswahlsignal 134, das von der Thread-Umschalt-Steuerlogik 136 ausgegeben
wird. Die Geltendmachung des Ausgangs des ODER-Gatters 245 entspricht
der Ausführung
der Thread-Umschaltoperation in dem Schritt 264.
-
Das
vorstehende Ausführungsbeispiel
der vorliegenden Erfindung ist zwar in Bezug auf eine Implementierung
mit einem Schrittzähler 223,
einem Register „Chunks
vor dem Einschalten der Verzweigung" 238 und dem Komparator 242 beschrieben, wobei
hiermit festgestellt wird, dass die Erfindung implementiert werden
kann, indem der Schrittzähler bzw.
Aufwärtszähler 228 durch
einen Abwärtszähler ersetzt
wird, der vorab mit dem Wert aus dem Register 238 geladen
wird, wenn ein Thread-Wechsel eintritt. Der Abwärtszähler wird in dem vorliegenden Ausführungsbeispiel
immer dann herabgesetzt, wenn ein Chunk von einer aktuellen Logikpartition 122 oder 124 des
Befehls-Streaming-Puffers 106 verteilt
wird. Der Abwärtszähler aktiviert
danach ein Ausgangssignal (das dem Ausgangssignal des Komparators 242 in
dem vorstehend beschriebenen Ausführungsbeispiel entspricht),
um eine positive Bestimmung in dem Entscheidungskästchen 226 anzuzeigen.
Der Abwärtszähler kann
in dem vorliegenden Ausführungsbeispiel
auch durch den Ausgang des UND-Gaters 230 herabgesetzt
werden.
-
Die Long-Latency-Stall-Logic
(Anhaltelogik mit langer Latenzzeit) (154)
-
Aufgrund
der beschränkten
Ressourcen, die für
die Zuordnung an einen Befehlsstrom eines bestimmten Threads in
einer Prozessor-Pipeline eines Multithread-Prozessors zur Verfügung stehen,
und aufgrund fehlerhafter Verzweigungsprädiktionen und Cache-Misses,
treten Anhaltevorgänge
in einer derartigen Prozessor-Pipeline regelmäßig auf. Im Besonderen in Bezug
auf den Mikroprozessor 30 aus 2 kann es
vorkommen, dass die Zuordnungseinrichtung 76 bestimmt,
dass unzureichende Ressourcen (z.B. physikalische Register oder
Einträge
in den Reservestationen oder dem Umordnungspuffer 78, die
logisch auf Thread 0 und Thread 1 aufgeteilt sind) für Befehle
(d.h. Mikrobefehle) für
einen bestimmten Thread, der von der Warteschlange 68 empfangen wird,
zur Verfügung
stehen. In diesem Fall aktiviert die Zuordnungseinrichtung 76 ein
für einen
Thread spezifisches Anhaltesignal 82, das über die Trace-Zustellungs--Engine
bzw. Trace Delivery Engine 60 an die Mikrobefehls-Umsetzungs-Engine 54 verteilt
wird. Bei der Geltendmachung eines derartigen Anhaltesignals 82 für einen
bestimmten Thread kann es wünschenswert
sein, eine Thread-Umschaltoperation
auszuführen.
Die Long-Latency-Stall-Logic 154 weist eine Schaltkreisanordnung
für die
Implementierung einer Thread-Umschaltoperation für den Fall eines Anhaltens
der Prozessor-Pipeline auf.
-
Die
Abbildung aus 9 zeigt ein Flussdiagramm eines
Verfahrens 280 gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Eintreten eines Anhaltens mit langer Latenzzeit zum Beispiel
aufgrund eines Anhaltens in einer Prozessor-Pipeline als Folge der
fehlenden Verfügbarkeit von
Ressourcen, einer falschen Verzweigungsprädiktion oder eines Cache-Miss-Ereignisses. Das
Verfahren 280 beginnt mit dem Schritt 282, in
dem ein Anhaltezustand detektiert wird. Wie dies bereits vorstehend
im Text beschrieben worden ist, kann dieser Anhaltezustand detektiert
werden, indem die Geltendmachung des Thread-spezifischen Anhaltesignals 82 bestimmt
wird, wie dies in 2 dargestellt ist. Alternativ
kann der Anhaltezustand detektiert werden, indem die Aktivierung
anderer Anhaltesignale bestimmt wird, die etwa durch die Zuordnungseinrichtung 76,
den Trace-Cache 62 (beide als „Back-End-Anhaltezustände bezeichnet), den Befehlsdecodierer 112 oder
die Befehlsieitlogik 110. In dem Entscheidungskästchen 284 wird
bestimmt, ob eine vorbestimmte Anzahl von Taktzyklen vergangen ist,
seit der Anhaltezustand in dem Schritt 282 detektiert worden
ist. In Bezug auf die Abbildung aus 15 kann
eine exemplarische Implementierung der Thread-Umschalt-Steuerlogik 136 ein
Register für
einen „langen
Latenzzählwert" 286 aufweisen, das über den
Steuerregisterbus 240 programmierbar ist, so dass ein Wert
gespeichert wird, der diese vorbestimmte Mindestanzahl von Taktzyklen
anzeigt, die vergangen sein müssen
seit dem Detektierendes Anhaltezustands, bevor ein Thread-Wechsel
zu einem Ziel-Thread zulässig
ist. In einem alternativen Ausführungsbeispiel
der vorliegenden Erfindung kann der Wert, der diese vorbestimmte
Anzahl von Taktzyklen anzeigt, fest verdrahtet werden. Die Umschalt-Steuerlogik 136 weist
ferner einen Aufwärtszähler „lange
Latenz" 288 auf,
der einen Zählwert
der Taktzyklen führt,
die seit dem Detektieren des Anhaltezustands in dem Schritt 282 detektiert
worden sind. Der Aufwärtszähler 288 wird
durch ein Signal „IXstall" oder Befehlsumsetzungsanhaltezustand 290 inkrementiert,
das bei jedem Taktzyklus aktiviert wird, wenn die Prozessor-Pipeline
angehalten wird. Der Aufwärtszähler bzw.
Schrittzähler 288 wird
ferner zurückgesetzt
durch die Deaktivierung des Signals „TCFBstall" 292, das deaktiviert wird,
wenn der Anhaltezustand überwunden
ist. Das Signal „TCFBstall" 292 wird
durch einen Trace Cache 0Fill Buffer (TCFB bzw. Trace-Cache-Füllpuffer)
(nicht abgebildet) aktiviert, der ein Zuordnungsanhaltesignal 58 von
der Trace Delivery Engine 60 vor der Mikrobefehls-Umsetzungs-Engine 54 ausbreitet.
Ein Komparator 294 vergleicht die entsprechenden in dem
Register 286 und dem Aufwärtszähler 288 gespeicherten
Werte und aktiviert das Ausgangssignal an ein UND-Gatter 296,
wenn der durch den Aufwärtszähler 288 geführte Wert
einen in dem Register 286 gespeicherten Wert überschreitet.
Die Aktivierung des Ausgangssignals des Komparators 294 entspricht
einer positiven Bestimmung in dem Entscheidungskästchen 284 aus 9.
-
Wenn
in dem Entscheidungskästchen 284 bestimmt
wird, dass die vorbestimmte Anzahl von Taktzyklen nicht abgelaufen
ist, wird die aktuelle Thread-Auswahl in dem Schritt 285 erhalten,
und das Verfahren 280 springt zurück zu dem Entscheidungskästchen 284.
-
Nach
einer positiven Bestimmung in dem Entscheidungskästchen 284 fährt das
Verfahren 280 mit dem Entscheidungskästchen 284 fort, in
dem bestimmt wird, ob eine vorbestimmte Mindestmenge an Befehlsdaten
für den
aktuellen Thread einer Ablaufsteuerung in der Pipeline des Mikroprozessors 30 ausgeführt worden
ist. Wie dies vorstehend in Bezug auf das Entscheidungskästchen 260 aus 8 beschrieben
worden ist, erfolgt diese Bestimmung durch die Kombination aus dem
Aufwärtszähler „Chunk
gesendet" 228 und
dem Komparator 262. Der Komparator 262 stellt
einen Eingang an das UND-Gatter 296 bereit, wobei der Ausgang
des Komparators 262 aktiviert wird, sobald die vorbestimmte Anzahl
von Chunks für
den aktuellen Thread einer Ablaufsteuerung in der Mikroprozessor-Pipeline
einer Ablaufsteuerung unterzogen worden ist.
-
Das
Ausgangssignal 297 des UND-Gatters 296 wird zu
der Verzweigungsadressen-Berechnungseinrichtung 114 geleitet,
welche danach einen Neustartbefehlszeiger für den Thread bestimmt, von dem
der Wechsel erfolgt ist (d.h. der aktuelle Thread), und wobei ein
Signal Verzweigungsadresse löschen
(BAclear) für
den aktuellen Thread deaktiviert wird. Wenn auf allgemeinerer Ebene
ein Thread-Wechsel erfolgt, ist ein Befehlszeiger erforderlich,
um eine Position zu identifizieren, von der der Thread neu begonnen
wird, von dem der Wechsel erfolgt ist. Der Befehlszeiger kann (1)
das Ziel eines Verzweigungsbefehls sein, der als GENOMMEN vorhergesagt
wird, wobei der Befehlszeiger in diesem Fall durch die Switch-On-Branch-Logic 152 bereitgestellt
wird; (2) durch den Mikrocode bereitgestellt werden; oder (3) durch
die Verzweigungsadressen-Berechnungseinrichtung 114 bereitgestellt werden
(wie dies in der unmittelbar vorstehend erörterten Situation der Fall
ist).
-
Nach
einer positiven Bestimmung in dem Entscheidungskästchen 298 erfolgt
in dem Entscheidungskästchen 300 eine
weitere Bestimmung, ob ein Befehlsumsetzungs-Back-End-Löschsignal 302 aktiviert
worden ist. Wenn dies der Fall ist, wird ein Thread-Wechsel in dem Schritt 303 ausgeführt. Nach negativen
Bestimmungen in den Entscheidungskästchen 298 bzw. 300 wird
in dem Schritt 304 alternativ die aktuelle Thread-Auswahl
beibehalten. Das Verfahren 280 endet danach in dem Schritt 306.
-
Die innere Löschlogik
(156)
-
Eine
interne Pipeline-Löschoperation
wird aus dem inneren der Mikrobefehls-Umsetzungs-Engine 54 selbst
aufgerufen im Gegensatz zu einer externen Löschoperation, die von außerhalb
der Mikrobefehls-Umsetzungs-Engine 54 (z.B. über die
Rückordnungslogik
in Form einer Löschoperation)
aufgerufen wird. Derartige Löschoperationen
sind wünschenswerte
Ereignisse für
eine Thread-Umschaltoperation, da eine hohe Wahrscheinlichkeit gegeben ist,
dass die Löschoperation
als Folge eines Zustands aufgerufen worden ist, der einem aktuellen Thread
zugeordnet ist, und wobei ein alternativer Thread besser auf die
Verarbeitung in der Pipeline vorbereitet sein kann (z.B. mit gefüllten Puffern).
-
Die
Abbildung aus 10 zeigt ein Flussdiagramm eines
Verfahrens 310 gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Auftreten einer internen Pipeline-Löschoperation. Das
Verfahren 310 beginnt mit dem Schritt 312, in dem
die Geltendmachung bzw. Aktivierung eines Löschsignals detektiert wird.
In Bezug auf das exemplarische Ausführungsbeispiel der Umschalt-Steuerlogik 136 aus 15A kann dies durch Detektieren der Geltendmachung
des Signals „IXbaclear" 302 für einen
Löschvorgang
der Befehlsumsetzungs-Verzweigungsadressen-Berechnungseinrichtung ausgeführt werden.
Im Besonderen stellt dieses Signal 302 in der Abbildung
einen Eingang in ein UND-Gatter 314 bereit,
das ferner einen Eingang von dem Komparator 256 empfängt. Wie
dies bereits vorstehend im Text beschrieben worden ist, wird der
Ausgang des Komparators 256 aktiviert, wenn die Anzahl
der ausstehenden Chunks in dem Befehls-Streaming-Puffer 106 gemäß der Umordnung
durch den Aufwärtszähler „Ausstehende
Chunks zählen" 252 den
in dem Register „Ausstehende
Chunks vor Wechsel" 250 gespeicherten
Wert überschreitet. Folglich
wird der Ausgang des Komparators 256 aktiviert, um eine
positive Bestimmung des Zustands darzustellen, der durch das Entscheidungskästchen 316 des
Verfahrens 310 dargestellt ist, woraufhin in dem Schritt 318 eine
Thread-Umschaltoperation ausgeführt
wird. Wenn im Besonderen beide Eingänge des UND-Gatters 314 aktiviert
werden, wird der Ausgang des UND-Gaters 314 aktiviert,
was wiederum einen aktivierten Eingang an das ODER-Gatter 245 bereitstellt.
Wenn andererseits die Bestimmung in dem Entscheidungskästchen 316 negativ
ausfällt,
so bleibt in dem Schritt 320 die aktuelle Thread-Auswahl erhalten.
Das Verfahren 310 endet dann mit dem Schritt 322.
-
Die Logik für keinen
Datenfluss (158)
-
In
Fällen,
wenn ein Level-1-Cache-Miss für einen
aktuellen Thread auftritt, resultiert eine Operation mit langer
Latenzzeit, die eine verhältnismäßig hohe
Anzahl von Taktzyklen für
die Ausführung
erfordern kann. Wenn die Bedingungen für eine Operation mit langer
Latenzzeit erfüllt sind,
die in dem Flussdiagramm aus 9 dargestellt
sind, so kann die Anhaltelogik mit langer Latenzzeit 154 in
dieser Situation eine Thread-Umschaltoperation auslösen kann. Wenn
hingegen alle Bedingungen für
eine Operation mit langer Latenzzeit nicht erfüllt sind, löst die Anhaltelogik mit langer
Latenzzeit 154 keine Thread-Umschaltoperation aus. In diesen
Fällen
ist eine alternative Logik erforderlich.
-
Die
Abbildung aus 11 zeigt ein Flussdiagramm eines
Verfahrens 330 gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Auftreten eines Zustands „Kein Datenfluss" in Bezug auf einen
bestimmten Thread in dem multithreading-fähigen Prozessor. Das Verfahren 330 beginnt mit
dem Schritt 332, in dem das Fehlen eines Befehlsflusses
für einen
aktuellen Thread aus dem Unified-Cache 44 zu dem Befehls-Streaming-Puffer 106 detektiert
wird. In Bezug auf die Abbildung aus 15A kann
dies in einem exemplarischen Ausführungsbeispiel detektiert werden
durch die Aktivierung (oder Deaktivierung) eines Datenflusssignals 334, das
durch den Unified-Cache 44 für jeden Taktzyklus aktiviert
wird, während
dem ein Befehlsstrom an den Befehls-Streaming-Puffer 106 bereitgestellt
wird. Der Zustand „Kein
Datenfluss" kann
auch als eine Verriegelung des Datenflusses an den Befehls-Vordecodierer 108 detektiert
werden, da dies eine Verriegelung des Datenflusses von den Unified-Cache 44 an
den Befehls-Streaming-Puffer 106 impliziert. Der Zustand „Kein Datenfluss" kann auch als eine
Verriegelung des Datenflusses an den Befehls-Vordecodierer 108 detektiert
werden, da dies eine Verriegelung des Datenflusses von dem Unified-Cache 44 mit
dem Befehls-Streaming-Puffer 106 impliziert.
-
In
dem Entscheidungskästchen 336 wird
bestimmt, ob eine vorbestimmte Anzahl von Taktzyklen ohne Datenfluss
von dem Unified-Cache 44 zu dem Befehls-Streaming-Puffer 106 abgelaufen
ist. Zu diesem Zweck ist die Thread-Umschaltlogik 136 in
der Abbildung aus 15A so dargestellt, dass sie
einen Zähler
für „Keinen
Datenfluss" 338 aufweist,
der für jeden
sequentiellen Taktzyklus heraufgesetzt wird, für den das Datenflusssignal 334 deaktiviert
ist, was das Fehlen eines Befehlsstroms an den Befehls-Streaming-Puffer 106 für den aktuellen
Thread anzeigt. Der Zähler 338 kann
durch die Aktivierung des Signals 335 zurückgesetzt
werden, das auftritt, wenn ein Datenfluss zu dem Befehlsvordecodierer 108 von
dem Befehls-Streaming-Puffer 106 wieder aufgenommen wird.
Das Signal 335 kann als Reaktion auf eine an den Signalen 232 und 236 (d.h.
den Signalen BPready und NOTISstall) ausgeführte UND-Funktion aktiviert
werden. Die Logik 136 weist ferner ein Register „Keine
Datenflusszyklen" 340 auf, das über den
Steuerregisterbus 240 programmierbar ist, so dass es einen
Wert speichert, der eine vorbestimmte Mindestanzahl von Taktzyklen
anzeigt, bevor ein Zustand von keinem Datenfluss detektiert werden
kann. In einem alternativen Ausführungsbeispiel
der vorliegenden Erfindung kann der Wert, der diese vorbestimmte
Anzahl von Taktzyklen anzeigt, fest verdrahtet sein. Der Zähler 338 und
das Register 340 stellen einen Eingang an einen Komparator 342 bereit,
der einen Ausgang an das UND-Gatter 344 geltend macht,
wenn der von dem Zähler 338 geführt Wert
den in dem Register 340 gespeicherten Wert übersteigt.
Die Aktivierung des Ausgangssignals des Komparators 342 entspricht
einer positiven Bestimmung in dem Entscheidungskästchen 336 aus 11.
-
Für den Fall
einer negativen Bestimmung in dem Entscheidungskästchen 336 fährt das
Verfahren 330 mit dem Schritt 345 fort, in dem
die aktuelle Thread-Auswahl beibehalten wird.
-
Nach
einer positiven Entscheidung in dem Entscheidungskästchen 336 fährt das
Verfahren mit den Bestimmungen in den Entscheidungskästchen 346 und 348 fort,
die den Bestimmungen in den Entscheidungskästchen 248 und 260 des
Verfahrens 220 aus 8 entsprechen.
Folglich sind die Ausgänge
bzw. Ausgaben der Komparatoren 256 und 262, welche
die Bestimmungen in den Entscheidungskästchen 346 und 348 implementieren,
in der Abbildung so dargestellt sind, dass sie einen Eingang in
das UND-Gatter 344 bereitstellen. Der Ausgang des UND-Gatters 344 stellt
wiederum einen Eingang in das ODER-Gatter 245 bereit. Dies
stellt eine Implementierung der Logik zur Ausführung der Thread-Umschaltoperation
in dem Schritt 350 des Verfahrens 330 bereit,
wenn positive Bestimmungen in Bezug auf die Entscheidungskästchen 336, 346 und 348 auftreten.
Wenn alternativ eine negative Bestimmung in einem der Entscheidungskästchen 336, 346 oder 348 auftritt,
so wird die aktuelle Thread-Auswahl in dem Schritt 352 beibehalten.
Das Verfahren 330 endet danach mit dem Schritt 354.
-
Die Logik für einen
erzwungenen Thread-Wechsel (160)
-
In
bestimmten Fällen
kann ein Befehlsstrom (der entweder einen ersten oder zweiten Thread
umfasst) auftreten, der besonders linear ist und somit keine Verzweigungsbefehle
aufweist. Wenn angenommen wird, dass keine der vorstehend und nachstehend
beschriebenen Bedingungen auftritt, so ist es erkennbar, dass ein
derartiger linearer Thread einen überproportionalen Anteil der
Prozessorressourcen verbrauchen kann, wenn kein Ereignis zum Auslösen eines
Thread-Wechsels auftritt. Um es zu verhindern, dass ein derartiger
linearer Thread in Bezug auf die Prozessorressourcen über das
Ziel hinaus schießt,
schlägt die
vorliegende Erfindung eine Logik vor, welche nach der Ablaufsteuerung
oder dem Verteilen einer vorbestimmte Menge von Befehlsdaten für einen
einzelnen Thread von einer Ressource, wie etwa dem Befehls-Streaming-Puffer 106,
eine Thread-Umschaltoperation auslöst.
-
Die
Abbildung aus 12 zeigt ein Flussdiagramm eines
Verfahrens 360 gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor bei der Ablaufsteuerung (oder dem Verteilen) einer vorbestimmten
Befehlsmenge für
einen bestimmten Thread (z.B. Thread 0) von dem Befehls-Streaming-Puffer 106 zu
dem Befehlsvordecodierer 108. Das Verfahren beginnt mit
dem Schritt 362, in dem Befehlsdaten für einen bestimmten Thread (z.B. Thread
0) für
die Ablaufsteuerung und Verteilung von dem Befehls-Streaming-Puffer 106 ausgewählt werden.
Diese Auswahl kann durch den Zustand des Thread-Auswahlsignals 134 dargestellt
werden, das von der Thread-Umschalt-Steuerlogik 136 an
den MUX 132 ausgegeben wird.
-
In
dem Entscheidungskästchen 364 wird
bestimmt, ob eine vorbestimmte maximale Menge von Befehlsdaten für einen
aktuellen Thread (z.B. Thread 0) einer Ablaufsteuerung von dem Befehls-Streaming-Puffer 106 unterzogen
worden ist. Di in der Abbildung aus 15A veranschaulichte
exemplarische Thread-Umschalt-Steuerlogik 136 weist
ein Register „Ressourcenbindung" 366 auf,
das über
den Steuerregisterbus 240 so programmierbar ist, dass es
einen Wert speichert, der eine vorbestimmte maximale Anzahl von
Chunks für
einen bestimmten Thread anzeigt, die von dem Befehls-Streaming-Puffer 106 einer
Ablaufsteuerung unterzogen werden können, bevor eine Thread-Umschaltoperation
ausgelöst
wird. In einem alternativen Ausführungsbeispiel
der vorliegenden Erfindung kann der Wert, der die vorbestimmte maximale
Anzahl von Chunks anzeigt, fest verdrahtet werden. Das Register „Ressourcenbindung" 366 und
der Aufwärtszähler „Chunk
gesendet" 228,
der einen Zählwert
der aus dem Puffer 106 für einen bestimmten Thread ausgegebenen Chunks
verwaltet, stellen einen Eingang in den Komparator 368 bereit,
der einen Ausgang an das UND-Gatter 344 aktiviert, wenn
der durch den Aufwärtszähler 228 ausgegebene
Wert den in dem Register „Ressourcenbindung" 366 gespeicherten
Wert überschreitet.
Folglich entspricht die Aktivierung des Ausgangssignals des Komparators 368 einer
positiven Bestimmung in dem Entscheidungskästchen 364 aus 12.
-
Der
Ausgang des UND-Gatters 344 stellt gemäß der Abbildung einen Eingang
in das ODER-Gatter 245 bereit sowie einen Ausgang „FTC einfügen" 434.
-
Für den Fall
einer negativen Bestimmung in dem Entscheidungskästchen 364 fährt das
Verfahren 360 mit dem Schritt 370 fort, in dem
die aktuelle Thread-Auswahl erhalten bleibt, woraufhin das Verfahren 330 zu
dem Entscheidungskästchen 364 zurück springt.
-
Nach
einer positiven Bestimmung in dem Entscheidungskästchen 364 fährt das
Verfahren 360 mit Bestimmungen in den Entscheidungskästchen 372 und 374 fort,
die den Bestimmungen in den Entscheidungskästchen 248 und 260 des
Verfahrens 220 aus 8 entsprechen.
Folglich stellen die Ausgaben bzw. Ausgänge der Komparatoren 256 und 262,
welche die Bestimmungen in den Entscheidungskästchen 372 und 374 implementieren,
gemäß der Abbildung
einen Eingang in das UND-Gatter 344 bereit.
-
Nach
positiven Bestimmungen in den Entscheidungskästchen 336, 346 und 348 wird
in den von dem Befehls-Streaming-Puffer 106 verteilten
Befehlsstrom eine Albaufmarkierung (oder „eingefügter Ablauf") (z.B. '1000) eingefügt. Der eingefügte Fluss bzw.
Ablauf ist erforderlich, da die Verzweigungsadressen-Berechnungseinrichtung 114 die
Erfassung des aktuellen Threads neu starten muss, da die Thread-Umschaltoperation
an einem unvollständigen Befehl
aufgetreten sein kann. In diesem Fall fügt die Verzweigungsprädiktionseinheit 113 den
eingefügten Ablauf
in den Befehlsstrom ein, um den erzwungenen Thread-Wechsel anzuzeigen.
Für den
eingefügten Ablauf
ist ForceUOPValid aktiviert. Der eingefügte Ablauf wird nur eingefügt, nachdem
die Übermittlung eines
Chunks von dem Befehls-Streaming-Puffer 106 an den Befehlsvordecodierer 108 terminiert
bzw. zeitlich geplant worden ist. Nachdem der relevante Chunk verteilt
worden ist, wird der eingefügte
Ablauf über
Multiplexierung in das Feld ForceUOPVector (event_info Feld) eingefügt. Zu diesem
Zweck wird auf die Abbildung aus 16 verwiesen,
die das Feld event_info für
Chunks veranschaulicht, die in einer beispielhaften Anordnungspartition 122 in
dem Befehls-Streaming-Puffer 106 gepuffert
worden sind. Der Ausgang „insert
FTC" bzw. „FTC einfügen" 434 ist
so dargestellt, dass er einen MUX 450 so betreibt, dass
zwischen (1) dem aktuellen Inhalt des Felds event_info 121 eines
in einem Eintrag 120 in der Partition 122 und
(2) dem eingefügten
Ablauf 452 ausgewählt
wird. Für
den Fall, dass der Ausgang 244 nach einer Aktivierung des
Ausgangs des Komparators 368 aktiviert wird, wird der eingefügte Ablauf 452 in das
Feld event_info 121 eines von der Partition 122 verteilten
Chunks eingefügt.
-
Eine
Thread-Umschaltoperation wird danach in dem Schritt 376 durch
Aktivierung des Auswahlsignals 134 als Reaktion auf die
Aktivierung des Ausgangs des UND-Gatters 344 ausgeführt. Wenn
alternativ in einem der Entscheidungskästchen 364, 372 oder 374 eine
negative Bestimmung auftritt, so wird in dem Schritt 378 die
aktuelle Thread-Auswahl beibehalten. Das Verfahren 360 endet
mit dem Schritt 380.
-
Eine
durch die Logik für
einen erzwungenen Thread-Wechsel 160 eingeleitete Thread-Umschaltoperation
unterscheidet sich von anderen in der vorliegenden Patentschrift
beschriebenen Thread-Umschaltoperationen daduch, dass das Daten-Chunk, an
dem der Thread-Wechsel auftritt, kein besonders oder Unterscheidungsmerkmal
aufweist, das eine gewisse Vorwarnung hinsichtlich einer Thread-Umschaltoperation
bereitstellen kann. Im Besonderen werden die durch die anderen Logiken 150 bis 164 in der
Thread-Umschalt-Steuerlogik 136 ausgeführten Thread-Umschaltoperationen
von einem Zustand begleitet, der die Thread-Umschaltoperation gutartig macht,
so dass die betroffene Hardware keine Vorwarnung benötigt. Die
Befehlsleitlogik 110 ist nicht so ausgestattet, dass sie
eine plötzliche
und unerwartete Thread-Umschaltoperation behandelt. Somit stellt die
eingefügte
Ablaufmarkierung einen Mechanismus bereit, um die Befehlsleitlogik 110 über die Thread-Umschaltoperation
zu informieren, die Upstream aufgetreten ist.
-
Ferner
ist in Verbindung mit einem erzwungenen Thread-Wechsel ebenso wie
bei den anderen in der vorliegenden Beschreibung beschriebenen Thread-Umschaltoperationen
ein Befehlszeiger für einen „Neustart" erforderlich. Wenn
eine Unterbrechung des Befehlsstroms durch die Logik für einen erzwungenen
Thread-Wechsel 160 erzwungen
wird, so ist es wünschenswert,
Mikrocode an den Neustartzeiger bereitzustellen im Gegensatz zu
dem Zeiger auf den nächsten
Befehl 100.
-
Die externe Löschlogik
(162)
-
Wie
dies vorstehend im Text in Bezug auf die innere Löschlogik 156 beschrieben
werden ist, wird eine externe Löschoperation
von außerhalb
der Mikrobefehls-Umsetzungs-Engine 54 aufgerufen.
-
Die
Abbildung aus 13 veranschaulicht ein Verfahren 400 gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zur Ausführung einer Thread-Umschaltoperation
in einem multithreading-fähigen
Prozessor beim Auftreten einer externen Pipeline-Löschoperation.
Das Verfahren 400 beginnt mit dem Schritt 402,
in dem eine Geltendmachung eines externen Löschsignals detektiert wird.
In Bezug auf das exemplarische Ausführungsbeispiel der Thread-Umschalt-Steuerlogik 136 aus
der Abbildung aus 15A kann dies ausgeführt werden
durch das Detektieren der Aktivierung eines Trace-Cache-/Mikrobefehls-Umsetzungs-Engine-Löschsignals „TCmiteclear" 404, das
einen direkten Eingang in das ODER-Gatter 245 bereitstellt. Folglich
bewirkt die Geltendmachung des Signals 404 die Geltendmachung
des Thread-Auswahlsignals 134, das von der Thread-Umschalt-Steuerlogik 136 zu
dem MUX 132 geleitet worden ist, wie dies in der Abbildung
aus 5 dargestellt ist. Dies zeigt sich in dem Schritt 406 des
Verfahrens 400, das danach mit dem Schritt 408 endet.
-
Die Logik für eingefügten Ablauf
(164)
-
Wenn
in der Mikrobefehls-Umsetzungs-Engine 54 der Instruction
Translation Lookaside Buffer (ITLB) 102 aus der Abbildung
aus 3 einen Seitenfehler registriert, wird eine Ablaufmarkierung (auch
als „eingefügter Fluss
bzw. Ablauf" bezeichnet) in
den Befehlsstrom eingefügt,
um dieses Ereignis zu markieren. Ein derartiger Seitenfehler führt zu einer verhältnismäßig langen
Page-Walk-Operation durch einen Page-Miss-Handler (nicht abgebildet), der
zum Beispiel bis zu 150 Taktzyklen verbrauchen kann. Wenn in einem
multithreading-fähigen Prozessor
ein Seitenfehler (Page Miss) für
einen Befehlsstrom eines aktuellen Threads auftritt, so kann es
vorteilhaft sein, eine Thread-Umschaltoperation auszuführen, um
es zu ermöglichen,
dass ein alternativer Thread die Latenz nutzt, die durch die Page-Walk-Operation eingefügt worden
ist. Die Logik für
eingefügten
Ablauf 164 stellt gemäß der vorstehenden
Beschreibung ein exemplarisches Ausführungsbeispiel der Logik bereit,
die beim Auftreten eines Seitenfehlers eine Thread-Umschaltfunktion
implementiert und ausführt.
-
Im
Fach sind weitere Ereignisse neben einem Seitenfehler allgemein
bekannt, die zu einem eingefügten
Ablauf führen
können,
wobei diese aber auch anderweitig für eine Mikroprozessorarchitektur spezifisch
sein können.
-
Die
Abbildung aus 14 zeigt ein Verfahren 420 gemäß einem
exemplarischen Ausführungsbeispiel
der vorliegenden Erfindung zum Ausführen einer Thread-Umschaltoperation
in einem Multithreaded-Prozessor beim Detektieren eines eingefügten Ablaufs
in einen Befehlsstrom für
einen aktuellen Thread, wobei der eingefügte Ablauf als reines Beispiel
einen Seitenfehler in Bezug auf den Befehls-TLB 102 anzeigt.
Das Verfahren 420 beginnt mit dem Schritt 422 und
der Auswahl eines aktuellen Threads (z.B. Thread 0). Die Auswahl
kann durch den Zustand des aus der Thread-Umschalt-Steuerlogik 136 an
den MUX 132 ausgegebenen Thread-Auswahlsignals 134 ausgegeben
werden. In dem Entscheidungskästchen 424 wird
bestimmt, ob ein Feld für
ein Befehlsumsetzungsereignis „ITeventid" 426 in dem
Befehlsstrom für
den aktuellen Thread einen eingefügten Ablauf spezifiziert (z.B.
keinen Wert von '0000
oder '0111 aufweist.
Im Besonderen kann das Vorhandensein der oben genannten Werte in
dem Befehlsumsetzungs-Ereignisfeld 426 das Fehlen eines
eingefügten
Ablaufs anzeigen. In Bezug auf die Abbildung aus 15A zeigt das Feld 426 die Eingabe in
ein Paar von Komparatoren (oder andere Logik) 428 und 430,
welche bestimmen, ob das Feld 426 den Wert '0000 oder '0111 aufweist. Wenn
dies der Fall ist, aktiviert ein Komparator 428 oder 430 einen Ausgang
an ein NOR-Gatter 432, wobei dessen Ausgang einen Eingang
in das OR-Gatter 245 bereitstellt.
-
In
dem Entscheidungskästchen 436 wird
optional bestimmt, ob eine vorbestimmte Mindestmenge von Befehlsdaten
für einen
Ziel-Thread (z.B. Thread 1) zum Verteilen von dem Befehls-Streaming-Puffer 106 bereit
steht. Die Bestimmung kann unter Verwendung des Ausgangs des NOR-Gatters 42 mit
dem Ausgang des Komparators 262 vorgenommen werden.
-
Nach
positiven Bestimmungen in den Entscheidungskästchen 424 und 436 kann
in dem Schritt 438 eine Thread-Umschaltoperation ausgeführt werden.
Im Besonderen kann die Aktivierung des Ausgangs des NOR-Gatters 42,
der durch das OR-Gatter 245 geleitet wird, um eine Aktivierung
des Auswahlsignals 134 zu bewirken, der in dem Schritt 438 ausgeführten Thread-Umschaltoperation
entsprechen. Wenn alternativ eine negative Bestimmung in einem der
Entscheidungskästchen 424 oder 436 erfolgt,
so wird die aktuelle Thread-Auswahl in dem Schritt 440 beibehalten.
Das Verfahren 420 endet danach mit dem Schritt 442.
-
SCHLUSSFOLGERUNG
-
In
dem exemplarischen Ausführungsbeispiel der
vorstehend in Bezug auf die Abbildung aus 15 beschriebenen
Thread- Umschalt-Steuerlogik 136 sind
eine Reihe von Logiken 150 bis 164 mit einer Implementierung
unter Verwendung der Kombination auf Aufwärtszähler, Register und Komparator beschrieben.
In einem alternativen Ausführungsbeispiel
der vorliegenden Erfindung können
einige oder alle der Logiken unter Verwendung eines Abwärtszählers implementiert,
der nur von einem vorbestimmten, programmierbaren Wert herabzählt und ein
Signal aktiviert, wenn ein Wert von Null erreicht wird. Ein Beispiel
für ein
derartiges Ausführungsbeispiel
ist in der Abbildung aus 15B veranschaulicht.
-
Zusammengefasst
ist die vorstehend beschriebene Thread-Umschaltlogik 136 dahingehend vorteilhaft,
dass sie eine Reihe flexibler Mechanismen zur Implementierung und
Ausführung
von Thread-Umschaltoperationen als Reaktion auf das Auftreten von
Ereignissen bereitstellt, bei denen es vorteilhaft sein kann, derartige
Thread-Umschaltoperationen auszuführen. Durch die Integration
von programmierbaren Parametern ermöglicht die vorliegende Erfindung
ferner die Modifikation und Feinabstimmung der Thread-Umschaltmechanismen
für eine Vielzahl
von Situationen und Aspekten. Wenn zum Beispiel eine bestimmte Art
von Anwendung ausgeführt
wird, wie zum Beispiel eine Multimedia-Anwendung, so kann es wünschenswert
sein, dass die Parameter der Thread-Umschaltmechanismen auf unterschiedliche
Werte gesetzt sind als bei einer Ausführung einer andersartigen Anwendung,
wie etwa einer Textverarbeitungsanwendung.
-
Die
Thread-Umschaltlogik 136 eignet sich für ein Tirne-Slicing der Bandbreite
eines Pfads (zwischen einer Quellenressource und einer Zielressource)
und/oder einer Verarbeitungsressource in einem multithreading-fähigen Prozessor.
Während
die Thread-Umschaltlogik 136 vorstehend
für eine
Verteilung von Befehlsdaten für
zwei Threads von einem Befehls-Streaming- Puffer an einen Befehlsvordecodierer
beschrieben ist, ist es allgemein ersichtlich, dass die Lehren der
vorliegenden Erfindung auch eingesetzt werden können, um Befehlsdaten für mehrere
Threads von jeder Ressource an jedes Ziel in einer Prozessor-Pipeline
zu verteilen.
-
Beschrieben
wurden somit ein Verfahren und eine Vorrichtung für einen
Thread-Wechsel in einem multithreading-fähigen Prozessor. Die vorliegende Erfindung
wurde zwar in Bezug auf bestimmte exemplarische Ausführungsbeispiele
beschrieben, wobei hiermit jedoch festgestellt wird, dass verschiedene Modifikationen
und Abänderungen
in Bezug auf diese Ausführungsbeispiele
möglich
sind, ohne dabei vom weiteren Umfang der Erfindung abzuweichen. Die
Beschreibung und die Zeichnungen dienen somit der Veranschaulichung
und haben keine einschränkende
Wirkung.