-
Die
vorliegende Erfindung bezieht sich auf einen Multithreaded-Prozessor
zur Ausführung
eines ersten und eines zweiten Threads, wobei den Threads abwechselnd
der Vorrang für
eine vorgegebene Anzahl von Systemtaktzyklen zugewiesen wird, wobei
die Anzahl in einem Thread-Vorrang-Zähler gezählt wird, der mit einem dem
Thread zugeordneten Anfangswert geladen wird, wobei der Anfangswert
auf einem in einem Startzähler
gespeicherten Startwert basiert, wobei der Prozessor eine Pipeline mit
einer Abrufeinheit zum Abrufen von Befehlen aus einem Speicher und
wenigstens einer Ausführungseinheit
aufweist, wobei die Abrufeinheit Befehle eines Threads abruft und
in eine Warteschlage speichert. Ferner betrifft die Erfindung ein
Verfahren zum abwechselnden Zuweisen eines Vorrangs für einen
ersten und einen zweiten Thread in einem solchen Multithreaded-Prozessor.
Ferner betrifft die Erfindung ein Computersystem mit einem solchen
Prozessor.
-
Wie
es im Stand der Technik bekannt ist, enthält ein Prozessor eine Vielzahl
von Untermodulen, von denen jedes an die Ausführung spezieller Aufgaben angepaßt ist.
Bei einem bekannten Prozessor umfassen diese Untermodule folgende:
einen Befehls-Cache, eine Befehlsabrufeinheit zum Abrufen geeigneter
Befehle aus dem Befehls-Cache; Decodierlogik, die den Befehl in
ein endgültiges
oder ein Zwischenformat decodiert, Mikrooperationslogik, die Zwischenbefehle
in ein endgültiges
Format zur Ausführung
konvertiert; und eine Ausführungseinheit,
die Befehle des endgültigen
Formats ausführt
(entweder bei einigen Beispielen aus der Decodierlogik oder bei anderen
aus der Mikrooperationslogik). Hier werden die Befehle des endgültigen Formats
als Mikrooperationen bezeichnet.
-
Von
dem Prozessor auszuführender
Programmcode kann manchmal in kleinere Komponenten unterteilt werden,
die als „Threads” bezeichnet werden.
Ein Thread ist eine Serie von Be fehlen, deren Ausführung eine
gegebene Aufgabe erreicht. Beispielsweise könnte bei einer Videotelefonanwendung
der Prozessor aufgerufen werden, einen Code auszuführen, um
Videobilddaten sowie Audiodaten zu behandeln. Es könnte separate
Codesequenzen geben, deren Ausführung
derart gestaltet ist, daß sie jeweils
diese Datenarten behandeln. So könnte
ein erster Thread Befehle zur Videobilddatenverarbeitung und ein
zweiter Thread Befehle zur Audiodatenverarbeitung enthalten. Anders
ausgedrückt,
ein Thread ist ein selbständiges
Programm, dem üblicherweise
ein Thread-Identifizierer zugeordnet ist, und während der Ausführung in
einer Multi-Threaded-Umgebung kann sein Architekturzustand aufrechterhalten
werden, während
Befehle von einem anderen Thread ausgeführt werden.
-
Die
Verwendung von mehrfädigen
(multi-threaded) Prozessoren wurde im Stand der Technik vorgeschlagen.
Bei einem solchen Prozessor kann zwischen der Ausführung von
zwei oder mehr Threads umgeschaltet werden. Bei anderen mehrfädigen Prozessoren
können
die Threads gleichzeitig ausgeführt
werden. Bei beiden Prozessoren gibt es keine Abgrenzung zwischen
den Threads, wie diese behandelt werden. Insbesondere wird dem Code
von einem Thread derselbe Vorrang beziehungsweise dieselbe Priorität gegeben,
wie dem Code von einem anderen Thread. Dies könnte zu einem negativen Einfluß auf die
Gesamtsystemleistung insbesondere dann führen, wenn die Ausführung kritischen
Codes durch die Ausführung
nicht-kritischen Codes ausgesetzt oder verlangsamt wird.
-
Ein
Multi-threaded-Prozessor und ein Verfahren der eingangs genannten
Art sind beispielsweise aus der
WO 01/04750 A1 bekannt. Den beiden Threads
wird abwechselnd ein Vorrang eingeräumt, wobei dann, wenn beide
Threads gleichzeitig dieselbe Ressource benötigen, die Ressource demjenigen Thread
zugeteilt wird, der gerade den Vorrang hat. Wenn beispielsweise
beide Threads gleichzeitig einen Zugriff auf eine Ausführungseinheit
benötigen, so
erhält
derjenige Thread den Zugriff, der den Vorrang hat. Die Druckschrift
schlägt
zur Vermeidung von Deadlock- und Lifelock-Zuständen vor, den Vorrang den beiden Threads
abwechselnd zuzuteilen, wobei die Länge des Zeitfensters, in dem
ein Thread den Vorrang erhält,
in Abhängigkeit
vom Verarbeitungsfortschritt des Threads eingestellt werden kann. Die
Dauer des Zeitfensters richtet sich nach einem Anfangswert in einem
Thread-Vorrang-Zähler.
Der Anfangswert wird in den Zähler
aus einem Startzähler
geladen. Der Wert in dem Startzähler
wiederum wird in Abhängigkeit
vom Fortschritt des Threads geändert,
wobei beispielsweise der Startzähler
inkrementiert wird, wenn in einer aktuellen Verarbeitungsperiode
(Zeitfenster) kein Befehl abgeschlossen (retired) wurde. Wenn jedoch
ein Befehl abgeschlossen wurde, wird der Startzähler auf einen Anfangswert zurückgesetzt.
-
Diese
Vorgehensweise hat Nachteile. Wenn beispielsweise ein Thread an
Befehlen ”ausgehungert” wird (d.
h. die Ressourcen zur Ausführung
von Mikrobefehlen verfügbar
sind, aber der Abruf von Befehlen eingeschränkt ist), kann es sein, dass
die Zeit, die durch den Thread-Vorrang-Zähler zur Verfügung gestellt
wird, nicht ausreicht, um einen Befehl abzurufen (beispielsweise
dann, wenn der Befehlsabruf aufgrund eines erforderlichen Nachschlagens
in einem TLB verlängert
ist).
-
Aufgabe
der Erfindung ist es daher, diesen Nachteil zu mindern oder zu beseitigen.
-
Diese
Aufgabe wird erfindungsgemäß durch einen
Multithreaded-Prozessor mit den Merkmalen des Anspruchs 1 gelöst. Ferner
wird die Aufgabe durch ein Verfahren mit den Merkmalen des Anspruchs
9 bzw. ein Computersystem mit den Merkmalen des Anspruchs 10 gelöst. Vorteilhafte und/oder
bevorzugte Weiterbildungen der Erfindung sind in den Unteransprüchen gekennzeichnet.
-
Im
folgenden wird die Erfindung anhand von in den Zeichnungen dargestellten
bevorzugten Ausführungsformen
näher erläutert.
-
1 ist
eine Blockdarstellung eines Computersystems, das gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung betrieben wird.
-
2 ist
eine Blockdarstellung eines Teils eines Prozessors, der in Übereinstimmung
mit einem Ausführungsbeispiel
der vorliegenden Erfindung konstruiert ist.
-
3 ist
ein Zustandsdiagramm für
die Zuweisung eines Thread-Vorrangs gemäß einem Ausführungsbeispiel
der vorliegenden Erfindung.
-
4 ist
ein Zustandsdiagramm für
das Setzen des Startzählers
für Thread
0 oder Thread 1 gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung.
-
Es
wird auf 1 Bezug genommen, in der eine
Blockdarstellung eines Computersystems gezeigt ist, das gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung betrieben wird. Bei diesem Beispiel enthält das Computersystem 1 einen
Prozes sor 3, welcher in der Lage ist, im Speicher 5 gespeicherten
Code auszuführen.
Bei diesem Beispiel speichert der Speicher 5 Code für verschiedene Threads,
wie beispielsweise Code für
Thread 0 (8), Thread 1 (9), etc. Wie es im Stand
der Technik bekannt ist, kann der Code für beide Threads Teil einer Benutzeranwendung
und des Betriebssystems sein.
-
Es
wird auf 2 Bezug genommen, in der eine
Blockdarstellung eines Prozessors (zum Beispiel eines Mikroprozessors,
eines digitalen Signalprozessors oder dergleichen) gezeigt ist,
der gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung betrieben wird. Bei diesem Ausführungsbeispiel ist
der Prozessor ein mehrfädiger
Prozessor, wobei der Prozessor 10 theoretisch in zwei oder
mehr logische Prozessoren unterteilt ist. So wie er hier verwendet
wird, bezieht sich der Begriff „Thread” auf eine Befehlscodesequenz.
Bei einer Videotelefonanwendung beispielsweise könnte der Prozessor aufgerufen
werden, um Befehlscode zum Behandeln von Videobilddaten sowie von
Audiodaten auszuführen.
Es könnte
separate Codesequenzen geben, deren Ausführung zum Behandeln jeder dieser
Datenarten ausgebildet ist. So könnte
ein erster Thread Befehle für
eine Videobilddatenverarbeitung enthalten, und ein zweiter Thread
könnte
Befehle für
eine Audiodatenverarbeitung enthalten. Bei diesem Beispiel gibt
es eine oder mehrere Ausführungseinheiten (zum
Beispiel einschließend
die Ausführungseinheit 41),
welche einen oder mehrere Befehle gleichzeitig ausführen können. Der
Prozessor 10 kann jedoch als zwei logische Prozessoren
behandelt werden, wobei ein erster logischer Prozessor Befehle aus
dem ersten Thread und ein zweiter logischer Prozessor Befehle aus
dem zweiten Thread ausführt.
-
Bei
diesem Ausführungsbeispiel
des Prozessors 10 werden Befehle und/oder Bytes von Daten durch
die Abrufeinheit 11 abgerufen und einer Warteschlange 13 zur
Verfügung
gestellt und als Teil der Thread 0-Warteschlange oder der Thread
1-Warteschlange
gespeichert. Einem Fachmann ist es klar, daß die im Prozessor 10 verwendeten
Warteschlangen verwendet werden können, um mehr als zwei Threads
zu speichern. Befehle aus den beiden Threads werden an einen Multiplexer
(MUX) 15 angelegt, und eine Steuerlogik 17 wird
verwendet, um zu steuern, ob Befehle aus dem Thread 0 oder dem Thread
1 an eine Decodiereinheit 21 geliefert werden. Die Decodiereinheit 21 kann
einen Befehl in zwei oder mehr Mikrobefehle konvertieren und die Mikrobefehle
in die Warteschlange 23 liefern (bei einem RISC (Reduced
Instruction Set Code)-Prozessor können sich die Befehle bereits
in einem decodierten Format befinden, und die Decodiereinheit 21 konvertiert
sie in ein Format zur Ausführung.
Die Ausgaben der Warteschlange 23 werden an einen MUX 25 geliefert,
welcher Befehle aus dem Thread 0 oder dem Thread 1 auf der Grundlage
des Betriebs einer Steuerlogik 27 an eine Umbenennungs/Zuteilungs-Einheit 31 liefert.
Die Umbenennungs/Zuteilungs-Einheit 31 wiederum liefert
Befehle an die Warteschlange 33. Ein MUX 35 wählt zwischen
der Thread 0-Warteschlange
und der Thread 1-Warteschlange auf der Grundlage des Betriebs der
Einplanungssteuerlogik 37 aus, welche beispielsweise Befehle
aus Thread 0 und Thread 1 auf der Grundlage verfügbarer Ressourcen in der Ausführungseinheit 41 auswählen kann.
Die Ausgabe des MUX 35 wird an eine Außer-Der-Reihe-Ausführungseinheit 41 bei diesem
Ausführungsbeispiel
geliefert, welche den Befehl ausführt. Der Befehl wird dann in
die Warteschlange 43 gebracht. Die Ausgaben der Warteschlange 43 werden
an einen MUX 45 geliefert, welcher Befehle aus Thread 0
und Thread 1 an eine Festschreibeeinheit (Retire Unit) 51 auf
der Grundlage des Betriebs der Steuerlogik 47 sendet.
-
In 2 kann
eine Verzweigungsvorhersageschaltung hinzugefügt werden, um die Effizienz des
Prozessors 10 zu verbessern. Beispielsweise könnte eine
Verzweigungsvorhersageschaltung zur Abrufeinheit 11 hinzugefügt werden.
Wie es im Stand der Technik bekannt ist, betrifft eine Verzweigungsvorhersage
ein Vorhersagen, ob ein Verzweigungsbefehl (zum Beispiel BNE-Branch if not equal)
genommen wird, auf der Grundlage der Vorgeschichte der Ausführungscodesequenzen
beispielsweise. Sobald eine Verzweigung vorhergesagt worden ist, kann
der nächste
Befehl in die „Pipeline” geladen werden
(zum Beispiel die Einheiten, die zur Ausführungseinheit 41 hinführen), so
daß dann,
wenn die Verzweigung als genommen vorhergesagt wird, die rich tigen
Befehle sofort für
die Ausführungseinheit verfügbar sind.
Wenn die Verzweigungsvorhersage falsch ist, dann sind die Befehle
in der Pipeline nicht richtig und müssen hinausgespült werden,
wobei die richtigen Befehle in die Pipeline geladen werden.
-
Bei
einem Beispiel eines mehrfädigen
(multi-threaded) Prozessors können
zwei Threads parallel verarbeitet werden. Unter Berücksichtigung
der hier angegebenen Lehren kann die vorliegende Erfindung auf drei
oder mehr Threads, die parallel verarbeitet werden, ausgedehnt werden.
Bei diesem Ausführungsbeispiel
schließt
der Begriff „parallel” eine gleichzeitige
und/oder sukzessive Verarbeitung/Ausführung von Befehlen ein. Hier
wird der Thread-Vorrang verwendet, um zu bestimmen, welcher Thread die
Verwendung geteilter Ressourcen erlangt, wenn beide Threads dieselben
Ressourcen gleichzeitig verwenden müssen. Der Thread-Vorrang könnte durch
ein oder mehrere Signale gekennzeichnet werden, die in einem Speicherbereich 4 in
dem Prozessor 10 (1) gespeichert
werden. Beispielsweise würden
Thread0Priority und Thread1Priority kennzeichnen, welcher der beiden
Threads (Thread 0 oder Thread 1) den Vorrang gegenüber dem
anderen aufweist. Bei einem Beispiel hat dann, wenn beide Signale
ausgeschaltet sind, keiner der Threads einen Vorrang gegenüber dem
anderen. Darüber
hinaus können
drei „Zähler” zur Verfügung gestellt
werden, um die Zuweisung des Thread-Vorrangs zu unterstützen. Bei 2 könnten diese
Zähler
als Teil der Retire-Einheit 51 zur Verfügung gestellt werden. Zunächst wird
ein Vorrang-Zähler
(Precedence Counter) 52 zur Verfügung gestellt, welcher auf
einen (unten beschriebenen) Anfangswert gesetzt wird – und bei
diesem Ausführungsbeispiel – auf 0
herunterzählt.
Wenn der Vorrang-Zähler 52 abgelaufen
ist (das heißt
0 erreicht), ist dies eine Anzeige an den Prozessor 10,
daß der
Vorrang von dem Thread, der den Vorrang hat, auf den anderen Thread
verschoben werden sollte. Ein Thread 0-Startzähler 53 und ein Thread
1-Startzähler 55 werden
außerdem
zur Verfügung
gestellt, welche einen Wert speichern, der verwendet wird, um den
Anfangswert des Vorrang-Zählers
(unten beschrieben) zu setzen.
-
Gemäß Ausführungsbeispielen
der vorliegenden Erfindung wird der Thread-Vorrang-Zähler so eingestellt,
daß er
ein geeignet dimensioniertes Zeitfenster auf der Grundlage des Voranschreitens
eines Threads zur Verfügung
stellt. Beispielsweise könnte das
Voranschreiten des Threads auf der Grundlage der Anzahl der Mikrooperationen
basieren, die festgeschrieben (retired) werden. Wenn der Thread-Vorrang-Zähler gesetzt
wird (zum Beispiel nachdem er abgelaufen ist), kann er mit einem
Wert neu geladen werden, der gleich einem mehrfachen des Werts (bis zu
einem vorgegebenen Maximum) aus dem dem Thread, der demnächst den
Vorrang haben wird, zugeordneten Startzähler ist. Demzufolge sollte
der Startzähler
einen Minimalwert von 1 haben. Wenn somit eine Mikrooperation durch
die Retire-Einheit 51 festgeschrieben wird, kann der Startzähler für diesen Thread
auf 1 gesetzt werden, so daß dann,
wenn er erneut den Thread-Vorrang erlangt, der Thread-Vorrang-Zähler auf
eine relativ geringe Zahl gesetzt werden wird. Wenn während der
Zeit, in der ein Thread einen Vorrang hat, der Thread-Vorrang-Zähler abläuft und
der Thread nicht in der Lage war, eine Mikrooperation während dieses
Zeitfensters festzuschreiben, wird der Startzähler um einen Wert (beispielsweise
1) inkrementiert, so daß beim
nächsten Mal,
wenn der Thread den Vorrang hat, er mehr Zeit haben wird, um wenigstens
eine Mikrooperation festzuschreiben (retire).
-
Die
Verwendung dieses Verfahrens zum Zuweisen eines Vorrangs hat wenigstens
zwei Nachteile. Zunächst
gibt es die Möglichkeit,
daß ein
Thread weiterhin einen Thread-Vorrang hat, selbst wenn er Mikrooperationen
festschreibt, während
der andere Thread nicht in der Lage ist, Mikrooperationen während seiner
Thread-Vorrang-Zeitfenster festzuschreiben. Wenn beispielsweise
Thread 0 1000 aufeinanderfolgende Divisionsoperationen und ein großes Thread-Vorrang-Fenster
enthält,
während
Thread 1 einen Divisionsbefehl enthält, könnte Thread 1 blockiert sein,
bis die Ausführung
von Thread 0 die 1000 Divisionsoperationen abschließt oder
bis das Thread-Vorrang-Zeitfenster
endet. Bei diesem Beispiel basiert das Thread-Vorrang-Zeitfenster auf der Zeitdauer,
die der Thread-Vorrang- Zähler benötigt, um
abzulaufen, nachdem er gesetzt worden ist. Wenn zweitens ein Thread
bezüglich
der Befehle „ausgehungert” wird (das
heißt
Ressourcen für
die Ausführung
von Mikrooperationen verfügbar
sind, aber das Abrufen von Befehlen eingeschränkt ist), wenn dieser Thread
den Vorrang erlangt, so kann die für den Thread-Vorrang-Zähler verfügbar gemachte Zeit
möglicherweise
nicht ausreichend sein, um das Abrufen eines Befehls zu ermöglichen.
Dies ist beispielsweise dann zu erkennen, wenn ein Seiten-Fehlversuch-Behandler
oder PMH (Page Miss Handler) verwendet wird, welcher Datenübersetzungsnachschlagepuffer
und Befehlsübersetzungsnachschlagepuffer
und Seiten- und
Cachezeilenbegrenzungsangelegenheiten behandelt. In einem solchen
Fall kann es sein, daß der
PMH wegen eines TLB-Fehlversuchs
schnell Befehle abrufen muß, aber
nicht in der Lage ist, dies auszuführen. Demzufolge muß die Inkrementierung
des Startzählers
für diesen
Thread mehrere Male ausgeführt
werden, bevor die von dem Thread-Vorrang-Zähler zur Verfügung gestellte
sich ergebende Zeit ausreichend ist, um das Abrufen von Befehlen
zu ermöglichen
(welche schließlich
zu der Ausführung
und dem Festschreiben von Mikrobefehlen für diesen Thread führen würde). Somit
geht jedesmal dann, wenn die Ausführung von Thread 1 versucht
wird und keine Befehle laden kann, Verarbeitungszeit für Thread
0 verloren, und die Verarbeitungszeit für den Befehlsladeausfall geht
ebenso verloren.
-
Gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung werden ein System und ein Verfahren angegeben,
welche die Leistungsfähigkeit
eines mehrfädigen
Prozessors über
die Zuteilung eines Thread-Vorrangs verbessern. Es wird auf 3 Bezug
genommen, in der ein Zustandsdiagramm für das Zuweisen eines Thread-Vorrangs
gemäß einem Ausführungsbeispiel
der vorliegenden Erfindung gezeigt ist. Im Zustand 61 verweist
der Thread-Vorrang auf dem ersten Thread, Thread 0. Der Thread-Vorrang-Zähler wird
bei diesem Ausführungsbeispiel
in Übereinstimmung
mit einem Systemtakt für
den Prozessor dekrementiert 63. Wie es durch Block 65 angezeigt
ist, ändert
sich der Zustand vom Zustand 61 in den Zustand 67,
wenn eine der folgenden Bedingungen erfüllt wird:
- 1.
Der Thread-Vorrang-Zähler
hat 0 erreicht;
- 2. Thread 0 schreibt eine Mikrooperation fest;
- 3. Es gibt keine Anzeige einer bevorstehenden befehlsseitigen
(Iside) Aushungerung für
Thread 0 mehr.
-
Iside-Aushungerung
liegt dann vor, wenn ein Thread keine Befehle abrufen kann, weil
der andere Thread oder die anderen Threads ihn effektiv derart blockiert,
daß er
dies nicht ausführen
kann. Hier ist eine Anzeige einer bevorstehenden Iside-Aushungerung eine
Anzeige, daß eine
solche Situation für
einen Thread herannahen könnte.
Eine Anzeige einer bevorstehenden Iside-Aushungerung könnte über die Überwachung
eines oder mehrere Zustände
oder Bedingungen vorweggenommen werden. Bei einem Ausführungsbeispiel
können
die Bedingungen eine oder mehrere der folgenden einschließen:
- 1. Der Prozessor ist in einem Multi-Threaded-Verarbeitungsmodus
im Unterschied zu einem Einzel-Thread-Verarbeitungsmodus und mehr als ein Thread
ist aktiv.
- 2. Der gerade betrachtet Thread weist keine Befehle in der Ausführungspipeline
auf (zum Beispiel gibt es keine Befehle, die am MUX 35 darauf
warten, daß die
Einplanungssteuerlogik 37 bewirkt, daß Mikrooperationen für diesen
Zweck an die Ausführungseinheit 41 (2)
weitergeleitet werden).
- 3. Die Ausgabe neuer Befehle in die Ausführungs-Pipeline wird nicht
blockiert, weil der gerade betrachtete Thread eine benötigte Ressource gefüllt hat.
Bei diesem Ausführungsbeispiel schließt die Ausführungspipeline
die Verarbeitung von Befehlen aus dem MUX 35 über die
Ausführungseinheit
ein. Beispielsweise könnte
die Ausführungseinheit 41 einen
Speicher-Puffer für
den aktuellen Thread enthalten, der mit Speicher-Befehlen gefüllt wird.
In einem solchen Fall wird die Verarbeitung des Threads nicht notwendigerweise
negativ beeinflußt
durch das Fehlen des Befehlsabrufens, wohl aber durch die Verzögerung bei
der Ausführung
von Speicher-Befehlen.
- 4. Einem Thread, der nicht der gerade betrachtet ist, wurde
kein voller oder exklusiver Zugriff auf die Prozessormo dule gegeben.
Mit anderen Worten, diese Bedingung ist nicht erfüllt, wenn
einem anderen Thread ein voller oder exklusiver Zugriff auf Prozessormodule
gegeben worden ist. In einer solchen Situation wäre irgendeine Befehlsaushungerung
auf der Seite des gerade betrachteten Threads beabsichtigt.
- 5. Der gerade betrachtete Thread befindet sich in einem Zustand,
in dem er versucht, Befehle abzurufen. Beispielsweise enthalten
viele Prozessoren, einschließlich
derjenigen, die von der Intel Cooperation (Santa Clara, Californien)
hergestellt werden, ein „Stoppe-Takt”-Pin. Ein
Anlegen eines Signals an dieses Pin führt dazu, daß der Prozessor
seine Ressourcen ausräumt.
In diesem Fall können
sämtliche
Ressourcen frei von ausführbaren
Befehlen für
den betrachteten Thread sein. Dementsprechend würde das Fehlen des Befehlsabrufens
in einem solchen Fall nicht als Aushungerung angesehen werden. Ein
Umschalten aus einem Multi-Thread-Modus einen Einzel-Thread-Modus
ist ein weiteres Beispiel, bei welchem eine Befehlsaushungerung
nicht als ein Problem angesehen werden sollte.
- 6. Ein Sicherungsprotokoll einer höheren Leistungsfähigkeit
ist nicht aktiv. Wenn es beispielsweise tatsächlich ein anderes Protokoll
gibt, um den Vorrang von einem Thread zu einem anderen umzuschalten,
so kann das Abarbeiten dieses Protokolls mit einer Befehlsaushungerungsbehandlung
gemäß der vorliegenden
Erfindung einen negativen Einfluß auf die Prozessorleistung haben.
- 7. Ein Befehlsaushungerungs-Freigabebit ist gesetzt (das heißt das Bit
kann von einer Steuerlogik gesetzt werden, um Iside-Aushungerungs/Erfassungs/Auflösung auszuschalten.
- 8. Der betrachtete Thread wartet nicht auf einen Befehlsabruf,
der das Chip verlassen hat (zum Beispiel vom Prozessor weg, wie
beispielsweise Hauptspeicher).
-
Wenn
bei diesem Ausführungsbeispiel
sämtliche überwachten
Bedingungen erfüllt
sind, dann gibt es eine Anzeige einer bevorstehenden Iside-Aushungerung
für Thread
0. Obwohl acht Be dingungen oben präsentiert wurden, kann die vorliegende
Erfindung auf zusätzliche
Bedingungen oder eine geringeren Anzahl von Bedingungen ausgedehnt
werden. Beispielsweise könnte
die Anzeige einer bevorstehenden Iside-Aushungerung lediglich darauf
basieren, daß die
obigen Bedingungen 1, 2 und 5 wahr sind.
-
Im
Block 67 wird der Thread-Vorrang von Thread 0 zu Thread
1 gewechselt. Der Thread-Vorrang-Zähler wird mit einem Wert von
16 multipliziert mit dem Wert in einem Startzähler eines zweiten Threads
(Thread 1) geladen. Zu diesem Zeitpunkt werden die Thread-Vorrangsignale
so umgeschaltet, daß sie
anzeigen, daß Thread
1 den Vorrang über Thread
0 hat. Die Steuerung fährt
dann zu Block 69 fort, wo Thread 1 den Vorrang hat und
der Thread-Vorrang-Zähler
in Übereinstimmung
mit einem Systemtakt dekrementiert wird (Block 70). Wie es
durch die Bedingungen in Block 71 angezeigt ist, ändert sich
der Zustand von Block 69 zu Block 73, wenn eine
oder mehrere Bedingungen erfüllt
sind. Bei diesem Ausführungsbeispiel ändert sich
der Zustand, wenn irgendeine der folgenden drei Bedingungen erfüllt ist:
- 1. Der Thread-Vorrang-Zähler erreicht 0;
- 2. Thread 0 schreibt eine Mikrooperation fest (retires);
- 3. es gibt keine Anzeige einer bevorstehenden Iside(Instruction
Side)-Aushungerung für
Thread 1.
-
Im
Zustand 73 wird der Thread-Vorrang-Zähler mit 16 multipliziert mit
dem Wert im Startzähler des
Thread 1 geladen, und die richtigen Thread-Vorrang-Signale werden
so umgeschaltet, daß sie
anzeigen, daß Thread
0 Vorrang hat. Die Steuerung kehrt dann zum Block 61 zurück. Beim
Rücksetzen
des Prozessors (Block 75) werden die Aktionen des Zustands 73 unternommen,
und Thread 0 wird bei diesem Ausführungsbeispiel der Vorrang
gegeben.
-
Es
wird auf 4 Bezug genommen, in der ein
Zustandsdiagramm zum Setzen des Startzählers eines der Threads 0 und
1 gemäß einem
Ausführungsbeispiel
der vorliegenden Erfindung gezeigt ist. Beim Rücksetzen (Block 80)
geht die Steuerung zum Block 81, wo der Wert für den Startzähler auf
1 gesetzt wird. Um vom Block 81 zum Block 82 zu
gelangen, sollte eine von zwei Bedingungen (Block 85) erfüllt sein:
- 1. Der Thread-Vorrang wurde zu einem anderen Thread
umgeschaltet, bevor der gegenwärtige Thread
in der Lage war, eine Mikrooperation festzuschreiben (to retire);
- 2. es gibt eine Anzeige einer bevorstehenden befehlsseitigen
Aushungerung für
den aktuellen Thread.
-
Im
Block 82 wird der Wert in dem Startzähler geometrisch modifiziert
(indem beispielsweise ein binäres
1-Bit hineingeschoben und sämtliche
Bits nach links verschoben werden). Beispielsweise würde ein Wert
1 zu einem Wert 3 gemacht werden, ein Wert 3 würde zu einem Wert 7 gemacht
werden und ein Wert 2n-1 würde zu einem
Wert 2n+1 – 1 gemacht werden (wobei n > 0 ist). Die Steuerung
verbleibt beim Zustand 82, während es eine Anzeige einer
bevorstehenden Iside-Aushungerung gibt (Block 86). Bei
diesem Ausführungsbeispiel
wird bei jedem Systemtakt der Wert in dem Startzähler inkrementiert, wie es oben
erörtert
worden ist, bis ein Maximalwert erreicht ist. Die Steuerung bewegt
sich zurück
zum Block 81, wenn eine der folgenden Bedingungen auftritt
(Block 84):
- 1. Eine Mikrooperation
für diesen
Thread wird festgeschrieben;
- 2. es gibt keine Anzeige einer bevorstehenden befehlsseitigen
Aushungerung für
den Thread
-
Die
Steuerung geht vom Block 82 zum Block 83, wenn „weitere
Bedingungen” nicht
erfüllt
sind. Bei diesem Ausführungsbeispiel
geht dann, wenn die Steuerung vom Block 81 zum Block 82 ging,
weil der Thread-Vorrang zu einem anderen Thread umgeschaltet wurde,
bevor der aktuelle Thread in der Lage war, eine Mikrooperation festzuschreiben,
die Steuerung vom Block 82 zu 83, wenn folgende „weitere” Bedingungen
nicht erfüllt
sind:
- 1. Der betrachtete Thread hat eine Mikrooperation festgeschrieben;
und
- 2. das Thread-Vorrangsignal wurde nicht zu dem betrachteten
Thread umgeschaltet (Block 87). Mit anderen Worten, der
Wert in dem Zähler
soll bei demselben Wert gehalten werden, wenn der Thread keine Mikrooperation
festgeschrieben hat und dieser Thread den Thread-Vorrang hat. Die Steuerung
bleibt bei Block 83, wo der aktuelle Wert in dem Startzähler auf
dem gleichen Wert gehalten wird, solange die anderen Bedingungen nicht
erfüllt
sind (Block 88). Die Steuerung kehrt zum Block 82 zurück, wenn
eine der folgenden Bedingungen erfüllt ist (Block 89):
1.
Der Thread-Vorrang schaltete aus dem aktuellen Thread zu einem anderen
Thread um, bevor eine Mikrooperation festgeschrieben werden konnte;
2.
es gibt eine Anzeige einer bevorstehenden befehlsseitigen Aushungerung
für den
Thread.
-
Die
Steuerung geht vom Block 83 zum Block 81, wenn
der Thread eine Mikrooperation festschreibt (retires) (Block 90).
Schließlich
geht die Steuerung vom Block 81 zum Block 83,
wenn weitere Bedingungen nicht erfüllt sind (Block 91).
Unter Verwendung des Verfahrens und Systems gemäß der vorliegenden Erfindung
können
die oben genannten Probleme vermieden werden. Die Implementierung der
Ablaufdiagramme der 3 und 4 können durch
eine geeignet konfigurierte Steuerlogik ausgeführt werden (die beispielsweise
die Steuerlogik 37 in 2 einschließt). Alternativ
kann die Steuerlogik ein Untermodul des Prozessors 10 sein,
der Befehle ausführt,
um die Ablaufdiagramme der 3 und 4 zu
implementieren.
-
Obwohl
verschiedene Ausführungsbeispiele speziell
hier veranschaulicht und beschrieben worden sind, ist es klar, daß Modifikationen
und Variationen der vorliegenden Erfindung durch die obigen Lehren
abgedeckt sind und innerhalb des Umfangs der beigefügten Ansprüche liegen,
ohne vom Geist und beabsichtigten Umfang der Erfindung abzuweichen.