-
Die Erfindung bezieht sich auf die Verwaltung von Lade- und Speicherinstruktionen für Speicherbarrieren-Handhabung.
-
Eine Prozessor-Pipeline bzw. Prozessorverarbeitungslinie weist mehrere Stufen auf, durch welche sich Instruktionen voranbewegen, jeweils bei einem Zyklus. In einem skalaren Prozessor schreiten Instruktionen einzeln durch die Pipeline voran, wobei höchstens eine einzige Instruktion pro Zyklus übergeben bzw. ausgeführt wird. In einem super-skalaren Prozessor können mehrere Instruktionen durch die gleiche Pipeline-Stufe zur gleichen Zeit voranschreiten, was gestattet, dass mehr als eine Instruktion pro Zyklus ausgegeben wird, und zwar abhängig von gewissen Bedingungen (die Hazards bzw. Konflikte genannt werden) und zwar bis zu einer Ausführungsbreite. Einige Prozessoren geben Instruktionen in einer Reihenfolge (gemäß einer Programmreihenfolge) aus, wobei aufeinander folgende Instruktionen durch die Pipeline in der Programmreihenfolge voranschreiten. Andere Prozessoren gestatten, dass Instruktionen neu geordnet werden und außer der Reihenfolge ausgegeben werden, was potentiell den Gesamtdurchsatz der Pipeline vergrößert. Wenn eine Änderung der Reihenfolge gestattet ist, können Instruktionen in einem gleitenden Instruktionsfenster (dessen Größe größer sein kann als die Ausgabebreite) neu geordnet werden, und ein Neuordnungspuffer kann verwendet werden, um Ergebnisse (und andere Informationen) temporär zu speichern, die mit Instruktionen in dem Instruktionsfenster assoziiert sind, um zu gestatten, dass die Instruktionen in einer Reihenfolge übergeben werden (was potentiell gestattet, dass mehrere Instruktionen in dem gleichen Zyklus übergeben werden, solang sie in der Programmreihenfolge angrenzend sind).
-
Zusammenfassung
-
Gemäß einem Aspekt weist eine integrierte Schaltung im Allgemeinen folgendes auf: zumindest einen ersten Prozessorkern, der Instruktionen in einer Verarbeitungsreihe bzw. Pipeline ausführt, wobei die Pipeline eine oder mehrere Stages bzw. Stufen in einem vorderen Teil bzw. Front-End-Teil der Pipeline und eine Vielzahl von Stufen in einem hinteren Teil bzw. Back-End-Teil der Pipeline aufweist, wobei der Front-End-Teil eine Stufe aufweist, die spekulativ zumindest einige Instruktionen außer einer Reihenfolge gemäß einer Programmreihenfolge ausgibt, und wobei der Back-End-Teil eine oder mehrere Stufen aufweist, die auf ein Prozessorspeichersystem zugreifen; weiter eine Front-End-Steuerschaltung, die konfiguriert ist, um eine Ausführung von Instruktionen basierend auf Informationen zu verwalten, die in dem Front-End-Teil verfügbar sind; und eine Back-End-Steuerschaltung, die konfiguriert ist, um eine Ausführung von Instruktionen basierend auf Information zu verwalten, die in dem Back-End-Teil verfügbar ist. Das Managen bzw. Verwalten einer ersten Speicherbarrieren-Instruktion weist folgendes auf: Verhindern einer spekulativen Ausgabe außerhalb einer Reihenfolge von Speicherinstruktionen durch die Stufe, die spekulativ zumindest einige Instruktionen außerhalb der Reihenfolge ausgibt, wobei die Back-End-Steuerschaltung Informationen vorsieht, die für die Front-End-Steuerschaltung zugänglich ist, welche anzeigt, dass eine oder mehrere spezielle Speicherinstruktionen eine Handhabung durch das Prozessorspeichersystem vollendet haben, wobei die Front-End-Steuerschaltung eine oder mehrere Ladeinstruktionen identifiziert, die ausgegeben wurden, bevor die erste Speicherbarrieren-Instruktion ausgegeben wurde, und die nach der ersten Speicherbarrieren-Instruktion in der Programmreihenfolge eingeordnet sind, und wobei die Front-End-Steuerschaltung bewirkt, dass zumindest eine der identifizierten Ladeinstruktionen erneut ausgegeben wird, nachdem die erste Speicherbarrieren-Instruktion ausgegeben worden ist.
-
Gemäß einem weiteren Aspekt weist ein Verfahren im Allgemeinen folgendes auf: Ausführen von Instruktionen in einer Verarbeitungsleitung bzw. Pipeline von mindestens einem ersten Prozessorkern, wobei die Pipeline eine oder mehrere Stages bzw. Stufen in einem vorderen Teil bzw. Front-End-Teil der Pipeline und eine Vielzahl von Stufen in einem hinteren Teil bzw. Back-End-Teil der Pipeline aufweist, wobei der Front-End-Teil eine Stufe aufweist, die spekulativ zumindest einige Instruktionen außerhalb einer Reihenfolge gemäß einer Programmreihenfolge ausgibt, und wobei der Back-End-Teil eine oder mehrere Stufen aufweist, welche auf ein Prozessorspeichersystem zugreifen; weiter Verwalten einer Ausführung von Instruktionen in einer Front-End-Steuerschaltung basierend auf Information, die in dem Front-End-Teil verfügbar ist; und Verwalten einer Ausführung von Instruktionen in einer Back-End-Steuerschaltung basierend auf Information, die in dem Back-End-Teil verfügbar ist. Das Verwalten einer Ausführung einer ersten Speicherbarrieren-Instruktion weist folgendes auf: Verhindern einer spekulativen Ausgabe von Speicherinformationen außerhalb einer Reihenfolge durch die Stufe, die spekulativ zumindest einige Instruktionen außerhalb der Reihenfolge ausgibt, wobei die Back-End-Steuerschaltung Information vorsieht, die für die Front-End-Steuerschaltung zugänglich ist, welche anzeigt, dass eine oder mehrere spezielle Speicherinstruktionen eine Handhabung durch das Prozessorspeichersystem vollendet haben, wobei die Front-End-Steuerschaltung eine oder mehrere Ladeinstruktionen identifiziert, die ausgegeben worden sind, bevor die erste Speicherbarrieren-Instruktion ausgegeben wurde, und die nach der ersten Speicherbarrieren-Instruktion in der Programmreihenfolge eingeordnet sind, und wobei die Front-End-Steuerschaltung bewirkt, dass zumindest eine der identifizierten Ladeinstruktionen erneut ausgegeben wird, nachdem die erste Speicherbarrieren-Instruktion ausgegeben worden ist.
-
Aspekte können eines oder mehrere der folgenden Merkmale aufweisen.
-
Veranlassen, dass mindestens eine der identifizierten Ladeinstruktionen erneut ausgegeben wird, nachdem die erste Speicherbarrieren-Instruktion ausgegeben worden ist, wobei dies aufweist, dass veranlasst wird, dass alle identifizierten Ladeinstruktionen erneut ausgegeben werden, nachdem die erste Speicherbarrieren-Instruktion ausgegeben worden ist.
-
Veranlassen, dass zumindest eine der identifizierten Ladeinstruktionen erneut ausgegeben wird, nachdem die erste Speicherbarrieren-Instruktion ausgegeben worden ist, wobei dies aufweist, dass veranlasst wird, dass eine oder mehrere ausgewählte Ladeinstruktionen der identifizierten Ladeinstruktionen erneut ausgegeben wird bzw. werden, nachdem die ersten Speicherbarrieren-Instruktion ausgegeben worden ist, wobei eine ausgewählte Ladeinstruktion irgendeine Ladeinstruktion aufweist, welche eine Target- bzw. Zieladresse aufweist, die zu einer Adresse passt, die mit einer Ungültigkeits- bzw. Invalidierungsinstruktion assoziiert ist, die vor der ersten Speicherbarrieren-Instruktion und nach der ausgewählten Ladeinstruktion in der Programmreihenfolge eingeordnet ist.
-
Die Invalidierungsinstruktion wird durch den ersten Prozessorkern durch einen zweiten Prozessorkern aufgenommen, der in der integrierten Schaltung in Verbindung bzw. Kommunikation mit dem ersten Prozessorkern vorgesehen ist.
-
Die eine oder die mehreren speziellen Speicherinstruktionen weisen alle Speicherinstruktionen auf, welche: (1) vor der ersten Speicherbarrieren-Instruktion in der Programmreihenfolge eingeordnet sind, und (2) nicht die Handhabung durch das Prozessorspeichersystem vollendet hatten, als die erste Speicherbarrieren-Instruktion durch die Front-End-Steuerschaltung empfangen wurde.
-
Das Verwalten einer Ausführung der ersten Speicherbarrieren-Instruktion weist weiter auf, durch die Front-End-Schaltung (1) zu bestimmen, dass alle Instruktionen, die vor der ersten Speicherbarrieren-Instruktion in der Programmreihenfolge eingeordnet sind, eine Ausführung abgeschlossen haben (2) in der Programmreihenfolge alle Instruktionen zu übergeben, die in der Programmreihenfolge vor der ersten Speicherbarrieren-Instruktion eingeordnet sind, und (3) die erste Speicherbarrieren-Instruktion zu übergeben.
-
Das Verwalten einer Ausführung der ersten Speicherbarrieren-Instruktion weist weiter auf, eine spekulative Ausgabe von Eingabe/Ausgabe- (I/O) - Ladeinstruktionen (I/O = Input/Output) außerhalb der Reihenfolge durch die Stufe zu verhindern, die in spekulativer Weise zumindest einige Instruktionen außerhalb der Reihenfolge ausgibt.
-
Das Prozessorspeichersystem weist weiter einen Schreibpuffer zum Initialisieren einer Ausführung von Speicherinstruktionen und einen Datenzwischenspeicher bzw. Daten-Cache zum Initialisieren einer Ausführung von Ladeninstruktionen auf.
-
Die Information, die anzeigt, dass eine oder mehrere spezielle Speicherinstruktionen die Handhabung durch das Prozessorspeichersystem vollendet haben, weisen Informationen auf, welche anzeigen, dass eine oder mehrere spezielle Speicherinstruktionen an den Schreibpuffer gesendet worden sind, und Ergebnisse von einer oder mehreren speziellen Ladeinstruktionen von dem Daten-Cache oder -Anzeige, dass eine oder mehrere spezielle Ladeinstruktionen ein Miss- bzw. ein Fehltreffer in dem Daten-Cache zur Folge hatten.
-
Das Verwalten der Ausführung einer ersten Speicherbarrieren-Instruktion weist weiter auf, dass die Front-End-Steuerschaltung Reihenfolgen-Information für Ladeinstruktionen basierend auf der Programmreihenfolge hält bzw. speichert.
-
Die identifizierten Ladeinstruktionen werden durch die Front-End-Steuerschaltung basierend zumindest teilweise auf der Reihenfolgen-Information identifiziert, die von der Front-End-Steuerschaltung gehalten bzw. gespeichert wird.
-
Die Aspekte können einen oder mehrere der folgenden Vorteile haben.
-
Bei einer Ausgabe von Instruktionen außerhalb der Reihenfolge bzw. einer Out-of-Order-Ausgabe kann ein Architekturzustand temporär inkonsistent mit der Programmreihenfolge sein. Barriereninstruktionen können ausgegeben werden, um sicherzustellen, dass ein gewisser für die Software sichtbarer Architekturzustand konsistent ist. Beispielsweise kann in einem Mehrkern-Prozessor eine Barriereninstruktion verwendet werden, um sicherzustellen, dass es einen konsistenten globalen Zustand gibt, so wie er von der Software gesehen wird, die auf unterschiedlichen Prozessorkernen ausgeführt wird. Es kann unterschiedliche Arten von Barriereninstruktionen geben, die eine Reihenfolge für unterschiedliche Arten von Instruktionen durchsetzen. Eine Speicherbarrieren-Instruktion, wie beispielsweise eine Data Memory Barrier bzw. DMB-Instruktion, die in einigen Prozessorarchitekturen verwendet wird, kann verwendet werden, um sicherzustellen, dass irgendwelche beobachtbaren Effekte von gewissen Speicherzugriffsinstruktionen in einer Reihenfolge bezüglich einer Programmreihenfolge auftreten. Beispielsweise kann man beobachten, dass irgendwelche Lade- und Speicherinstruktionen, die vor der Speicherbarriere in der Programmreihenfolge auftreten, vor allen Lade- und Speicherinstruktionen ausgeführt worden sind, die nach der Speicherbarriere in der Programmreihenfolge auftreten. Wenn solche Instruktionen tatsächlich außerhalb der Reihenfolge bzw. Out-of-Order ausgeführt werden würden, jedoch ihre sichtbaren Effekte, nachdem sie übergeben worden sind, so erscheinen würden, wie wenn sie in der Reihenfolge ausgeführt worden wären, dann ist die Bedingung der Speicherbarriere erfüllt worden. Das folgende ist das Beispiel einer Sequenz von (Pseudocode)-Instruktionen in einer Programmreihenfolge (von oben nach unten):
- Store X DATA (Speichern X DATA)
- Memory Barrier (Speicherbarriere)
- Load Y (Laden Y)
-
Die Instruktion „Store X DATA“ speichert DATA (beispielsweise durch ein Register, welches einen Wert von zu speichernden Daten speichert) an einer Speicheradresse X. Die Instruktion „Memory Barrier“ zeigt an, dass alle vorherigen Lade- und Speicherinstruktionen vollendet sein sollten. Die Instruktion „Load Y“ lädt Daten von einer Speicheradresse Y. Der Effekt der Speicherbarrieren-Instruktion zwischen den Speicher- und Ladeinstruktionen in diesem Beispiel ist, dass garantiert wird, dass das Ergebnis der Speicherinstruktion global zu sehen ist, bevor das Ergebnis der Ladeinstruktion (die durch den gleichen Kern ausgeführt wird, der die Speicherinstruktion ausgeführt hat) global sichtbar ist. Ohne die Speicherbarrieren-Instruktion könnte die Ladeinstruktion ihrer Ausführung vor der Speicherinstruktion vollendet haben, wenn die Instruktionen außerhalb der Reihenfolge ausgegeben worden wären. Die hier beschriebenen Techniken ermöglichen das Implementieren von solchen Speicherbarrieren-Instruktionen ohne in signifikanter Weise Leistung zu opfern.
-
Andere Merkmale und Vorteile der Erfindung werden aus der folgenden Beschreibung und aus den Ansprüchen offensichtlich.
-
Figurenliste
-
- 1 ist eine schematische Abbildung eines Computersystems.
- 2 ist eine schematische Abbildung einer Prozessorkern-Pipeline.
-
Beschreibung
-
1 zeigt ein Beispiel eines Computersystems 100, bei welchem die hier beschriebenen Speicherbarrieren-Handhabungstechniken verwendet werden können. Das System 100 weist zumindest einen Prozessorkern 102 auf, der eine einzelne zentrale Verarbeitungseinheit (CPU = Central Processing Unit) oder einer von mehreren Prozessorkernen in einer Multi-Core- bzw. Mehrkern-Architektur sein könnte, wobei jeder Prozessorkern (oder jeder „Core“) eine individuelle CPU mit assoziierter Schaltung aufweist. In diesem Beispiel einer Mehrkern-Architektur weist jeder Prozessorkern 102 eine Verarbeitungslinie bzw. Pipeline 104, eine oder mehrere Registerdateien 106 und ein Prozessorspeichersystem 108 auf. Jeder Prozessorkern ist mit einem Unkern bzw. Uncore 110 verbunden, der ein Verbindungsnetzwerk 112 (beispielsweise einen Bus, einen Cross-Bar-Switch, ein Gitter- bzw. Mesh-Netzwerk usw.) und ein externes Speichersystem 113 aufweist. Das Verbindungsnetzwerk 112 ermöglicht eine Kommunikation mit dem externen Speichersystem 113 und einer Eingabe/Ausgabe- bzw. I/O-Brücke 114 (I/O = Input/Output). Die I/O-Brücke 114 ermöglicht eine Kommunikation über einen I/O-Bus 116 mit verschiedenen Eingabe/Ausgabe- bzw. I/O-Vorrichtungen, welche eine Speichervorrichtung 118A und andere I/O-Vorrichtungen 118B-118D (beispielsweise Netzwerkschnittstelle, Anzeigeadapter und/oder Nutzereingabevorrichtungen, wie beispielsweise Tastatur oder Maus) aufweisen. Die Speichervorrichtung 118A, wie beispielsweise ein Plattenlaufwerk oder eine andere (typischerweise nicht-volatile bzw. nicht-flüchtige) Speichervorrichtung mit großer Kapazität kann einigen Raum aussparen bzw. bereithalten, um als sekundärer Speicher (oder „Backing store“- bzw. Sicherungsspeicher) in einem virtuellen Speicherschema für den (typischerweise volatilen) Hauptspeicher zu dienen.
-
Das Prozessorspeichersystem 108 und das externe Speichersystem 113 bilden zusammen ein hierarchisches Speichersystem, welches zumindest einen Cache einer ersten Hierarchieebene bzw. L1-Cache (L1 = first Level = erste Hierarchieebene) in dem Prozessorspeichersystem 108 und irgendeiner Anzahl von Caches von höheren Hierarchieebenen (L2, L3,...) in dem externen Speichersystem 113 aufweist. Auf jeder Hierarchieebene kann der Cache ein Modul aufweisen, welches einen Instruktions-Cache zum Cachen bzw. Zwischenspeichern von Instruktionen vorsieht, sowie ein separates Modul, welches einen Daten-Cache zum Zwischenspeichern von Daten vorsieht. Zusätzlich zu einem L1-Instruktions-Cache und dem Daten-Cache weist das Prozessorspeichersystem 108 einen TLB und verschiedene andere Schaltungen auf, um einen Miss- bzw. Fehltreffer in den L1-Instruktions- oder Daten-Caches oder in dem TLB zu behandeln. Beispielsweise kann diese Schaltung in dem Prozessorspeichersystem 108 eines Prozessorkerns 102 einen Schreibpuffer aufweisen, um temporär Werte zu halten, die geschrieben werden sollen, und zwar aus einer Speicherinstruktion, die ausgeführt worden ist, und die übergeben werden sollten, und zwar innerhalb der Pipeline 104.
-
Der Cache mit dem höchsten Hierarchie-Niveau innerhalb des externen Speichersystems 113 (was der L2-Cache sein kann, wenn es nur zwei Ebenen in der Hierarchie gibt) ist der LLC 120, auf den gerade vor dem Hauptspeicher zugegriffen wird. Natürlich ist dies nur ein Beispiel. Die exakte Unterteilung dazwischen, welche Caches auf welcher Ebene innerhalb des Prozessorspeichersystems 108 sind, und welche in dem externen Speichersystem 113 sind, kann in anderen Beispielen anders sein. Beispielsweise könnten der L1-Cache und der L2-Cache beide innerhalb des Prozessorkerns 102 sein und der L3-Cache (und höhere Caches) könnten außerhalb des Prozessorkerns 102 sein. Jeder Prozessorkern 102 könnte seinen eigenen internen L1-Cache haben, und die Prozessorkerne könnten einen L2-Cache gemeinsam verwenden. Das externe Speichersystem 113 weist auch eine Hauptspeichervorrichtung 122 auf, die mit irgendeiner Anzahl von Speichermodulen 124 verbunden ist, die als Hauptspeicher dienen (beispielsweise dynamische Speichermodule mit wahlfreiem Zugriff bzw. DRAM-Module). In einer speziellen Cache-Ebene der Hierarchie weist jeder Cache-Eintrag einen Raum auf, um die speziellen Speicherblocks zusammen mit Bits zu speichern, um zu bestimmen, ob ein spezielles Wort aus einem Speicherblock in dieser Cache-Ebene vorhanden ist (d.h. ein „Hit“ bzw. „Treffer“) oder nicht in dieser Cache-Ebene vorhanden ist (d.h. ein „Miss“ bzw. „Fehltreffer“). Nach einem Miss in einer Ebene versucht das Cache-System auf den Speicherblock von einem Cache von einer höheren Ebene zuzugreifen (lesen oder schreiben) oder auf den Hauptspeicher (im Fall eines Miss in dem LLC).
-
Die Pipeline 104 weist mehrere Stages bzw. Stufen auf, durch welche sich Instruktionen voran bewegen, jeweils einen Zyklus gleichzeitig. Einige Stufen treten in einen Front-End-Teil der Pipeline auf. Eine Instruktion wird geholt (beispielsweise in einer Instruktionsholstufe bzw. IF-Stufe (IF = Instruction Fetch) oder mehreren Stufen). Instruktionen werden basierend auf einem Programmzähler bzw. PC (PC = Programm Counter) geholt, was ein Zeiger bzw. Pointer ist, der verwendet wird, um Instruktionen in dem Speicher zu identifizieren (beispielsweise innerhalb eines Teils des Hauptspeichers oder innerhalb eines Instruktions-Caches des Prozessors). Der PC kann durch Adressen eines Blocks von kompilierten Instruktionen voranschreiten („Basisblock“ genannt), wobei um eine spezielle Anzahl von Bytes inkrementiert bzw. weitergeschaltet wird (abhängig davon wie lang jede Instruktion ist und wieviele Instruktionen jedes Mal geholt werden). Eine Instruktion wird dann decodiert (beispielsweise in einer Instruktions-Decodierungs- bzw. ID-Stufe (ID = instruction decode) oder mehreren Stufen), um eine Operation und einen oder mehrere Operanden zu bestimmen. Alternativ könnten in einigen Pipelines die Instruktionshol- und Instruktions-Decodierungsstufen überlappen. Eine Instruktion lässt ihre Operanden holen (beispielsweise in einer Operandenhol- bzw. OF-Stufe oder-Stufen (OF = Operand Fetch)). Eine Instruktion ist dann bereit zum Ausgeben. Das Ausgeben einer Instruktion startet das Voranschreiten der Instruktion durch Stufen in einem Back-End-Teil der Pipeline, um die Instruktion auszuführen. Die Ausführung kann das Anwenden der Operation der Instruktion auf ihren Operanden (ihre Operanden) umfassen, um ein Ergebnis für eine ALU-Instruktion (ALU = Arithmetic Logic Unit = arithmetische Logikeinheit) zu erzeugen, weiter das Speichern oder Laden auf oder von einer Speicheradresse für eine Speicherinstruktion, oder kann aufweisen, einen Zustand einer konditionellen Verzweigungs- bzw. bedingten Sprunginstruktion zu bewerten, um zu bestimmen, ob die Verzweigung genommen bzw. der Sprung ausgeführt wird oder nicht. Nachdem eine Instruktion eine Ausführung vollendet hat, kann die Instruktion übergeben werden, so dass irgendein Effekt der Instruktion global für die Software sichtbar gemacht wird. Das Übergeben einer Instruktion kann beispielsweise das Speichern eines Ergebnisses in einer Registerdatei umfassen (beispielsweise in einer Write Back- bzw. WB-Stufe oder -Stufen). Bei den meisten Implementierungen werden alle Instruktionen allgemein in der Reihenfolge übergeben, auch wenn irgendwelche Instruktionen außerhalb der Reihenfolge ausgegeben wurden.
-
2 zeigt ein Beispiel bei welchem die Pipeline 104 konfiguriert ist, um das Laden und Speichern von Instruktionen in einer effizienten Weise zu managen bzw. zu verwalten, wenn Speicherbarrieren-Instruktionen gehandhabt bzw. verwendet werden, wie genauer unten beschrieben wird. Die Pipeline 104 weist Schaltungen für die verschiedenen Stufen auf. Für eine oder mehrere Instruktions-Holstufen sieht eine Instruktions-Holschaltung bzw. Instruktions-Fetch-Schaltung 200 einen PC für einen Instruktions-Cache in dem Prozessorspeichersystem 108 (1) vor, um Instruktionen zu holen, die in die Pipeline 104 eingespeist werden sollen. Beispielsweise kann der PC eine virtuelle Adresse der nächsten Instruktion sein, wobei in diesem Fall der PC um die Länge einer virtuellen Adresse im Fall einer sequentiellen Ausführung (d.h. ohne das irgendwelche Verzweigungen genommen bzw. Sprünge ausgeführt werden) implementiert werden kann. Die Hol- bzw. Fetch-Schaltung 200 liefert auch den Programmzähler bzw. PC zur Verzweigungs- bzw. Sprungvorhersageschaltung 201, die verwendet wird, um ein Ergebnis eines vorhergesagten Sprungs für Sprunginstruktionen für eine spekulative Ausführung von Instruktionen (möglicherweise außerhalb der Reihenfolge bzw. Out-of-Order) vorzusehen. Die Sprungvorhersageschaltung 201 speichert auch Verzweigungs- bzw. Sprungverlaufsinformation, die basierend auf einem empfangenen Ergebnis bezüglich des tatsächlichen Sprungs, aktualisiert wird. Bei einigen Ausführungen wird ein Teil der Sprungvorhersageschaltung 201 oder die gesamte Sprungvorhersageschaltung als ein Teil der Hol- bzw. Fetch-Schaltung 200 angesehen. Für eine oder mehrere Instruktions-Decodierungs-Stufen speichert die Instruktions-Decodierungs-Schaltung 202 Information in einer Ausgabeschlange für Instruktionen in dem Instruktionsfenster, die darauf warten, ausgegeben zu werden.
-
Die Ausgabeschaltung 206 bestimmt in welchem Zyklus jede der Instruktionen in der Ausgabeschlange ausgegeben werden soll und sie sendet Instruktionen von dem Front-End-Teil 207 der Pipeline 104, damit diese das Voranschreiten durch die Ausführungsstufen 208A, 208B, und 208C in dem Back-End-Teil 209 der Pipeline 104 beginnen. (Zur Vereinfachung hat dieses Beispiel drei Ausführungsstufen, jedoch können andere Beispiele mehr oder weniger Ausführungsstufen haben.) Es gibt auch mindestens eine Übergabestufe 210 in dem Back-End-Teil 209, welche Ergebnisse von einigen Instruktionen übergibt, die ihren Weg durch die Ausführungsstufen 208A, 208B und 208C gemacht haben. Beispielsweise kann die Übergabestufenschaltung 217 ein Ergebnis zurück in eine Registerdatei 106 ( 1) schreiben. Jedoch können einige Instruktionen nicht durch die Übergabestufenschaltung 217 übergeben werden, sondern können stattdessen durch eine Schaltung in dem Front-End-Teil 207 unter Verwendung eines Kommunikationspfades 218 übergeben werden, der verwendet werden kann, um Informationen zwischen einer oder mehreren Stufen in dem Back-End-Teil 209 und einer oder mehreren Stufen in dem Front-End-Teil 207 zu senden. Beispielsweise können Instruktionen, wie beispielsweise gewisse Speicherzugriffsinstruktionen und Speicherverwaltungsinstruktionen, durch die Schaltung in dem Front-End-Teil 207 unter Verwendung einer solchen Kommunikation übergeben werden, wie genauer unten beschrieben wird.
-
Zwischen benachbarten Stufen der Pipeline 104 weisen die verschiedenen Pfade durch die Pipeline-Schaltung Pipeline-Register 211 auf (in 2 für die Ausführungsstufen gezeigt), welche Ergebnisse für eine stromaufwärts liegende Stufe speichern, die darauf warten, stromabwärts zur nächsten Stufe geleitet zu werden. Die Pipeline-Register 211 können durch einen gemeinsamen (nicht gezeigten) Taktgeber getaktet sein (beispielsweise ein Clock- bzw. Taktsignal empfangen, welches von diesem abgeleitet wird). Somit leitet jedes Pipeline-Register 211 (auch Latch oder Satz von Flip-Flops genannt) bei jedem Taktzyklus ein Ergebnis von seinem Eingang zu seinem Ausgang und wird bereit, um ein neues Ergebnis in seinem Eingang zu empfangen, nach dem das Ergebnis durch die Schaltung von dieser Stufe erzeugt worden ist.
-
Es kann mehrere separate Pfade durch die Ausführungsstufen geben, welche verschiedene Schaltungen aufweisen, um unterschiedliche Arten von Instruktionen auszuführen. In 2 sind zwei Pfade 208A und 208B gezeigt, jedoch können die Ausführungsstufen irgendeine Anzahl von Pfaden mit entsprechenden Schaltungen aufweisen, die durch Pipeline-Register 211 getrennt sind. Die Anzahl der Pfade durch die Ausführungsstufen ist im Allgemeinen abhängig von der speziellen Architektur, kann jedoch genügend Pfade aufweisen, so dass eine Anzahl von Instruktionen bis zur Ausgabebreite durch die gleichen Ausführungsstufen in den gleichen Zyklen voranschreiten können. Die Anzahl der Stufen, welche eine funktionelle Schaltung für einen gegeben Pfad aufweisen, können auch abweichen. In diesem Beispiel weist ein erster Pfad 212A eine Funktionsschaltung 214A, 214B und 214C auf, die in der entsprechenden ersten Ausführungsstufe 208A bzw. der zweiten Ausführungsstufe 208B bzw. dritten Ausführungsstufe 208C eingeordnet ist. Der zweite Pfad 212B weist eine Funktionsschaltung 216A und 216B auf, die in der entsprechenden ersten Ausführungsstufe 208A bzw. der zweiten Ausführungsstufe 208B eingeordnet sind, wobei die dritte Ausführungsstufe 208C einfach eine „Silo Stufe“ bzw. „Vorratsstufe“ ist, welche ein Ergebnis weiterleitet, ohne irgendeine weitere Berechnung auszuführen, was sicherstellt, dass jeder Pfad durch die gleiche Anzahl von Stufen durch die Pipeline läuft. Ein Pfad kann eine Schaltung zur Ausführung von Speicherinstruktionen aufweisen, ein weiterer Pfad kann Einheiten für verschiedene Operationen aufweisen (beispielsweise ALU, Multiplikator, Gleitkommaeinheit) und ein weiterer Pfad kann eine Schaltung zur Ausführung von Speicherzugriffsinstruktionen aufweisen, was Ladeinstruktionen, welche Datenwerte aus dem Speichersystem lesen und Speicherinstruktionen einschließt, um Datenwerte in das Speichersystem zu schreiben.
-
Wenn eine Speicherbarrieren-Instruktion decodiert und ausgegeben wird, weist das Verwalten der Ausführung der Speicherbarrieren-Instruktion auf, wie oben beschrieben, sicherzustellen, dass irgendwelche Lade- und Speicherinstruktionen, wie vor der Speicherbarriere in der Programmreihenfolge auftreten, als ausgeführt gesehen werden können bzw. erkennbar sind, und zwar vor allen Lade- und Speicherinstruktionen, die nach der Speicherbarriere in der Programmreihenfolge auftreten und zwar basierend auf sichtbaren Effekten der Instruktionen. Bei einigen Ausführungen weist das ordnungsgemäße Verwalten von Speicherbarrieren-Instruktionen auf, die Pipeline 104 so zu konfigurieren, dass sie Ladeinstruktionen und Speicherinstruktionen unterschiedlich handhabt.
-
Da eine spekulative Out-of-Order-Ausgabe von Ladeinstruktionen einen größeren Leistungsnutzen bieten kann als eine spekulative Out-of-Order-Ausgabe von Speicherinstruktionen kann die Pipeline 104 konfiguriert sein, um für Speicherinstruktionen eine spekulative Out-of-Order-Ausgabe bzw. -Ausgabe außerhalb der Reihenfolge von Speicherinstruktionen zu verhindern. In dem sichergestellt wird, dass Speicherinstruktionen durch den Front-End-Teil 207 in der Reihenfolge In-Order ausgegeben werden (bezüglich einander und bezüglich Ladeinstruktionen innerhalb der Reihenfolge) kann der Back-End-Teil 209 Speicherinstruktionen ohne die Notwendigkeit handhaben, irgendwelche Ergebnisse oder sichtbare Effekte von Instruktionen neu zu ordnen, um Speicherbarrieren-Instruktionen zu berücksichtigen. Insbesondere kann der Back-End-Teil 209 Schritte mit potentiell sichtbaren Effekten ausführen, wie beispielsweise das Senden von Daten, die gespeichert werden sollen an einen Schreibpuffer, ohne das nötig wird, Information in Reihenfolge zu bringen, die in dem Back-End-Teil 209 gehalten werden soll. Daten von mehreren Speicherinstruktionen können in dem Schreibpuffer akkumuliert werden, bis der Schreibpuffer geflushed bzw. verworfen wird. In einigen Implementierungen bewirkt die Ausführung einer Speicherbarrieren-Instruktion, dass übergebene Speicher-Instruktionen in dem Schreibpuffer aus dem Schreibpuffer geflushed bzw. ausgeführt werden. Lade- bzw. Speicherinstruktionen, die nach der Speicherbarrieren-Instruktion eingeordnet sind, können durch den Front-End-Teil 207 in der Ausgabereihe gehalten werden, bis das Prozessorspeichersystem 108 angezeigt hat (beispielsweise unter Verwendung des Pfadweges 218), dass alle Speicherinstruktionen, die vor der Speicherbarrieren-Instruktion eingeordnet sind, global sichtbar sind (beispielsweise an den Schreibpuffer gesendet worden sind oder aus dem Schreibpuffer geflushed bzw. ausgeführt oder geleert worden sind) bevor die Speicherbarrieren-Instruktion übergeben wird.
-
Da es effizienter sein kann, Reihenfolgeninformation in Strukturen zu verwalten, die bei dem Front-End-Teil 207 zugänglich sind, kann der Front-End-Teil 207 für Ladeinstruktionen konfiguriert sein, sichtbare Effekte von Ladeinstruktionen ansprechend auf Speicherbarriereninstruktionen zu verwalten. Dies kann einen Teil der Komplexität vermeiden, die anderen falls nötig wäre um Reihenfolgeninformation in dem Back-End-Teil 209 zu halten bzw. zu pflegen. Beispielsweise kann eine potentiell komplexe Back-End-Reihenfolgenlogik vermieden werden und/oder der Overhead bzw. der Verwaltungsaufwand zum Markieren von Instruktionen mit Reihenfolgeninformation kann vermieden werden. Ein einfacherer Ladereihenfolgenring 220, der für den Front-End-Teil 207 zugänglich ist, kann verwendet werden, um die Programmreihenfolge der Ladeinstruktionen zu verfolgen. Weil die Programmreihenfolge beim Front-End-Teil 207 bekannt ist, beispielsweise basierend auf einer Reihenfolge in welcher Instruktionen decodiert werden, ist es bequem den Ladereihenfolgenring 220 für eine vorbestimmte Anzahl von Ladeinstruktionen zu aktualisieren (beispielsweise basierend auf der Größe des Instruktionsfenster, so dass ein Feld, welches nach zweimal der maximalen Anzahl von Instruktionen in dem Instruktionsfenster durchläuft bzw. rolls over).
-
Der Front-End-Teil 207 ist fähig, Ladeinstruktionen zu übergeben, die außerhalb der Reihenfolge ausgegeben worden sind, und zwar basierend auf Information, die in dem Ladereihenfolgenring 220 gespeichert ist. Beispielsweise werden Ladeinstruktionen, die vor einer Speicherbarrieren-Instruktion eingeordnet sind, übergeben bevor die Speicherbarrieren-Instruktion übergeben wird, und Ladeinstruktionen, die nach der Speicherbarrieren-Instruktion eingeordnet sind, werden übergeben nach dem die Speicherbarrieren-Instruktion übergeben wurde. Der Front-End-Teil 207 kann auch Informationen verwenden, die von dem Back-End-Teil 209 empfangen wurden (beispielsweise unter Verwendung des Pfadweges 218), um zu bestimmen, ob Ladeinstruktionen bereit zur Übergabe sind, oder ob Ladeinstruktionen erneut ausgegeben werden müssen. Der Front-End-Teil 207 kann auch Informationen berücksichtigen, welche die Gültigkeit von Adressübersetzungen beeinflussen. Beispielsweise kann eine Invalidierung einer Übersetzung für eine oder mehrere virtuelle Adressen empfangen worden sein, nachdem eine Ladeinstruktion außerhalb der Reihenfolge ausgegeben worden ist, und bevor eine Speicherbarrieren-Instruktion vollendet worden ist. Die Ausgabeschaltung 206 kann konfiguriert sein, um zu bestimmen ob die Ladeinstruktion erneut ausgegeben werden soll, und zwar basierend darauf, ob die Zieladresse der Ladeinstruktion durch die Invalidierung beeinflusst ist.
-
Bei einigen Ausführungen bzw. Implementierungen ist nicht gestattet, dass alle Ladeinstruktionen außerhalb der Reihenfolge bzw. Out-of-Order sind (obwohl sie immer noch außerhalb der Reihenfolge übergeben werden können). Beispielsweise können Ladeinstruktionen, welche auf Adressen in einem Teil des Speicherraums gerichtet sind, der für Eingabe/Ausgabe- bzw. I/O-Vorrichtungszugriff reserviert ist (auch „I/O-Ladeinstruktionen“ genannt), so verwaltet werden, dass sie immer in der Reihenfolge ausgeführt werden. Dies stellt sicher, dass I/O-Ladeinstruktionen nicht verursachen werden, dass irgendwelche Seiteneffekte nicht korrekt wiederholt werden. Ein Weg, dies zu erreichen, ist es dass der Back-End-Teil 209 Ladeinstruktionen als I/O-Ladeinstruktionen identifiziert (nachdem eine Adressübersetzung ausgeführt worden ist) und mit dem Front-End-Teil 207 kommuniziert (und zwar vor der Ausführung und somit vor irgendwelchen potentiellen Seiteneffekten) um die I/O-Ladeinstruktion in der Reihenfolge erneut auszugeben, und zwar mit einer Anzeige, dass es eine I/O-Ladeinstruktion ist. Der Back-End-Teil 209 kann dann, wenn er eine Ladeinstruktion empfängt, die explizit als eine I/O-Ladeinstruktion identifiziert ist, die I/O-Ladeinstruktion sicher ausführen.
-
Im Allgemeinen erweist die Handhabung von Speicherbarrieren-Instruktionen potentiell eine Handhabung von vier unterschiedlichen Kategorien von ausstehenden (d.h. noch nicht übergebenden) Speicherzugriffsinstruktionen auf, welche zu dem Zeitpunkt decodiert sein können, wenn die Speicherbarrieren-Instruktion ausgegeben wird. Es kann (A) Ladeinstruktionen geben, die ausgegeben wurden, bevor die Speicherbarrieren-Instruktion ausgegeben wurde, und die noch nicht übergeben worden sind. Es kann (B) Speicherinstruktionen geben, die ausgegeben wurden, bevor die Speicherbarrieren-Instruktion ausgegeben wurde, und die noch nicht übergeben worden sind. Es kann (C) Ladeinstruktionen geben, die bereit zum Ausgeben waren, jedoch noch nicht ausgegeben worden sind, bevor die Speicherbarrieren-Instruktion ausgegeben wurde. Es kann (D) Speicherinstruktionen geben, die bereit zum Ausgeben waren, jedoch noch nicht ausgegeben worden sind, bevor die Speicherbarrieren-Instruktionen ausgegeben wurde.
-
Lade- und Speicherinstruktionen in unterschiedlichen Kategorien können unterschiedlich gehandhabt werden, wenn eine Speicherbarrieren-Instruktion gehandhabt wird. Da Speicherinstruktionen in der Reihenfolge bzw. In-Order ausgegeben werden, sind Speicherinstruktionen, die vor der Speicherbarrieren-Instruktion eingeordnet sind, in der Kategorie B, und Speicherinstruktionen, die nach der Speicherbarrieren-Instruktion eingeordnet sind, sind in der Kategorie D. Speicherinstruktionen in der Kategorie B sind schon ausgegeben worden, somit kann der Back-End-Teil 209 einfach die Ausführung für irgendwelche empfangenen Speicherinstruktionen vollenden (ohne das er auf die Programmreihenfolge zugreifen muss). Speicherinstruktionen, die nach der Speicherbarrieren-Instruktion eingeordnet sind, sind noch nicht ausgegeben worden, und werden durch den Front-End-Teil 207 nicht ausgegeben und daher wird der Back-End-Teil 209 nicht irgendwelche Speicherinstruktionen für die Kategorie D verwalten müssen. Für eine Ladeinstruktion in der Kategorie C wird der Front-End-Teil 207 nur jene ausgeben, die vor der Speicherbarrieren-Instruktion eingeordnet sind, somit kann der Back-End-Teil 209 einfach die Ausführung für irgendwelche empfangenen Ladeinstruktionen vollenden (ohne dass er auf die Programmreihenfolge Zugriff haben muss) und den Front-End-Teil 207 benachrichtigen, wenn sie vollendet sind.
-
Dies lässt Instruktionen in der Kategorie A übrig. Einige dieser ausgegebenen Ladeinstruktionen in der Kategorie A sind vor der Speicherbarrieren-Instruktion eingeordnet und andere dieser ausgegebenen Ladeinstruktionen („spekulative Ladevorgänge“ genannt) wurden in spekulativer Weise vor der Speicherbarrieren-Instruktion ausgegeben, sind jedoch nicht vor der Speicherbarrieren-Instruktion gemäß der Programmreihenfolge eingeordnet. Der Front-End-Teil 207 kann den Ladereihenfolgenring 220 und/oder irgendwelche andere Ladereihenfolgeninformation verwenden, um die Programmreihenfolge einer ausgegebenen Ladeinstruktion zu bestimmen. Für jene Ladeinstruktionen, die vor der Speicherbarrieren-Instruktion eingeordnet sind, kann der Front-End-Teil 207 sie in der Reihenfolge bzw. In-Order übergeben, nachdem der Back-End-Teil 209 den Front-End-Teil 207 benachrichtigt, dass sie vollendet sind. Für spekulative Ladevorgänge übergibt jedoch der Front-End-Teil 207 diese nicht notwendigerweise nach dem der Back-End-Teil 209 dem Front-End-Teil 207 dahingehend benachrichtigt, dass sie vollendet sind. Bevor bestimmt wird, ob eine spekulative Ladeinstruktion, die vollendet worden ist, übergeben wird, oder nicht, kann der Front-End-Teil 207 bestimmen, ob die spekulative Ladeinstruktion erneut ausgegeben werden soll oder nicht (wobei irgendwelche Daten ignoriert werden, die durch die zuvor vollendete spekulative Ladeinstruktion geladen wurden).
-
Bei einigen Ausführungen bzw. Implementierungen kann der Front-End-Teil 207 so konfiguriert sein, dass er immer eine spekulative Ladeinstruktion erneut ausgibt, die vor einer Speicherbarrieren-Instruktion ausgegeben wurde, jedoch nach der Speicherbarrieren-Instruktion eingeordnet ist. Bei anderen Ausführungen ist der Front-End-Teil 207 konfiguriert, um selektiv solche spekulativen Ladeinstruktionen erneut auszugeben. Wenn eine spekulative Ladeinstruktion einen Wert geladen hat, kann es nicht notwendig sein, dass die spekulative Ladeinstruktion nicht erneut ausgegeben wird, außer wenn die Adresse von diesem Wert zu einer Adresse passt, die durch eine Invalidierungsinstruktion ungültig gemacht wurde, die vor der Speicherbarrieren-Instruktion und nach der spekulativen Ladeinstruktion eingeordnet ist.
-
Nachdem jegliche spekulative Ladeinstruktionen neu ausgegeben wurden, falls nötig, kann der Front-End-Teil 207 die Reihenfolgeninformation verwenden und einen Puffer übergeben der Ergebnisse von irgendwelchen Instruktionen speichert, die eine Ausführung vollendet haben, jedoch noch nicht übergeben worden sind, um sicherzustellen, dass alle Instruktionen in der Programmreihenfolge übergeben werden. Als ein Teil des Übergebens von Ladeinstruktionen ermöglich der Front-End-Teil 207, dass jegliche Daten, die geladen wurden, verfügbar sind (beispielsweise in einem Register). Als Teil der Übergabe von Ladeinstruktionen ermöglicht der Front-End-Teil 207, das jegliche Daten, die gespeichert werden sollen, zum Speicher gesendet werden (beispielsweise anfänglich zu einem Schreibpuffer gesendet werden). Wenn der Back-End-Teil 209 irgendwelche Probleme bei der erfolgreichen Vollendung der Ausführung von irgendeiner Instruktion angetroffen hat, kann der Back-End-Teil 209 mit dem Front-End-Teil 207 kommunizieren (beispielsweise unter Verwendung des Fahrtweges 218), und der Front-End-Teil 209 kann irgendwelche derartigen Probleme handhaben, möglicherweise durch erneutes Ausgeben von gewissen Instruktionen oder in dem er darauf wartet, dass der Back-End-Teil 209 verzögerte Ergebnisse liefert, bevor betroffene Instruktionen übergeben werden.
-
Andere Ausführungsbeispiele sind innerhalb des Umfangs der folgenden Ansprüche.