-
Die vorliegende Offenlegung betrifft das Gebiet der Prozessoren und insbesondere Mehrfach-Thread-Prozessoren und Techniken zum Vorübergehenden Suspendieren der Verarbeitung eines Threads in einem Mehrfach-Thread-Prozessor.
-
Ein Mehrfach-Thread-Prozessor kann gleichzeitig mehrere verschiedene Anweisungssequenzen verarbeiten. Ein Hauptmotivierungsfaktor für die Ausführung mehrerer Anweisungsströme in einem einzigen Prozessor ist die resultierende Verbesserung der Prozessorausnutzung. Über die Jahre haben sich parallele Architekturen entwickelt, es ist aber häufig schwierig, genug Parallelität aus einem einzigen Anweisungsstrom zu extrahieren, um die mehrfachen Ausführungseinheiten auszunutzen. Durch Prozessoren mit gleichzeitigen Mehrfach-Threads können mehrere Anweisungsströme gleichzeitig in den verschiedenen Ausführungsbetriebsmitteln ausgeführt werden, um zu versuchen, diese Betriebsmittel besser auszunützen. Mehrfach-Threads können besonders für solche Programme vorteilhaft sein, bei denen es zu Verzögerungen hoher Latenz kommt oder die häufig auf das Eintreten von Ereignissen warten. Wenn ein Thread darauf wartet, daß eine Task mit hoher Latenz fertig wird, oder auf ein bestimmtes Ereignis, kann ein anderer Thread verarbeitet werden.
-
Es wurden viele verschiedene Techniken vorgeschlagen, um zu steuern, wann ein Prozessor zwischen Threads wechselt. Zum Beispiel erkennen bestimmte Prozessoren bestimmte Ereignisse mit langer Latenz, wie zum Beispiel L2-Cache-Fehlspeicherungen und wechseln als Reaktion auf diese erkannten Ereignisse mit langer Latenz Threads. Obwohl die Erkennung solcher Ereignisse mit langer Latenz in bestimmten Umständen effektiv sein kann, erkennt eine solche Ereigniserkennung nur unwahrscheinlich alle Punkte, an denen es effizient sein kann, Threads zu wechseln. Insbesondere kann es sein, daß das Thread-Wechseln auf Ereignisbasis Punkte in einem Programm, an denen Verzögerungen vom Programmierer beabsichtigt sind, nicht erkennt.
-
Tatsächlich ist häufig der Programmierer am besten in der Lage, zu bestimmen, wann es effizient wäre, Threads zu wechseln, um verschwenderische Spin-Wait-Schleifen oder andere Betriebsmittel verbrauchende Verzögerungstechniken zu vermeiden. Indem Programmen erlaubt wird, den Thread-Wechsel zu steuern, können Programme also effizienter operieren. Zu diesem Zweck können explizite Programmanweisungen vorteilhaft sein, die sich auf die Thread-Auswahl auswirken. Zum Beispiel wird in der US-Patentanmeldung Nr. 09/489,130, registriert am 21.1.2000, eine ”Pause”-Anweisung beschrieben. Durch die Pause-Anweisung kann ein Ausführungs-Thread vorübergehend suspendiert werden, bis entweder ein Zählwert erreicht wird oder bis eine Anweisung die Prozessor-Pipeline durchlaufen hat. Verschiedene Techniken können nützlich sein, indem Programmierern erlaubt wird, die Betriebsmittel eines Mehrfach-Thread-Prozessors effizienter einzuspannen.
-
Das „Intel Architecture Software Developer's Manual”, Vol. 3: System Programming, Seiten 15-1 bis 15-15, 1999 offenbart eine Debugging-Unterstützung, auf die mit Hilfe von Debug-Register zugegriffen werden kann, wobei die Debug-Register die Speicheradressen und I/O-Stellen als sogenannte Breakpoints enthalten können. Die Breakpoints sind vom Nutzer bestimmte Orte in einem Programm, Datenspeicherbereich in einem Speicher oder bestimmte I/O-Ports, an denen die Ausführung des Programms angehalten und der Zustand des Prozessors durch Aufrufen einer Debugger-Software geprüft werden kann.
-
Der Artikel „The Win32 Debugging Application Programming Interface” von R. Kath, 5. November 1992, abrufbar unter http://msdn.microsoft.com/enus/library/ms809754(printer).aspx offenbart Win32-Debug-Funktionen. Diese Funktionen ermöglichen es einem Debugger, den Auftritt eines Debug-Ereignisses abzuwarten, die Ausführung des zu debuggenden Prozesses zu unterbrechen, das Debug-Ereignis zu verarbeiten und danach die Ausführung des Prozesses wiederaufzunehmen.
-
US 5,428,757 A offenbart ein Verfahren zum Reduzierung der Entleerung von Translation-Look-Aside-Puffern (TLB).
-
US 5,493,660 A offenbart einen softwareunterstützten Hardware-TLB-Fehler-Handler. Wenn ein TLB-Fehler auftritt, berechnet der TLB-Fehler-Hander basierend auf einer fehlerhaften virtuellen Adresse eine physikalische Adresse eines Seitentabelleneintrags, der sich in einer für die Hardware sichtbaren Tabelle befindet.
-
Es ist die Aufgabe der vorliegenden Erfindung, die Effizienz bei der Kommunikation paralleler Threads in einem Simultaneous-Multithreading-Prozessor zu verbessern.
-
Die Aufgabe wird gelöst durch einen Simultaneous-Multithreading-Prozessor mit den Merkmalen des Hauptanspruchs 1, einen Simultaneous-Multithreading-Prozessor mit den Merkmalen des nebengeordneten Anspruchs 2 sowie durch Verfahren mit den Merkmalen gemäß den nebengeordneten Ansprüchen 13 und 14.
-
Vorteilhafte Ausführungsformen der Erfindung sind in den abhängigen Ansprüchen angegeben.
-
Kurze Beschreibung der Zeichnungen
-
Die vorliegende Erfindung wird in den Figuren der beigefügten Zeichnungen als Beispiel und nicht als Beschränkung veranschaulicht.
-
1 zeigt eine Ausführungsform eines Mehrfach-Thread-Prozessors mit einer Überwachungsvorrichtung zum Überwachen von Speicherzugriffen.
-
2 ist ein Flußdiagramm der Funktionsweise des Mehrfach-Thread-Prozessors von 1 gemäß einer Ausführungsform.
-
3 zeigt weitere Einzelheiten einer Ausführungsform eines Mehrfach-Thread-Prozessors.
-
4 zeigt Betriebsmittel-Partitionierung-Sharing und -Duplikation gemäß einer Ausführungsform.
-
5 ist ein Flußdiagramm des Suspendieren und Wiederaufnehmens der Ausführung eines Threads gemäß einer Ausführungsform.
-
6a ist ein Flußdiagramm der Aktivierung und Funktionsweise von Überwachungslogik gemäß einer Ausführungsform.
-
6b ist ein Flußdiagramm der Erweiterung der Beobachtbarkeit von Schreiboperationen gemäß einer Ausführungsform.
-
7 ist ein Flußdiagramm von Überwachungsoperationen gemäß einer Ausführungsform.
-
8 zeigt ein System gemäß einer Ausführungsform.
-
9a–9c zeigen verschiedene Ausführungsformen von Softwaresequenzen, die offengelegte Prozessoranweisungen und -techniken verwenden.
-
10 zeigt eine alternative Ausführungsform, die es ermöglicht, daß eine überwachte Adresse Cache-gespeichert bleibt.
-
11 zeigt die verschiedenen Entwurfsrepräsentationen oder -formate zur Simulation, Emulation und Herstellung eines Entwurfs unter Verwendung der offengelegten Techniken.
-
Ausführliche Beschreibung
-
Die folgende Beschreibung beschreibt Techniken zum Suspendieren der Ausführung eines Threads bis ein spezifizierter Speicherzugriff auftritt. In der folgenden Beschreibung werden zahlreiche spezifische Einzelheiten, wie zum Beispiel logische Implementierungen, Opcodes, Mittel zum Spezifizieren von Operanden, Implementierungen für Betriebsmittel-Partitionierung/-Sharing/-Duplikation, Typen und Beziehungen von Systemkomponenten und Wahlmöglichkeiten für logische Partitionierung/Integration dargelegt, um ein besseres Verständnis der vorliegenden Erfindung zu ermöglichen. Für Fachleute ist jedoch erkennbar, daß die Erfindung ohne solche spezifischen Einzelheiten ausgeübt werden kann. In anderen Fällen wurden Steuerstrukturen, Schaltung auf Gatterebene und volle Softwareanweisungssequenzen nicht im Einzelnen gezeigt, um die Erfindung nicht zu verdecken. Anhand der angegebenen Beschreibungen werden Durchschnittsfachleute in der Lage sein, ohne übermäßiges Experimentieren geeignete Funktionalität zu implementieren.
-
Durch die offengelegten Techniken kann ein Programmierer einen Wartemechanismus in einem Thread implementieren, während andere Threads Verarbeitungsbetriebsmittel einspannen können. Es kann eine Überwachungsvorrichtung eingerichtet werden, so daß ein Thread suspendiert werden kann, bis ein bestimmter Speicherzugriff, wie zum Beispiel eine Schreiboperation in eine spezifizierte Speicherstelle auftritt. Somit kann ein Thread bei einem spezifizierten Ereignis wiederaufgenommen werden, ohne eine prozessorbetriebsmittelverschwendende Routine wie etwa eine Spin-Wait-Schleife auszuführen. Bei bestimmten Ausführungsformen können zuvor dem suspendierten Thread zugeordnete Partitionen freigegeben werden, während der Thread suspendiert ist. Diese und/oder andere offengelegte Techniken können vorteilhafterweise den Gesamtprozessordurchsatz verbessern.
-
1 zeigt eine Ausführungsform eines Mehrfach-Thread-Prozessors 100 mit einer Speicherzugriffüberwachungsvorrichtung 110 zur Überwachung von Speicherzugriffen. Bei bestimmten Ausführungsformen kann ein ”Prozessor” als eine einzige integrierte Schaltung gebildet werden. Bei anderen Ausführungsformen können mehrere integrierte Schaltungen zusammen einen Prozessor bilden, und bei noch anderen Ausführungsformen können Hardware- und Softwareroutinen (z. B. binäre Übersetzungsroutinen) zusammen den Prozessor bilden. Bei der Ausführungsform von 1 führt eine Bus-/Speichersteuerung 120 einem Frontend 130 auszuführende Anweisungen zu. Das Frontend 130 lenkt das Abrufen von Anweisungen von verschiedenen Threads gemäß Anweisungszeigern 170. Anweisungszeigerlogik ist vervielfältigt, um mehrere Threads zu unterstützen.
-
Das Frontend 130 leitet Anweisungen in Thread-partitionierbare Betriebsmittel 140 zur weiteren Verarbeitung. Die Thread-partitionierbaren Betriebsmittel 140 enthalten logisch getrennte Partitionen, die fest bestimmten Threads zugeordnet sind, wenn mehrere Threads in dem Prozessor 100 aktiv sind. Bei einer Ausführungsform enthält jede getrennte Partition nur Anweisungen aus dem Thread, dem dieser Teil fest zugeordnet ist. Die Thread-partitionierbaren Betriebsmittel 140 können zum Beispiel Anweisungswarteschlangen enthalten. In einem Einzel-Thread-Modus können die Partitionen der Thread-partitionierbaren Betriebsmittel 140 kombiniert werden, um eine einzige große Partition zu bilden, die dem einen Thread fest zugeordnet ist.
-
Außerdem enthält der Prozessor 100 den vervielfältigten Zustand 180. Der vervielfältigte Zustand 180 enthält Zustandsvariablen, die ausreichen, um den Kontext für einen logischen Prozessor zu halten. Mit dem vervielfältigten Zustand 180 können mehrere Threads ausgeführt werden, ohne um Zustandsvariablenspeicherung zu konkurrieren. Zusätzlich kann für jeden Thread Registerzuteilungslogik vervielfältigt sein. Die vervielfältigte zustandsbezogene Logik operiert mit den entsprechenden Betriebsmittelpartitionen, um ankommende Anweisungen für die Ausführung vorzubereiten.
-
Die Thread-partitionierbaren Betriebsmittel 140 leiten Anweisungen zu gemeinsam benutzten Betriebsmitteln 150 weiter. Die gemeinsam benutzten Betriebsmittel 150 operieren an Anweisungen ungeachtet ihres Ursprungs. Zum Beispiel können Scheduler- und Ausführungseinheiten Thread-unbewußte gemeinsam benutzte Betriebsmittel sein. Die partitionierbaren Betriebsmittel 140 können den gemeinsam benutzten Betriebsmitteln 150 Anweisungen aus mehreren Threads zuführen, indem zwischen den Threads auf eine faire Weise alterniert wird, die einen fortgesetzten Fortschritt an jedem aktiven Thread bereitstellt. Somit können die gemeinsam benutzten Betriebsmittel die bereitgestellten Anweisungen an dem entsprechenden Zustand ohne Sorge um die Thread-Mischung ausführen.
-
Den gemeinsam benutzten Betriebsmitteln 150 kann eine weitere Menge von Thread-partitionierbaren Betriebsmitteln 160 folgen. Die Thread-partitionierbaren Betriebsmittel 160 können Ausscheidungsbetriebsmittel wie zum Beispiel ein Umordnungspuffer und dergleichen enthalten. Folglich können die Thread-partitionierbaren Betriebsmittel 160 sicherstellen, daß die Ausführung von Anweisungen aus jedem Thread ordnungsgemäß endet, und daß der entsprechende Zustand für diesen Thread entsprechend aktualisiert wird.
-
Wie bereits erwähnt, kann es wünschenswert sein, Programmierern eine Technik zur Implementierung der Funktionalität einer Spin-Wait-Schleife bereitzustellen, ohne ein konstantes Abfragen einer Speicherstelle oder sogar Ausführen von Anweisungen zu erfordern. Somit enthält der Prozessor 100 von 1 die Speicherzugriffsüberwachungsvorrichtung 110. Die Speicherzugriffsüberwachungsvorrichtung 110 kann mit Informationen über einen Speicherzugriffszyklus programmiert werden, für dessen Beobachtung die Überwachungsvorrichtung 110 freigegeben werden kann. Folglich enthält die Überwachungsvorrichtung 110 ein Überwachungsvorrichtungszyklusinformationsregister 112, das durch Vergleichslogik 114 mit aus der Bus-/Speichersteuerung 120 empfangenen Buszyklusinformationen verglichen wird. Wenn es zu einer Übereinstimmung kommt, wird ein Thread-Wiederaufnehmen-Signal erzeugt, um einen suspendierten Thread neu zu starten. Aus internen und/oder externen Bussen des Prozessors können Speicherzugriffsinformationen erhalten werden.
-
Das Überwachungsvorrichtungszyklusinformationsregister 112 kann Einzelheiten enthalten, die die Art des Zyklus und/oder die Adresse, die die Wiederaufnahme eines Threads auslösen sollte, spezifizieren. Bei einer Ausführungsform speichert das Überwachungsvorrichtungszyklusinformationsregister 112 eine physikalische Adresse und die Überwachungsvorrichtung wartet auf jegliche Buszyklen, die ein tatsächliches oder potentielles Schreiben in diese physikalische Adresse anzeigen. Ein solcher Zyklus kann in Form eines expliziten Schreibzyklus vorliegen und/oder kann eine Leseoperation für Eigentümerschaft oder ein invalidierender Zyklus durch einen anderen Agenten sein, der versucht, die exklusive Eigentümerschaft einer Cache-speicherbaren Leitung zu übernehmen, so daß er ohne eine externe Bustransaktion auf diese Leitung schreiben kann. In jedem Fall kann die Überwachungsvorrichtung so programmiert werden, daß sie bei verschiedenen Ausführungsformen an verschiedenen Transaktionen ausgelöst wird.
-
Die Operationen der Ausführungsform von 1 können mit Bezug auf das Flußdiagramm von 2 weiter erläutert werden. Bei einer Ausführungsform enthält der Anweisungssatz des Prozessors 100 einen MONITOR-Opcode (Anweisung), der die Überwachungstransaktionsinformationen einrichtet. Im Block 200 wird der MONITOR-Opcode als Teil der Anweisungssequenz eines ersten Threads (T1) empfangen. Wie im Block 210 angegeben, ermöglicht es der Prozessor 100 als Reaktion auf den MONITOR-Opcode der Überwachungsvorrichtung 110, Speicherzugriffe für den spezifizierten Speicherzugriff zu überwachen. Der auslösende Speicherzugriff kann durch einen impliziten oder einen expliziten Operanden spezifiziert werden. Deshalb kann das Ausführen des MONITOR-Opcodes die Überwachungsadresse spezifizieren, da die Überwachungsadresse im Voraus in einem Register oder in einer anderen Speicherstelle als ein impliziter Operand gespeichert werden kann. Wie im Block 215 angegeben, prüft die Überwachungsvorrichtung, ob der spezifizierte Zyklus erkannt wurde. Wenn nicht, überwacht die Überwachungsvorrichtung weiter Speicherzugriffe. Wenn der auslösende Zyklus erkannt wird, wird ein Anstehendes-Überwachungsereignis-Anzeiger gesetzt, wie im Block 220 angegeben.
-
Die Ausführung des MONITOR-Opcodes löst die Aktivierung der Überwachungsvorrichtung 110 aus. Die Überwachungsvorrichtung 110 kann beginnen, parallel mit anderen Operationen in dem Prozessor zu operieren. Bei einer Ausführungsform richtet die MONITOR-Anweisung selbst nur die Überwachungsvorrichtung 110 mit den ordnungsgemäßen Speicherzyklusinformationen ein und aktiviert die Überwachungsvorrichtung 110, ohne Überwachungsereignisse zu entmaskieren. Anders ausgedrückt, können sich bei dieser Ausführungsform nach der Ausführung des MONITOR-Opcodes Überwachungsereignisse ansammeln, was jedoch unerkannt bleiben kann, wenn sie nicht explizit entmaskiert werden.
-
Im Block 225 wird also das Auslösen eines Speicherwartens als ein separates Ereignis angegeben. Bei bestimmten Ausführungsformen kann ein Opcode für Speicherwarten (MWAIT) verwendet werden, um die Erkennung von Überwachungsereignissen und die Suspendierung von T1 auszulösen. Durch die Verwendung zweier getrennter Anweisungen zum Einrichten und zum Auslösen der Thread-Suspendierung kann ein Programmierer zusätzliche Flexibilität erhalten und es kann ein effizienteres Programmieren möglich werden. Eine alternative Ausführungsform löst das Speicherwarten jedoch von dem ersten Opcode aus, der auch die Überwachungsvorrichtung 110 einrichtet. In jedem Fall aktivieren eine oder mehrere Anweisungen die Überwachungsvorrichtung und ermöglichen das Erkennen von Überwachungsereignissen.
-
Bei Ausführungsformen, bei denen getrennte Opcodes zum Aktivieren der Überwachungsvorrichtung 110 und zum Auslösen des Erkennens von Überwachungsereignissen verwendet werden, kann es vorteilhaft sein, eine Prüfung durchzuführen, um sicherzustellen, daß die Überwachungsvorrichtung aktiviert worden ist, bevor der Thread suspendiert wird, wie im Block 230 gezeigt. Durch Prüfen, ob ein Überwachungsereignis bereits ansteht (nicht gezeigt) kann zusätzlich die Suspendierung von T1 vermieden werden und die Operationen können im Block 250 fortgesetzt werden. Unter der Annahme, daß die Überwachungsvorrichtung 110 freigegeben wurde und keine Überwachungsereignisse bereits anstehen, kann T1 suspendiert werden, wie im Block 235 gezeigt.
-
Mit suspendiertem T1 tritt der Prozessor in einen implementierungsabhängigen Zustand ein, der es anderen Threads ermöglicht, die Prozessorbetriebsmittel besser auszunutzen. Bei bestimmten Ausführungsformen kann der Prozessor einen Teil der Partitionen der partitionierbaren Betriebsmittel 140 und 160, die fest T1 zugeordnet waren, oder alle diese freigeben. Bei anderen Ausführungsformen können verschiedene Permutationen des MONITOR-Opcodes oder von diesem zugeordneten Einstellungen angeben, welche etwaigen Betriebsmittel freigegeben werden. Wenn zum Beispiel ein Programmierer ein kürzeres Warten antizipiert, kann der Thread suspendiert werden, aber seine Betriebsmittelpartitionen aufrechterhalten. Der Durchsatz ist immer noch verbessert, da die gemeinsam benutzten Betriebsmittel während des Thread-Suspendierungszeitraums ausschließlich von anderen Threads verwendet werden können. Wenn ein längeres Warten antizipiert wird, können durch Freigabe aller dem suspendierten Thread zugeordneten Partitionen andere Threads zusätzliche Betriebsmittel erhalten, wodurch der Durchsatz der anderen Threads potentiell erhöht wird. Der zusätzliche Durchsatz wird jedoch zu Lasten des Overheads erhalten, das dem Entfernen und Hinzufügen von Partitionen, wenn Threads suspendiert bzw. wiederaufgenommen werden, zugeordnet ist.
-
T1 bleibt in einem suspendierten Zustand, bis ein Überwachungsereignis ansteht. Wie bereits besprochen, operiert die Überwachungsvorrichtung 110 unabhängig, um Überwachungsereignisse zu erkennen und zu signalisieren (Blöcke 215–220). Wenn der Prozessor im Block 240 erkennt, daß ein Überwachungsereignis ansteht, wird T1 wiederaufgenommen, wie im Block 250 angegeben. Es muß keine aktive Verarbeitung von Anweisungen in T1 auftreten, damit das Überwachungsereignis T1 aufweckt. Statt dessen bleibt T1 suspendiert und die freigegebene Überwachungsvorrichtung 110 signalisiert dem Prozessor ein Ereignis. Der Prozessor wickelt das Ereignis ab, erkennt, daß das Ereignis anzeigt, daß T1 wiederaufgenommen werden soll, und führt die entsprechenden Aktionen zur Wiederaufnahme von T1 durch.
-
Die Ausführungsformen von 1 und 2 liefern also Techniken, durch die ein durch ein Programm suspendierter Thread nach dem Auftreten eines spezifizierten Speicherzugriffs wiederaufgenommen werden kann. Bei einer Ausführungsform bewirken auch andere Ereignisse, daß T1 wiederaufgenommen wird. Zum Beispiel kann ein Interrupt bewirken, daß T1 wiederaufgenommen wird. Durch eine solche Implementierung ist es vorteilhafterweise möglich, daß die Überwachungsvorrichtung insofern weniger als perfekt ist, als sie bestimmte Speicherzugriffe oder andere Bedingungen, die eine Wiederaufnahme des Threads verursachen sollten, verfehlt (nicht erkennt). Folglich kann T1 manchmal unnötigerweise aufgeweckt werden. Eine solche Implementierung verringert jedoch die Wahrscheinlichkeit, daß T1 aufgrund eines verfehlten Ereignisses permanent eingefroren wird, wodurch Hardwareentwurf und -validierung vereinfacht werden. Die unnötigen Erweckungen von T1 können nur eine geringfügige Unannehmlichkeit sein, da eine Schleife konstruiert werden kann, so daß T1 nachprüft, ob die Bedingung, die er erwartet hat, wirklich aufgetreten ist, und er sich nochmals selbst suspendieren kann, wenn dies nicht der Fall ist.
-
Bei bestimmten Ausführungsformen können die Thread-partitionierbaren Betriebsmittel, die vervielfältigten Betriebsmittel und die gemeinsam benutzten Betriebsmittel verschieden angeordnet sein. Bei bestimmten Ausführungsformen liegen möglicherweise nicht an beiden Enden der gemeinsam benutzten Betriebsmittel partitionierbare Betriebsmittel vor. Bei bestimmten Ausführungsformen können die partitionierbaren Betriebsmittel möglicherweise nicht strikt partitioniert sein, sondern statt dessen bestimmten Anweisungen ermöglichen, Partitionen zu überschreiten, oder Partitionen ermöglichen, eine verschiedene Größe aufzuweisen, abhängig von dem in dieser Partition ausgeführten Thread oder von der Gesamtzahl von ausgeführten Threads. Außerdem können verschiedene Mischungen von Betriebsmitteln als gemeinsam benutzte, duplizierte und partitionierte Betriebsmittel ausgewiesen werden.
-
3 zeigt weitere Einzelheiten einer Ausführungsform eines Mehrfach-Thread-Prozessors. Die Ausführungsform von 3 enthält unter anderem mit Kohärenz zusammenhängende Logik 350, eine Implementierung einer Überwachungsvorrichtung 310 und eine spezifische Implementierung von Thread-Suspendierungs- und -wiederaufnahmelogik 377. Bei der Ausführungsform von 3 enthält eine Busschnittstelle 300 eine Bussteuerung 340, Ereigniserkennungslogik 345, eine Überwachungsvorrichtung 310 und die mit Kohärenz zusammenhängende Logik 350.
-
Die Busschnittstelle 300 führt einem Frontend 365 Anweisungen zu, das die Erzeugung von Mikrooperanden (uOP) durchführt und aus Makroanweisungen uOPs erzeugt. Die Ausführungsbetriebsmittel 370 empfangen uOPS von dem Frontend 365, und Backend-Logik 380 zieht die verschiedenen uOPs zurück, nachdem sie ausgeführt wurden. Bei einer Ausführungsform unterstützen das Frontend, das Backend und Ausführungsbetriebsmittel eine Ausführung außerhalb der Reihenfolge.
-
Mit Bezug auf 5–9 werden verschiedene Einzelheiten von Operationen weiter besprochen. Kurz gefaßt kann jedoch ein MONITOR-Opcode durch die Busschnittstelle 300 in den Prozessor eintreten und durch das Frontend 365 für die Ausführung vorbereitet werden. Bei einer Ausführungsform wird zur Ausführung durch die Ausführungsbetriebsmittel 370 ein spezieller MONITOR-uOP erzeugt. Der MONITOR-uOP kann von den Ausführungseinheiten ähnlich wie eine Speicheroperation behandelt werden, wobei die Überwachungsadresse durch Adressenübersetzungslogik 375 in eine physikalische Adresse übersetzt wird, die der Überwachungsvorrichtung 310 zugeführt wird. Die Überwachungsvorrichtung 310 kommuniziert mit Thread-Suspendierungs- und -wiederaufnahmelogik 377, um die Wiederaufnahme von Threads zu bewirken. Die Thread-Suspendierungs- und -wiederaufnahmelogik kann Partition und Verschmelzung von Betriebsmitteln durchführen, wenn sich die Anzahl aktiver Threads ändert.
-
Zum Beispiel zeigt 4 das Partitionieren, Duplizieren und gemeinsame Benutzen von Betriebsmitteln gemäß einer Ausführungsform. Partitionierte Betriebsmittel können gemäß dem Auf und Ab aktiver Threads in der Maschine partitioniert und verschmolzen (zur Wiederverwendung durch andere Threads wieder zusammengeschmolzen) werden. Bei der Ausführungsform von 4 umfassen duplizierte Betriebsmittel Anweisungszeigerlogik in dem Anweisungsabrufteil der Pipeline, Registerumbenennungslogik in dem Umbenennungsteil der Pipeline, (nicht gezeigte, aber in verschiedenen Stufen in der Pipeline erwähnte) Zustandsvariablen und eine Interrupt-Steuerung (nicht gezeigt, im allgemeinen asynchron zur Pipeline). Gemeinsam benutzte Betriebsmittel in der Ausführungsform von 4 umfassen Scheduler in der Schedule-Stufe der Pipeline, ein Registerpool in den Register-Lese- und -schreibteilen der Pipeline und Ausführungsbetriebsmittel im Ausführungsteil der Pipeline. Zusätzlich können ein Trace-Cache und ein L1-Daten-Cache gemeinsam benutzte Betriebsmittel sein, die gemäß Speicherzugriffen ungeachtet des Thread-Kontexts aufgefüllt werden. Bei anderen Ausführungsformen kann bei Cache-Speicherungsentscheidungen Thread-Kontext berücksichtigt werden. Partitionierte Betriebsmittel in der Ausführungsform von 4 umfassen zwei Warteschlangen in Warteschlangenstufen der Pipeline, einen Umordnungspuffer in einer Ausscheidungsstufe der Pipeline und einen Speicherpuffer. Thread-Auswahlmultiplexlogik alterniert zwischen den verschiedenen duplizierten und partitionierten Betriebsmitteln, um beiden Threads einen sinnvollen Zugriff zu gewähren.
-
Als Beispiel wird angenommen, daß bei der weiteren Beschreibung der Funktionsweise einer Ausführungsform des Prozessors von 3, das in 4 gezeigte Partitionieren, gemeinsame Benutzen und Duplizieren in Verbindung mit der Ausführungsform von 3 verwendet wird. Insbesondere werden nun weitere Einzelheiten der Funktionsweise der Ausführungsform von 3 mit Bezug auf das Flußdiagramm von 5 besprochen. Es wird angenommen, daß der Prozessor in einem Mehrfach-Thread-Modus arbeitet, wobei mindestens zwei Threads aktiv sind.
-
Im Block 500 empfängt das Frontend 365 einen MONITOR-Opcode während der Ausführung eines ersten Threads (T1). Das Frontend 365 erzeugt bei einer Ausführungsform einen speziellen Überwachungs-uOP. Der MONITOR-uOP wird zu den Ausführungsbetriebsmitteln 370 weitergeleitet. Der Überwachungs-uOP weist eine zugeordnete Adresse auf, die die zu überwachende Adresse angibt (die Überwachungsadresse). Die zugeordnete Adresse kann in Form eines expliziten Operanden oder eines impliziten Operanden vorliegen (d. h. die zugeordnete Adresse ist einem vorbestimmten Register oder einer anderen Speicherstelle zu entnehmen). Durch die zugeordnete Adresse wird insofern die Überwachungsadresse ”angegeben”, als sie genug Informationen zur Bestimmung der Überwachungsadresse (möglicherweise in Verbindung mit anderen Register oder Informationen) übermittelt. Zum Beispiel kann die zugeordnete Adresse eine lineare Adresse sein, die eine entsprechende physikalische Adresse aufweist, die die fragliche Überwachungsadresse ist. Alternativ dazu könnte die Überwachungsadresse in einem virtuellen Adressenformat gegeben oder als eine relative Adresse angegeben oder auf andere bekannte oder zweckmäßige Adressenspezifizierungsweisen spezifiziert werden. Wenn virtuelle Adressenoperanden verwendet werden, kann es wünschenswert sein, wenn allgemeine Programmfehler als Break-Ereignisse erkannt werden.
-
Die Überwachungsadresse kann jede beliebige zweckmäßige Speichereinheit für die Überwachung angeben. Zum Beispiel kann die Überwachungsadresse bei einer Ausführungsform eine Cache-Leitung angeben. Bei alternativen Ausführungsformen kann die Überwachungsadresse jedoch einen Teil einer Cache-Leitung, einen Teil einer spezifischen/gewählten Größe oder eine Einheit von Speicher mit verschiedenen Beziehungen zu den Cache-Leitungsgrößen verschiedener Prozessoren oder eine einzige Adresse angeben. Die Überwachungsadresse kann also eine Einheit angeben, die durch den Operanden spezifizierte Daten (und weitere Daten) enthält, oder kann spezifisch eine Adresse für eine gewünschte Dateneinheit angeben.
-
Bei der Ausführungsform von 3 wird die Überwachungsadresse der Adressenübersetzungslogik 375 zugeführt und zu der Überwachungsvorrichtung 310 weitergeleitet und dort in einem Überwachungsadressenregister 335 gespeichert. Als Reaktion auf den MONITOR-Opcode wird die Überwachungsvorrichtung 310 dann durch die Ausführungsbetriebsmittel 370 freigegeben und aktiviert, wie im Block 510 angegeben und in 6 weiter erläutert. Wie später mit Bezug auf 6 weiter besprochen werden wird, kann es vorteilhaft sein, etwaige Speicheroperationen, die nach dem MONITOR-Opcode auftreten, einzusperren, um sicherzustellen, daß Speicheroperationen verarbeitet und deshalb erkannt werden, bevor jegliche Thread-Suspendierung auftritt. Es müssen möglicherweise also bei dieser Ausführungsform als Ergebnis des Aktivieren der Überwachungsvorrichtung 310 bestimmte Operationen auftreten, bevor jegliche nachfolgende Anweisungen unternommen werden können. Der Block 510 ist jedoch als parallel zu dem Block 505 auftretend gezeigt, weil bei dieser Ausführungsform die Überwachungsvorrichtung 310 weiter parallel mit anderen Operationen operiert, bis ein Break-Ereignis auftritt, nachdem sie durch den MONITOR-Opcode aktiviert wurde.
-
Im Block 505 wird in Thread 1 ein Opcode für Speicherwarten (MWAIT) empfangen und zur Ausführung weitergeleitet. Die Ausführung des MWAIT-Opcodes entmaskiert Überwachungsereignisse in der Ausführungsform von 5. Als Reaktion auf den MWAIT-Opcode wird wie im Block 515 angegeben geprüft, ob ein Überwachungsereignis ansteht. Wenn kein Überwachungsereignis ansteht, wird im Block 520 eine Prüfung durchgeführt, um sicherzustellen, daß die Überwachungsvorrichtung aktiv ist. Wenn zum Beispiel ein MWAIT ausgeführt wird, ohne daß zuvor ein MONITOR ausgeführt wurde, wäre die Überwachungsvorrichtung 310 nicht aktiv. Wenn entweder die Überwachungsvorrichtung inaktiv ist oder ein Überwachungsereignis ansteht, wird die Ausführung von Thread 1 im Block 580 fortgesetzt.
-
Wenn die Überwachungsvorrichtung 310 aktiv ist und kein Überwachungsereignis ansteht, dann wird die Ausführung von Thread 1 suspendiert, wie im Block 525 angegeben. Die Thread-Suspendierungs-/-wiederaufnahmelogik 377 enthält Pipeline-Flush-Logik 382, die die Prozessorpipeline entleert, um alle Anweisungen auszuräumen, wie im Block 530 angegeben.
-
Nachdem die Pipeline entleert wurde, bewirkt die Partitions-/Verschmelzungslogik 385, daß jegliche exklusiv Thread 1 zugeordnete Betriebsmittel zur Verwendung durch andere Threads freigegeben werden, wie im Block 535 angegeben. Diese freigegebenen Betriebsmittel werden verschmolzen, um zur Benutzung durch die übrigen aktiven Threads eine Menge größerer Betriebsmittel zu bilden. Zum Beispiel werden mit Bezug auf das Zweithreadbeispiel von 4 alle mit Thread 1 zusammenhängenden Anweisungen aus beiden Warteschlangen entleert. Jedes Paar von Warteschlange wird dann kombiniert, um dem zweiten Thread eine größere Warteschlange bereitzustellen. Ähnlich werden dem zweiten Thread weitere Register aus dem Registerpool zur Verfügung gestellt, weitere Einträge aus dem Speicherpuffer werden für den zweiten Thread befreit und weitere Einträge in dem Umordnungspuffer werden dem zweiten Thread zur Verfügung gestellt. Im wesentlichen werden diese Strukturen wieder in einzelne festzugeordnete Strukturen der doppelten Größe verwandelt. Natürlich können sich verschiedene Proportionen aus Implementierungen ergeben, die verschieden viele Threads verwenden.
-
In den Blöcken 540, 545 und 550 werden verschiedene Ereignisse geprüft, um zu bestimmen, ob Thread 1 wieder aufgenommen werden soll. Es ist zu beachten, daß diese Prüfungen nicht durch Anweisungen durchgeführt werden, die als Teil von Thread 1 ausgeführt werden. Statt dessen werden diese Operationen durch den Prozessor parallel mit seiner Verarbeitung anderer Threads durchgeführt. Wie ausführlicher mit Bezug auf 6 besprochen werden wird, prüft die Überwachungsvorrichtung selbst, ob ein Überwachungs-Schreibereignis aufgetreten ist, und zeigt dies durch Setzen eines Anstehendes-Ereignis-Anzeigers an. Der Anstehendes-Ereignis-Anzeiger wird über eine EVENT-Signal der Suspendierungs-/Wiederaufnahmelogik 377 zugeführt (z. B. Mikrocode). Mikrocode kann bei einer Ausführungsform das Überwachungsereignis an einer entsprechenden Anweisungsgrenze erkennen (Block 540), da dieses Ereignis im Block 505 durch den MWAIT-Opcode entmaskiert wurde. Die Ereignisdetektionslogik 345 kann andere Ereignisse erkennen, wie zum Beispiel Interrupts, die als Break-Ereignisse ausgewiesen sind (Block 545). Zusätzlich kann ein optionaler Timer verwendet werden, um periodisch aus dem Speicherwartezustand auszutreten, um sicherzustellen, das der Prozessor nicht aufgrund einer bestimmten Ereignissequenz einfriert (Block 550). Wenn keine dieser Ereignisse einen Austritt für den Speicherwartezustand signalisieren, bleibt Thread 1 suspendiert.
-
Wenn Thread 1 wieder aufgenommen wird, wird die Thread-/Suspendierungswiederaufnahmelogik 377 nach Erkennung des entsprechenden Ereignisses nochmals aktiviert. Wieder wird die Pipeline ausgeräumt, wie im Block 560 angegeben, um Anweisungen aus der Pipeline zu entleeren, so daß Betriebsmittel nochmals partitioniert werden können, um den bald aufzuweckenden Thread 1 zu berücksichtigen. Im Block 570 werden die entsprechenden Betriebsmittel neu partitioniert und Thread 1 wird im Block 580 wiederaufgenommen.
-
6a zeigt weitere Einzelheiten der Aktivierung und Funktionsweise der Überwachungsvorrichtung 310. Im Block 600 wird das Frontend-Abrufen für Thread 1 gestoppt, um zu verhindern, daß weitere Operationen von Thread 1 in die Maschine eintreten. Im Block 605 wird der zugeordnete Adressenoperand durch die Adressenübersetzungslogik 375 von einer linearen Adresse in eine physikalische Adresse umgesetzt. Im Block 610 wird die Beobachtbarkeit von Schreiboperationen an die überwachte Adresse erhöht. Im allgemeinen besteht das Ziel dieser Operation darin, Cache-Agenten dazu zu zwingen, Schreib-Operationen, die sich auf an der Überwachungsadresse gespeicherte Informationen auswirken würden, der Überwachungsvorrichtung 310 selbst sichtbar zu machen. Weitere Einzelheiten einer spezifischen Implementierung werden mit Bezug auf 6b besprochen. Im Block 615 wird die physikalische Adresse zur Überwachung gespeichert, obwohl zu beachten ist, daß diese Adresse früher oder später in dieser Sequenz gespeichert werden kann.
-
Wie im Block 620 angegeben, wird als nächstes die Überwachungsvorrichtung freigegeben. Die Überwachungsvorrichtung überwacht Buszyklen auf Schreiboperationen in die physikalische Adresse, die die in dem Überwachungsadressenregister 335 gespeicherte Überwachungsadresse ist. Weitere Einzelheiten der Überwachungsoperation werden nachfolgend mit Bezug auf 7 besprochen. Nachdem die Überwachungsvorrichtung freigegeben wurde, wird wie im Block 625 angegeben eine Speichereinsperroperation ausgeführt. Das Speichereinsperren hilft dabei, sicherzustellen, daß alle Speicheroperationen in der Maschine dann verarbeitet werden, wenn der MONITOR-Opcode mit der Ausführung fertig ist. Wenn alle Speicheroperationen aus der Zeit, bevor MONITOR aus der Maschine entleert wird, ist die Wahrscheinlichkeit, daß fälschlich in einen Speicherwartezustand eingetreten wird, reduziert. Die Speichereinsperroperation ist jedoch eine Vorsichtsmaßnahme und kann eine zeitaufwendige Operation sein.
-
Dieses Speichereinsperren ist optional, weil der MONITOR/MWAIT-Mechanismus dieser Ausführungsform als Mehrfachaustrittsmechanismus ausgelegt wurde. Anders ausgedrückt, können auch verschiedene Ereignisse, wie zum Beispiel bestimmte Interrupts, System- oder Onboard-Timer usw. einen Austritt aus dem Speicherwartezustand verursachen. Es ist also bei dieser Ausführungsform nicht garantiert, daß der einzige Grund für ein Aufwecken des Threads darin besteht, daß sich der überwachte Datenwert verändert hat. Folglich (siehe auch 9a–c) sollte bei dieser Implementierung Software nachprüfen, ob sich der in dem Speicher gespeicherte bestimmte Wert verändert hat. Bei einer Ausführungsform sind bestimmte Ereignisse, darunter das Setzen von INTR-, NMI- und SMI-Interrupts; Maschinenprüf-Interrupts und Fehler Break-Ereignisse und andere, wie zum Beispiel Powerdown-Ereignisse, sind es nicht. Bei einer Ausführungsform ist das Setzen des A20M-Anschlusses auch ein Break-Ereignis.
-
Wie im Block 630 gezeigt, prüft die Überwachungsvorrichtung weiter, ob auftretende Buszyklen eine Schreiboperation in die Überwachungsoperation anzeigen oder anzuzeigen scheinen. Wenn ein solcher Buszyklus erkannt wird, wird der Anstehendes-Ereignis-Anzeiger gesetzt, wie im Block 635 angegeben. Nach der Ausführung des MWAIT-Opcodes (Block 505, 5) wird dieser Anstehendes-Ereignis-Anzeiger als ein Ereignis versorgt und bewirkt Threadwiederaufnahme in den Blöcken 560–580 von 5. Außerdem können Ereignisse, die die Adressenübersetzung verändern, bewirken, daß Thread 1 wiederaufgenommen wird. Zum Beispiel können Ereignisse, die bewirken, daß ein Übersetzungs-Look-Aside-Puffer ausgeräumt wird, die Wiederaufnahme von Thread 1 auslösen, da die Übersetzung, die vorgenommen wurde, um die Überwachungsadresse aus einer linearen zu einer physikalischen Adresse zu erzeugen, möglicherweise nicht mehr gültig ist. Zum Beispiel können in einem mit der x86-Intel-Architektur kompatiblen Prozessor Schreiboperationen in die Steuerregister CR0, CR3 und CR4 sowie in bestimmte maschinenspezifische Register einen Austritt des Speicherwartezustands verursachen.
-
Wie bereits erwähnt, zeigt 6b weitere Einzelheiten der Erweiterung der Beobachtbarkeit von Schreiboperationen in die Überwachungsadresse (Block 610, 6a). Bei einer Ausführungsform räumt der Prozessor die der Überwachungsadresse zugeordnete Cache-Leitung aus allen internen Caches des Prozessors aus, wie im Block 650 angegeben. Als Folge dieses Ausräumen erreicht jede nachfolgende Schreiboperation in die Überwachungsadresse die Busschnittstelle 300, wodurch eine Erkennung durch die Überwachungsvorrichtung 310, die in der Busschnittstelle 300 enthalten ist, möglich wird. Bei einer Ausführungsform wird der MONITOR-uOP nach einer Cache-Leitungs-Ausräum-CLFLUSH-Anweisung, die eine existierende Anweisung in einem x86-Anweisungssatz ist, modelliert bzw. hat dasselbe Fehlermodell. Der Überwachungs-uOP schreitet durch linear-zu-physikalisch-Übersetzung der Adresse und Ausräumen interner Caches sehr ähnlich wie ein CLFLUSH voran; die Busschnittstelle erkennt jedoch den Unterschied zwischen MONITOR und CLFLUSH und behandelt den MONITOR-uOP entsprechend.
-
Wie im Block 655 angegeben, aktiviert als nächstes die mit Kohärenz zusammenhängende Logik 350 in der Busschnittstelle 300 die Leseleitungserzeugungslogik 355, um eine Leseleitungstransaktion auf dem Prozessorbus zu erzeugen. Die Leseleitungstransaktion in die Überwachungsadresse stellt sicher, daß keine anderen Caches in Prozessoren auf dem Bus Daten entweder in einem gemeinsam benutzten oder exklusiven Zustand (entsprechend dem wohlbekannten MESI-Protokoll) an der Überwachungsadresse speichern. Bei anderen Protokollen können andere Zustände verwendet werden; die Transaktion ist jedoch dafür ausgelegt, die Wahrscheinlichkeit zu verringern, daß ein anderer Agent in die Überwachungsadresse schreiben kann, ohne daß die Transaktion durch die Überwachungsvorrichtung 310 beobachtbar ist. Anders ausgedrückt, werden Schreiboperationen oder Schreiben-anzeigende Transaktionen nachfolgend rundgesendet, so daß sie durch die Überwachungsvorrichtung erkannt werden können. Nachdem die Leseleitungsoperation fertig ist, beginnt die Überwachungsvorrichtung 310 mit der Überwachung von Transaktionen auf dem Bus.
-
Während zusätzliche Transaktionen auf dem Bus auftreten, bewahrt die mit Kohärenz zusammenhängende Logik weiter die Beobachtbarkeit der Überwachungsadresse, indem versucht wird, zu verhindern, daß Busagenten die Eigentümerschaft der der überwachten Adresse zugeordneten Cache-Leitung übernehmen. Gemäß einem Busprotokoll kann dies dadurch erreicht werden, daß die Treffererzeugungslogik 360 während einer Snoop-Phase jeder Leseoperation der Überwachungsadresse ein HIT#-Signal setzt, wie im Block 660 angegeben. Das Setzen von HIT# verhindert, daß sich andere Caches über den gemeinsam benutzten Zustand hinaus in dem MESI-Protokoll zu dem Exklusiv- und dann potentiell zu dem Modifiziert-Zustand bewegen. Wie im Block 665 angegeben, können folglich keine Agenten in dem gewählten Kohärenzbereich (der Speicherteil, der kohärent gehalten wird) Daten in dem Modifiziert- oder Exklusiv-Zustand (oder ihren Äquivalenten) aufweisen. Der Prozessor scheint effektiv die Cache-Leitung der Überwachungsadresse Cache-gespeichert zu haben, obwohl sie bei dieser Ausführungsform aus internen Caches ausgeräumt wurde.
-
Nunmehr mit Bezug auf 7 sind weitere Einzelheiten der dem Block 620 in 6a zugeordneten Operationen aufgeführt. Insbesondere zeigt 7 weitere Einzelheiten der Funktionsweise der Überwachungsvorrichtung 310. Im Block 700 empfängt die Überwachungsvorrichtung 310 Anforderungs- und Adresseninformationen aus einer Bussteuerung 340 für eine Bustransaktion. Wie im Block 710 angegeben, untersucht die Überwachungsvorrichtung 310 den Buszyklustyp und die betroffene(n) Adresse(n). Insbesondere bestimmt die Zyklusvergleichslogik 320, ob der Buszyklus ein spezifizierter Zyklus ist. Bei einer Ausführungsform vergleicht eine Adressenvergleichsschaltung 330 die Bustransaktionsadresse mit der in dem Überwachungsadressenregister 335 gespeicherten Überwachungsadresse und Schreibdetektionslogik 325 decodiert die Zyklustypinformationen aus der Bussteuerung 340, um zu erkennen, ob eine Schreiboperation aufgetreten ist. Wenn eine Schreiboperation in die Überwachungsadresse auftritt, wird ein Anstehendes-Ereignis-Anzeiger gesetzt, wie im Block 720 angegeben. Der Threadsuspendierungs-/-wiederaufnahmelogik 377 wird ein Signal (WRITE DETECTED) zugeführt, um das Ereignis zu signalisieren (und es wird unter der Annahme versorgt, daß sie durch Ausführen von MWAIT freigegeben wurde). Als letztes wird die Überwachungsvorrichtung 310 angehalten, wie im Block 730 angegeben. Das Anhalten der Überwachungsvorrichtung spart Strom, ist aber nicht kritisch, solange falsche Überwachungsereignisse maskiert oder anderweitig nicht erzeugt werden. Auch kann an diesem Punkt der Überwachungsereignisanzeiger zurückgesetzt werden. In der Regel maskiert das Versorgen des Überwachungsereignisses außerdem die Erkennung weiterer Überwachungsereignisse, bis MWAIT nochmals ausgeführt wird.
-
Im Fall einer Leseoperation auf die Überwachungsadresse wird die mit Kohärenz zusammenhängende Logik 350 aktiviert. Wie im Block 740 angegeben, wird ein Signal (wie zum Beispiel HIT#) gesetzt, um zu verhindern, daß ein anderer Agent Eigentümerschaft erhält, die zukünftige Schreiboperationen ohne Kohärenzrundsendungen erlauben würde. Die Überwachungsvorrichtung 310 bleibt aktiv und kehrt danach zum Block 700 zurück und wird nicht durch eine Leseoperation der Überwachungsadresse beeinflußt. Wenn eine Transaktion weder eine Leseoperation noch eine Schreiboperation in die Überwachungsadresse ist, bleibt die Überwachungsvorrichtung zusätzlich aktiv und kehrt zum Block 700 zurück.
-
Bei bestimmten Ausführungsformen wird die MONITOR-Anweisung so begrenzt, daß nur bestimmte Arten von Zugriffen überwacht werden können. Diese Zugriffe können Zugriffe sein, die als effiziente Programmiertechniken anzeigend gewählt werden, oder können aus anderen Gründen gewählt werden. Zum Beispiel muß bei einer Ausführungsform der Speicherzugriff eine cachebare Speicheroperation in dem Rückschreibespeicher sein, die naturgemäß ausgerichtet ist. Ein naturgemäß ausgerichtetes Element ist ein N-Bitelement, das an einer durch N teilbaren Adresse startet. Als Folge der Verwendung naturgemäß ausgerichteter Elemente muß auf eine einzige Cache-Leitung zugegriffen werden (statt auf zwei Cache-Leitungen, so wie es notwendig wäre, falls Daten über zwei Cache-Leitungen verteilt werden), um in die überwachte Adresse zu schreiben. Folglich kann die Verwendung naturgemäß ausgerichteter Speicheradressen das Beobachten des Busses vereinfachen.
-
8 zeigt eine Ausführungsform eines Systems, die Mehrfach-Thread-Speicher-Wartetechniken verwendet. Bei der Ausführungsform von 8 ist eine Menge von N Mehrfach-Thread-Prozessoren (Prozessoren 805-1 bis 805-N) an einen Bus 802 angekoppelt. Bei anderen Ausführungsformen kann ein einziger Prozessor oder eine Mischung von Mehrfach-Thread-Prozessoren und Einzel-Thread-Prozessoren verwendet werden. Zusätzlich können andere bekannte oder anderweitige verfügbare Systemanordnungen verwendet werden. Zum Beispiel können die Prozessoren in einem Punkt-zu-Punkt-Verfahren verbunden werden, und Teile wie zum Beispiel die Speicherschnittstelle können in jeden Prozessor integriert sein.
-
Bei der Ausführungsform von 8 ist eine an den Bus angekoppelte Speicherschnittstelle 815 an einen Speicher 830 und eine Medienschnittstelle angekoppelt. Der Speicher 830 enthält ein für Mehrfach-Verarbeitung bereites Betriebssystem 835 und Anweisungen für einen ersten Thread 840 und Anweisungen für einen zweiten Thread 845. Die Anweisungen 830 enthalten gemäß den offengelegten Techniken, von denen verschiedene Versionen in 9a–9c gezeigt sind, eine Leerlaufschleife.
-
Die entsprechende Software zur Durchführung dieser verschiedenen Funktionen kann in einem beliebigen einer Vielfalt maschinenlesbarer Medien bereitgestellt werden. Die Medienschnittstelle 820 liefert eine Schnittstelle zu solcher Software. Die Medienschnittstelle 820 kann eine Schnittstelle zu einem Speichermedium (z. B. einem Plattenlaufwerk, einem optischen Laufwerk, einem Bandlaufwerk, einem flüchtigen Speicher, einem nichtflüchtigen Speicher oder dergleichen) oder zu einem Übertragungsmedium (z. B. einer Netzwerkschnittstelle oder einer anderen digitalen oder analogen Kommunikationsschnittstelle) sein. Die Medienschnittstelle 820 kann Softwareroutinen aus einem Medium (z. B. dem Speichermedium 792 oder dem Übertragungsmedium 795) lesen. Maschinenlesbare Medien sind Medien, die Informationen zumindest vorübergehend zum Lesen durch eine Maschinenschnittstelle speichern können. Dazu können Signalübertragungen gehören (über Draht, Optik oder Luft als Medium) und/oder physikalische Speichermedien 792, wie zum Beispiel verschiedene Arten von Laufwerk- und Speichergeräten.
-
9a zeigt eine Leerlaufschleife gemäß einer Ausführungsform. Im Block 905 wird der MONITOR-Befehl mit Adresse 1 als seinem Operanden (der Überwachungsadresse) ausgeführt. Im Block 910 wird der MWAIT-Befehl in demselben Thread ausgeführt. Wie bereits besprochen, bewirkt die MWAIT-Anweisung, daß der Thread suspendiert wird, vorausgesetzt, daß andere Bedingungen ordnungsgemäß erfüllt sind. Wenn im Block 915 ein Break-Ereignis auftritt, geht die Routine zum Block 920 weiter, um zu bestimmen, ob sich der an der Überwachungsadresse gespeicherte Wert geändert hat. Wenn sich der Wert an der Überwachungsadresse geändert hat, dann wird die Ausführung des Threads fortgesetzt, wie im Block 922 angegeben. Wenn sich der Wert nicht geändert hat, dann ist ein falsches Weckereignis aufgetreten. Das Weckereignis ist insofern falsch, als aus MWAIT ausgetreten wurde, ohne daß eine Speicherschreiboperation in die Überwachungsadresse stattgefunden hat. Wenn sich der Wert nicht verändert hat, kehrt die Schleife zum Block 905 zurück, indem die Überwachungsvorrichtung nochmals eingerichtet wird. Durch diese Schleifensoftwareimplementierung wird es möglich, die Überwachungsvorrichtung so auszulegen, daß falsche Weckereignisse zugelassen werden.
-
9b zeigt eine alternative Leerlaufschleife. Die Ausführungsform von 9b fügt eine zusätzliche Prüfung hinzu, um die Wahrscheinlichkeit, daß die MWAIT-Anweisung eine Schreiboperation in die überwachte Speicheradresse nicht erfaßt, weiter zu reduzieren. Wieder beginnt der Fluß in 9b mit der Ausführung der MONITOR-Anweisung mit Adresse 1 als ihrem Operanden, wie im Block 925 angegeben. Zusätzlich liest die Softwareroutine im Block 930 den Speicherwert an der Überwachungsadresse. Im Block 935 führt die Software eine Nachprüfung durch, um sicherzustellen, daß sich der Speicherwert nicht von dem Wert geändert hat, wodurch angezeigt wird, daß der Thread in Leerlauf versetzt werden sollte. Wenn sich der Wert geändert hat, wird die Threadausführung fortgesetzt, wie im Block 952 angegeben. Wenn sich der Wert nicht geändert hat, wird MWAIT-Anweisung ausgeführt, wie im Block 940 angegeben. Wie bereits besprochen, wird der Thread suspendiert, bis ein Break-Ereignis auftritt (Block 945). Da falsche Break-Ereignisse zugelassen werden, wird jedoch im Block 950 nochmals geprüft, ob sich der Wert geändert hat. Wenn sich der Wert nicht geändert hat, kehrt die Schleife zurück, um nochmals die Überwachungsvorrichtung freizugeben, Adresse 1 zu verfolgen, indem zu Block 925 zurückgekehrt wird. Wenn sich der Wert geändert hat, wird die Ausführung des Threads im Block 952 fortgesetzt. Bei bestimmten Ausführungsformen muß die MONITOR-Anweisung nach einem falschen Weckereignis nicht noch mal ausgeführt werden, bevor die MWAIT-Anweisung ausgeführt wird, um den Thread nochmals zu suspendieren.
-
9c zeigt ein weiteres Beispiel für eine Softwaresequenz, die MONITOR- und MWAIT-Anweisungen verwendet. In dem Beispiel von 9c läuft die Schleife nur dann leer, wenn zwei getrennte Tasks in demselben Thread nichts zu tun haben. An der Arbeitsspeicherstelle WL1 wird ein konstanter Wert CV1 gespeichert, wenn eine erste Routine Arbeit zu leisten hat. Ähnlich wird in WL2 ein zweiter konstanter Wert CV2 gespeichert, wenn eine zweite Routine Arbeit zu leisten hat. Um eine einzige Überwachungsadresse zu verwenden, werden WL1 und WL2 als Speicherstellen in derselben Cache-Leitung gewählt. Als Alternative kann auch eine einzige Arbeitsspeicherstelle verwendet werden, um Statusanzeiger für mehrere Tasks zu speichern. Zum Beispiel können ein oder mehrere Bits in einem einzigen Byte oder in einer anderen Einheit jeweils eine verschiedene Tasks repräsentieren.
-
Wie im Block 955 angegeben, wird die Überwachungseinrichtung dafür eingerichtet, WL1 zu überwachen. Im Block 960 wird geprüft, ob WL1 den konstanten Wert speichert, wodurch angezeigt wird, daß Arbeit zu verrichten ist. Wenn dies der Fall ist, wird die WL1 betreffende Arbeit durchgeführt, wie im Block 965 angegeben. Wenn nicht, wird im Block 970 geprüft, ob WL2 CV2 speichert, wodurch angezeigt wird, daß Arbeit im Zusammenhang WL2 zu verrichten ist. Wenn dies der Fall ist, wird die mit WL2 zusammenhängende Arbeit verrichtet, wie im Block 975 angegeben. Wenn nicht, kann die Schleife dann bestimmen, ob es angemessen ist, einen Stromverwaltungs-Handler aufzurufen (Block 980). Wenn zum Beispiel ein gewählter Zeitraum abgelaufen ist, kann der logische Prozessor in einen Zustand mit verringerter Stromaufnahme versetzt werden (z. B. in einen einer Menge ”C”-Zuständen, die unter der Advanced Configuration and Power Interface (ACPI) Specification, Version 1.0b (oder später), veröffentlicht am 8.2.1999, erhältlich bei www.acpi.info zum Zeitpunkt der Registration der vorliegenden Anmeldung definiert werden). Wenn dies der Fall ist, wird im Block 985 der Stromverwaltungs-Handler aufgerufen. In jedem der Fälle 965, 975 und 985, in denen Arbeit zu verrichten war, verrichtet der Thread diese Arbeit und kehrt dann in einer Schleife zurück, um dieselben Bestimmungen nach der Einrichtung der Überwachungsvorrichtung im Block 955 vorzunehmen. Bei einer alternativen Ausführungsform könnte die Schleife zurück von den Blöcken 965, 975 und 985 zu dem Block 960 gehen, solange die Überwachungsvorrichtung aktiv bleibt.
-
Wenn durch die Blöcke 965, 975 und 985 hindurch keine zu verrichtende Arbeit angetroffen wird, dann wird die MWAIT-Anweisung ausgeführt, wie im Block 990 angegeben. Der durch MWAIT verursachte Thread-Suspendiert-Zustand wird schließlich verlassen, wenn ein Break-Ereignis auftritt, wie im Block 995 angegeben. An diesem Punkt kehrt die Schleife zum Block 955 zurück, um die Überwachungsvorrichtung einzurichten und um danach zu bestimmen, ob entweder WL1 oder WL2 angeben, daß Arbeit zu verrichten ist. Wenn keine Arbeit zu verrichten ist (z. B. im Fall eines falschen Aufweckereignisses), kehrt die Schleife im Block 990 zu MWAIT zurück und suspendiert den Thread wieder, bis ein Break-Ereignis auftritt.
-
10 zeigt eine alternative Ausführungsform eines Prozessors, die es ermöglicht, daß der Überwachungswert in dem L1-Cache Cache-gespeichert bleibt. Der Prozessor in 10 enthält Ausführungseinheiten 1005, einen L1-Cache 1010 und Schreibkombinierpuffer zwischen dem L1-Cache und einem inklusiven L2-Cache 1030. Die Schreibkombinierpuffer 1020 enthalten einen Snoop-Port 1044, der Kohärenz der internen Caches mit anderem Speicher über durch eine Busschnittstelle 1040 aus einem Bus 1045 empfangene Operationen sicherstellt. Da sich auf Kohärenz auswirkende Transaktionen die Schreibkombinierpuffer 1020 über den Snoop-Port 1044 erreichen, kann sich eine Überwachungsvorrichtung auf der Ebene des L1-Cache befinden und immer noch ausreichend Informationen empfangen, um zu bestimmen, wann ein Speicherschreibereignis auf dem Bus 1045 auftritt. Somit kann die Leitung des Speichers, die der Überwachungsadresse entspricht, in dem L1-Cache gehalten werden. Die Überwachungsvorrichtung kann sowohl Schreiboperationen in den L1-Cache aus den Ausführungseinheiten als auch Schreiboperationen aus dem Bus 1045 über den Snoop-Port 1044 erkennen.
-
Eine weitere alternative Ausführungsform unterstützt eine Zweioperandenüberwachungsanweisung. Ein Operand gibt wie zuvor besprochen die Speicheradresse an. Der zweite Operand ist eine Maske, die angibt, welches einer Vielfalt von Ereignissen, die ansonsten kein Break von dem Speicherwartezustand bewirken würden, ein Break von diesem bestimmten Speicherwarten verursachen sollte. Zum Beispiel kann ein Maskenbit angeben, daß maskierte Interrupts zugelassen werden sollten, um ein Break des Speicherwartens zu bewirken, obwohl die Interrupts maskiert sind (z. B. Zulassen eines Aufweckereignisses auch wenn das EFLAGS-Bit IF gesetzt ist, um Interrupts zu maskieren). Es ist anzunehmen, daß dann eine der Anweisungen, die nach dem Break des Speicherwartezustands ausgeführt werden, diesen Interrupt entmaskiert, so daß er versorgt wird. Andere Ereignisse, die ansonsten kein Break des Speicherwartezustands bewirken würden, können freigegeben werden, ein Break des Speicherwartens zu bewirken, oder umgekehrt können Ereignisse, die normalerweise ein Break des Speicherwartezustands bewirken, können gestört werden. Wie bei dem Operanden besprochen, kann der zweite Operand explizit oder implizit sein.
-
11 zeigt verschiedene Entwurfsrepräsentationen oder -formate zur Simulation, Emulation und Herstellung eines Entwurfs unter Verwendung der offengelegten Techniken. Daten, die einen Entwurf repräsentieren, können den Entwurf auf vielerlei Weise repräsentieren. Erstens ist es in Simulationen nützlich, daß die Hardware mit einer Hardwarebeschreibungssprache oder einer anderen funktionalen Beschreibungssprache repräsentiert wird, die im wesentlichen ein computerisiertes Modell dafür liefert, wie die entworfene Hardware erwartungsgemäß arbeiten wird. Das Hardwaremodell 1110 kann in einem Speichermedium 1100, wie zum Beispiel einem Computerspeicher, gespeichert werden, so daß das Modell unter Verwendung von Simulationssoftware 1120 simuliert werden kann, die eine bestimmte Prüfsuite 1130 auf das Hardwaremodell 1110 anwendet, um zu bestimmen, ob es tatsächlich wie beabsichtigt funktioniert. Bei bestimmten Ausführungsformen wird die Simulationssoftware nicht aufgezeichnet, erfaßt oder in dem Medium gehalten.
-
Zusätzlich kann ein Modell auf Schaltungsebene mit Logik und/oder Transistorgattern in einer bestimmten Phase des Entwurfsprozesses erzeugt werden. Dieses Modell kann ähnlich simuliert werden, und zwar manchmal durch eigene Hardwaresimulatoren, die das Modell unter Verwendung programmierbarer Logik bilden. Diese Art von Simulation kann, wenn sie etwas weiter geführt wird, eine Emulationstechnik sein. In jedem Fall ist unkonfigurierbare Hardware eine weitere Ausführungsform, die ein maschinenlesbares Medium beteiligen kann, das ein Modell speichert, das die offengelegten Techniken verwendet.
-
Außerdem erreichen die meisten Entwürfe in einer bestimmten Phase eine Ebene von Werten, die die physikalische Plazierung verschiedener Geräte in dem Hardwaremodell repräsentieren. Falls herkömmliche Halbleiterherstellungstechniken verwendet werden, können die das Hardwaremodell repräsentierenden Daten die Daten sein, die die Anwesenheit oder Abwesenheit verschiedener Merkmale auf verschiedenen Maskenschichten für zur Herstellung der integrierten Schaltung verwendete Masken spezifizieren. Wiederum realisieren diese die integrierte Schaltung repräsentierenden Daten insofern die offengelegten Techniken, als die Schaltkreise oder Logik in den Daten simuliert oder hergestellt werden, um diese Techniken durchzuführen.
-
Bei jeder Repräsentation des Entwurfs können die Daten in jeder beliebigen Form eines computerlesbaren Mediums gespeichert werden. Eine optische oder elektrische Welle 1160, die moduliert oder anderweitig erzeugt wird, um solche Informationen zu senden, ein Speicher 1150 oder eine magnetische oder optische Speicherung 1140, zum Beispiel eine Platte, können das Medium sein. Die Menge von Bits, die den Entwurf oder den bestimmten Teil des Entwurfs beschreiben, sind ein Artikel, der an und für sich von anderen zum weiteren Entwurf oder zur weiteren Herstellung verkauft oder benutzt werden kann.
-
Es werden also Techniken zum Suspendieren der Ausführung eines Threads bis ein spezifizierter Speicherzugriff auftritt, offengelegt. Obwohl bestimmte Ausführungsbeispiele beschrieben und in den beigefügten Zeichnungen gezeigt wurden, versteht sich, daß solche Ausführungsformen die allgemeine Erfindung lediglich veranschaulichen und nicht einschränken, und daß die vorliegende Erfindung nicht auf die spezifisch gezeigten und beschriebenen Konstruktionen und Anordnungen beschränkt ist, da Durchschnittsfachleuten bei Durchsicht der vorliegenden Offenlegung verschiedene andere Modifikationen einfallen können.