Klassische RISC -Pipeline

In dem Geschichte der Computerhardware, einige früh Reduzierter Befehlssatz Computer Zentrale Verarbeitungseinheiten (RISC -CPUs) verwendete eine sehr ähnliche architektonische Lösung, die jetzt als a genannt wird Klassische RISC -Pipeline. Diese CPUs waren: MIPS, Sparc, Motorola 88000und später die fiktive CPU DLX für Bildung erfunden.

Jedes dieser klassischen Scalar Risc -Designs holt und versucht, einen auszuführen Anweisung pro Zyklus. Das Hauptkonzept jedes Designs ist eine fünfstufige Ausführung Anweisung Pipeline. Während des Betriebs arbeitet jede Pipeline -Stufe jeweils auf einer Anweisung. Jede dieser Phasen besteht aus einer Reihe von Flip Flops Staat halten, und Kombinationslogik Das arbeitet auf den Ausgängen dieser Flip-Flops.

Die klassische fünfstufige RISC -Pipeline

Grundlegende fünfstufige Pipeline in a RISC Maschine (if = Anweisungen abrufen, Id = Anweisungsdecodierung, ex = execute, mem = Speicherzugriff, WB = Register zurückschreiben). Die vertikale Achse ist aufeinanderfolgende Anweisungen; Die horizontale Achse ist Zeit. In der grünen Spalte befindet sich die früheste Anweisung in der WB -Bühne, und die neueste Anweisung wird den Anweisungen abgeholt.

Anweisungen abrufen

Die Anweisungen befinden sich im Speicher, der einen Zyklus zum Lesen benötigt. Dieser Speicher kann SRAM oder eine Anweisung dediziert sein Zwischenspeicher. Der Begriff "Latenz" wird in der Informatik häufig verwendet und bedeutet die Zeit, zu der ein Betrieb bis zum Abschluss beginnt. Somit hat der Anweisungsrest einer Latenz von einem Taktzyklus (Wenn Sie SRAM mit einem Zyklus verwenden oder wenn sich die Anweisung im Cache befand). So während der Anweisungen abrufen Bühne wird ein 32-Bit-Befehl aus dem Befehlsgedächtnis abgerufen.

Das Programm zähleroder PC ist ein Register, das die Adresse enthält, die dem Befehlsspeicher präsentiert wird. Zu Beginn eines Zyklus wird die Adresse dem Anweisungsspeicher angezeigt. Während des Zyklus wird der Befehl aus dem Anweisungsspeicher ausgelesen, und gleichzeitig wird eine Berechnung durchgeführt, um den nächsten PC zu bestimmen. Die Berechnung des nächsten PCs erfolgt durch Inkrementierung des PCs um 4 und durch die Auswahl des nächsten PCs oder alternativ, um das Ergebnis einer Zweig- / Jump -Berechnung als nächste PC zu nutzen. Beachten Sie, dass im klassischen RISC alle Anweisungen die gleiche Länge haben. (Dies ist eine Sache, die RISC von CISC trennt [1]). In den ursprünglichen RISC -Designs beträgt die Größe einer Anweisung 4 Bytes. Fügen Sie also immer 4 zur Anweisungsadresse hinzu, verwenden Sie jedoch nicht PC + 4 für den Fall eines genommenen Zweigs, Sprung oder Ausnahme (siehe Verzögerte Zweige, unter). (Beachten Sie, dass einige moderne Maschinen kompliziertere Algorithmen verwenden (Zweigvorhersage und Zweigzielvorhersage) Um die nächste Anweisungsadresse zu erraten.)

Anweisung Decodieren

Eine andere Sache, die die ersten RISC -Maschinen von früheren CISC -Maschinen unterscheidet, ist, dass RISC keine hat Mikrocode.[2] Bei CSISC-mikrocodierten Anweisungen, sobald sie aus dem Befehlscache abgerufen wurden, werden die Befehlsbits in der Pipeline verschoben, wobei die einfache Kombinationslogik in jeder Pipeline-Stufe Kontrollsignale für die DataPath direkt aus den Befehlsbits erzeugt. In diesen CISC -Designs erfolgt in der Bühne, die traditionell als Decodes -Stadium bezeichnet wird, nur sehr wenig Dekodierung. Eine Folge dieses Mangels an Dekodierung ist, dass mehr Unterrichtsbits verwendet werden müssen, um anzugeben, was die Anweisung tut. Das lässt weniger Teile für Dinge wie Registerindizes.

Alle MIPS-, SPARC- und DLX -Anweisungen haben höchstens zwei Registereingänge. Während der Decodes -Phase werden die Indizes dieser beiden Register innerhalb der Anweisung identifiziert, und die Indizes werden dem Registerspeicher als Adresse angegeben. So werden die beiden genannten Register aus dem gelesen Datei registrieren. Im MIPS -Design hatte die Registerdatei 32 Einträge.

Gleichzeitig wird die Registerdatei gelesen. In dieser Phase wird die Anweisung in dieser Phase festgelegt, ob die Pipeline in dieser Phase bereit ist, die Anweisung auszuführen. Wenn nicht, bewirkt die Ausgabelogik sowohl die Anweisungsstufe als auch die Decodes -Phase zum Stillstand. In einem Stallzyklus akzeptieren die Eingangsflip -Flops keine neuen Bits, daher finden während dieses Zyklus keine neuen Berechnungen statt.

Wenn der dekodierte Befehl ein Zweig oder Sprung ist, wird die Zieladresse des Zweigs oder Sprung parallel zum Lesen der Registerdatei berechnet. Die Niederlassungsbedingung wird im folgenden Zyklus berechnet (nachdem die Registerdatei gelesen wurde), und wenn der Zweig genommen wird oder wenn der Befehl ein Sprung ist, wird dem PC in der ersten Stufe dem Zweigziel zugewiesen und nicht der inkrementierte PC, das wurde berechnet. Einige Architekturen nutzten die Arithmetik-Logikeinheit (Alu) in der Ausführungsstufe auf Kosten des leicht verringerten Unterrichtsdurchsatzes.

Die Decodes-Stufe hatte eine Menge Hardware: MIPS hat die Möglichkeit einer Verzweigung, wenn zwei Register gleich sind, so Stadium (was weniger Zyklen pro Sekunde bedeutet). Außerdem erforderte die Zweigzielberechnung im Allgemeinen ein 16 -Bit -Add und einen 14 -Bit -Inkrementierer. Durch die Auflösung des Zweigs in der Decodes-Stufe wurde es möglich, nur eine einzelne Straftat mit einem Zyklus zu haben. Da Zweige sehr oft genommen wurden (und damit fehlbedingt) war, war es sehr wichtig, diese Strafe niedrig zu halten.

Ausführen

In der Ausführungsstufe tritt die tatsächliche Berechnung auf. Typischerweise besteht diese Stufe aus einem Alu und auch ein bisschen Schalthebel. Es kann auch einen Mehrfachzyklus -Multiplikator und Teiler enthalten.

Die ALU ist verantwortlich für die Durchführung von Booleschen Operationen (und oder, nicht, NAND, NOR, XOR, XNOR) und auch für die Durchführung von Zulassungen und Subtraktion. Neben dem Ergebnis liefert die ALU normalerweise Statusbits, z. B. ob das Ergebnis 0 betrug oder nicht, ob ein Überlauf aufgetreten ist.

Der Bit Shifter ist für Verschiebung und Rotationen verantwortlich.

Anweisungen zu diesen einfachen RISC -Maschinen können gemäß dem Typ der Operation in drei Latenzklassen unterteilt werden:

  • Register-Register-Betrieb (Einzelzyklus-Latenz): Hinzufügen, Subtrahieren, Vergleich und logische Operationen. Während der Ausführungsphase wurden die beiden Argumente an einen einfachen Alu gespeist, was das Ergebnis am Ende der Ausführungsstufe hervorbrachte.
  • Speicherreferenz (Zwei-Zyklus-Latenz). Alle Lasten aus dem Speicher. Während der Ausführungsstufe fügte die Alu die beiden Argumente (ein Register und einen konstanten Versatz) hinzu, um eine virtuelle Adresse am Ende des Zyklus zu erstellen.
  • Multi-Zyklus-Anweisungen (Viele Zykluslatenz). Ganzzahl multiplizieren und dividieren und alle Schwimmpunkt Operationen. Während der Ausführungsstufe wurden die Operanden zu diesen Operationen an die Multi-Cycle-Multiplikations-/Divide-Einheit gefüttert. Der Rest der Pipeline war frei, die Ausführung fortzusetzen, während die Multiplikations-/Divide -Einheit ihre Arbeit leistete. Um zu vermeiden, dass die Schreibweise und die Ausgabe der Logik erschwert werden, schrieb Multicycle -Anweisungen ihre Ergebnisse in einen separaten Satz von Registern.

Speicherzugriff

Wenn auf den Datenspeicher zugegriffen werden muss, erfolgt dies in dieser Phase.

In dieser Phase haben Einzelzykluslatenzanweisungen ihre Ergebnisse einfach an die nächste Stufe weitergeleitet. Diese Weiterleitung stellt sicher, dass sowohl ein als auch zwei Zyklusanweisungen ihre Ergebnisse immer in derselben Phase der Pipeline schreiben, sodass nur ein Schreibport in die Registerdatei verwendet werden kann und immer verfügbar ist.

Für direkt zugeordnete und praktisch markierte Daten zwischen Daten, die bei weitem einfachsten der einfachsten von der zahlreiche Datencache -Organisationen, zwei Srams werden verwendet, ein Speichern von Daten und die anderen Speichern von Tags.

Schreib zurück

In dieser Phase schreiben sowohl ein Einzelzyklus- als auch zwei Zyklusanweisungen ihre Ergebnisse in die Registerdatei. Beachten Sie, dass zwei verschiedene Stufen gleichzeitig auf die Registerdatei zugreifen - in der Decodes -Phase wird zwei Quellregister gelesen, gleichzeitig, als in der Reportback -Phase ein Zielregister eines vorherigen Befehls schreibt. Auf echtem Silizium kann dies eine Gefahr sein (siehe unten, um weitere Gefahren zu erhalten). Dies liegt daran, dass einer der in Decodes gelesenen Quellregister dieselbe wie das Zielregister entspricht, das in der Schreibweise geschrieben wird. In diesem Fall werden dieselben Speicherzellen in der Registerdatei gleichzeitig gelesen und geschrieben. Auf Silizium funktionieren viele Implementierungen von Speicherzellen nicht richtig, wenn sie gleichzeitig gelesen und geschrieben werden.

Gefahren

Hennessy und Patterson prägten den Begriff Gefahr In Situationen, in denen Anweisungen in einer Pipeline falsche Antworten ergeben würden.

Strukturgefahren

Es treten strukturelle Gefahren auf, wenn zwei Anweisungen versuchen könnten, gleichzeitig dieselben Ressourcen zu verwenden. Klassische RISC -Pipelines vermieden diese Gefahren, indem sie Hardware replizieren. Insbesondere hätten Zweiganweisungen die ALU zur Berechnung der Zieladresse des Zweigs verwenden können. Wenn die ALU für diesen Zweck in der Decode -Phase verwendet würde, hätte eine ALU -Anweisung gefolgt von einem Zweig gesehen, dass beide Anweisungen versucht haben, den Alu gleichzeitig zu verwenden. Es ist einfach, diesen Konflikt zu lösen, indem ein spezialisierter Zweig -Ziel -Addierer in die Decode -Stufe entworfen wird.

Datengefahren

Datengefahren treten auf, wenn eine blind geplante Anweisung versuchen würde, Daten zu verwenden, bevor die Daten in der Registerdatei verfügbar sind.

In der klassischen RISC -Pipeline werden Datengefahren auf zwei Arten vermieden:

Lösung A. Umgang

Umgangen ist auch als bekannt als als Operanden weiterleiten.

Angenommen, die CPU führt das folgende Code aus:

Sub R3,R4 -> R10  ; Schreibt R3 - R4 bis R10 UND R10,R3 -> R11  ; Schreibt R10 & R3 bis R11 

Die Anweisung abreißt und entschlüsselt die Stufen senden den zweiten Befehl einen Zyklus nach dem ersten. Sie fließen die Pipeline hinunter, wie in diesem Diagramm gezeigt:

Pipeline Data Hazard.svg

In einem naive PipelineOhne Gefahrüberlegungen verläuft die Datengefahr wie folgt:

In Zyklus 3 die Sub Der Anweisungen berechnet den neuen Wert für R10. Im selben Zyklus die UND Der Betrieb ist dekodiert und der Wert von R10 wird aus der Registerdatei abgerufen. Allerdings die Sub Die Anweisung hat ihr Ergebnis noch nicht geschrieben R10. Schreibverschiebung davon kommt normalerweise in Zyklus 5 (Green Box) auf. Daher wird der Wert aus der Registerdatei gelesen und an die ALU übergeben (in der Ausführungsstufe der Ausführungsstufe der UND Betrieb, roter Box) ist falsch.

Stattdessen müssen wir die Daten übergeben, die berechnet wurden Sub Zurück zur Ausführungsstufe (d. H. zum roten Kreis im Diagramm) des UND Betrieb Vor Es ist normalerweise zurückgeschrieben. Die Lösung für dieses Problem ist ein Paar Bypass -Multiplexer. Diese Multiplexer sitzen am Ende der Decodes -Stufe und ihre floppten Ausgänge sind die Eingänge für die ALU. Jeder Multiplexer wählt zwischen:

  1. Eine Registerdatei -Lesensport (d. H. Die Ausgabe der Decodes -Stufe, wie in der naiven Pipeline): rot Pfeil
  2. Die aktuelle Registerpipeline der ALU (um um eine Stufe umzugehen): blau Pfeil
  3. Die aktuelle Register -Pipeline der Zugangsstufe (die entweder ein geladener Wert oder ein weitergeleitete ALU -Ergebnis ist, liefert dies die Umgehung von zwei Stufen): Violett Pfeil. Beachten Sie, dass die Daten übergeben werden müssen rückwärts mit der Zeit nach einem Zyklus. Wenn dies geschieht, a Blase muss eingefügt werden, um die zu stoppen UND Betrieb, bis die Daten fertig sind.

Die Decodes -Stadium -Logik vergleicht die Register, die nach Anweisungen in den Ausführungs- und Zugriffsstufen der Pipeline geschrieben wurden, mit den Registern, die von der Anweisung in der Decode -Phase gelesen wurden, und veranlassen die Multiplexer, die neuesten Daten auszuwählen. Diese Bypass-Multiplexer ermöglichen es der Pipeline, einfache Anweisungen mit nur der Latenz des Alu, des Multiplexer und einem Flip-Flop auszuführen. Ohne die Multiplexer müsste die Latenz des Schreibens und das Lesen der Registerdatei in die Latenz dieser Anweisungen einbezogen werden.

Beachten Sie, dass die Daten nur übergeben werden können nach vorne Mit der Zeit - die Daten können nicht in eine frühere Phase umgangen werden, wenn sie noch nicht verarbeitet wurden. In dem obigen Fall werden die Daten weiter übergeben (bis zum Zeitpunkt der UND ist bereit für das Register in der Alu, die Sub hat es bereits berechnet).

Data Forwarding (One Stage).svg

Lösung B. Pipeline -Verriegelung

Betrachten Sie jedoch die folgenden Anweisungen:

Ld  ADR  -> R10 UND R10,R3 -> R11 

Die Daten aus der Adresse gelesen ADR ist erst nach der Speicherzugriffsstufe der Speicherzugriffsstufe im Datencache vorhanden Ld Anweisung. Zu diesem Zeitpunkt die UND Der Anweisungen erfolgt bereits über die Alu. Um dies zu beheben, müssen die Daten aus dem Speicher rechtzeitig an die Eingabe an die ALU übergeben werden. Das ist nicht möglich. Die Lösung besteht darin, die zu verzögern UND Anweisung nach einem Zyklus. Die Datengefahr wird in der Decodes -Stufe erkannt, und die Abruf- und Dekodierungsstufen sind ins Stocken geraten - Sie werden verhindert, dass sie ihre Eingaben ausflippen und so für einen Zyklus im selben Zustand bleiben. Die Ausführungs-, Zugriffs- und Schreibbackstufen stromabwärts sehen eine zusätzliche No-Operation-Anweisung (NOP), die zwischen dem eingefügt wurde Ld und UND Anweisungen.

Diese NOP wird als Pipeline bezeichnet Blase Da es in der Pipeline schwimmt, wie eine Luftblase in einem Wasserrohr, die Ressourcen besetzen, aber keine nützlichen Ergebnisse erzielen. Die Hardware zum Erkennen eines Datengefahrs und zum Stillstand der Pipeline, bis die Gefahr gelöscht wird Pipeline -Verriegelung.

Rückwärts rechtzeitig umgehen Problem mit einer Blase behoben
Data Forwarding (Two Stage, error).svg Data Forwarding (Two Stage).svg

Eine Pipeline -Interlock muss jedoch nicht mit einer Datenweiterleitung verwendet werden. Das erste Beispiel der Sub gefolgt von UND und das zweite Beispiel von Ld gefolgt von UND kann gelöst werden, indem die erste Stufe um drei Zyklen zum Schreiben zurückgeführt wird, und die Daten in der Registerdatei sind korrekt, wodurch der richtige Registerwert von der abgerufen wird UND's Decode Stage. Dies führt zu einer längeren Leistung, da der Prozessor viel Zeit damit verbringt, nichts zu verarbeiten, aber die Taktgeschwindigkeiten können erhöht werden, da weniger weiterleitende Logik zum Warten besteht.

Diese Datengefahr kann ganz einfach erkannt werden, wenn der Maschinencode des Programms vom Compiler verfasst wurde. Das Stanford Mips Die Maschine stützte sich auf den Compiler, um die NOP -Anweisungen in diesem Fall hinzuzufügen, anstatt die Schaltkreise zu erkennen und (steuerlicher) die ersten beiden Pipeline -Stufen zu erkennen und zu beschränken. Daher der Name MIPS: Mikroprozessor ohne unverstockte Pipeline -Stufen. Es stellte sich heraus, dass die vom Compiler hinzugefügten zusätzlichen NOP -Anweisungen die Programmbinärdateien so erweitert haben, dass der Anweisungs -Cache -Trefferquote reduziert wurde. Die Stall -Hardware wurde zwar teuer, aber in spätere Entwürfe zurückgeführt, um den Anleitungsrate für den Anweisungs -Cache zu verbessern. An diesem Punkt machte das Akronym keinen Sinn mehr.

Gefahren kontrollieren

Kontrollgefahren werden durch eine bedingte und bedingungslose Verzweigung verursacht. Die klassische RISC -Pipeline löst Zweige in der Decodes -Stufe auf, was bedeutet, dass das Wiederauftreten der Zweigauflösung zwei Zyklen lang ist. Es gibt drei Implikationen:

  • Das Wiederauftreten der Zweigauflösung durchläuft einiges an Schaltkreisen: Der Anweisungs-Cache-Lesen, Registerdatei, Zweigzustandsberechnung (bei dem ein 32-Bit-Vergleich auf dem MIPS-CPUs beteiligt ist) und der nächste Anweisungsadressen-Multiplexer.
  • Da Zweig- und Sprungziele parallel zum Registerread berechnet werden, haben RISC ISAs normalerweise keine Anweisungen, die an einer Register+Offset -Adresse verzweigt werden. Sprung zur Registrierung wird unterstützt.
  • Bei jedem Zweig wird die Anweisung unmittelbar nach dem Zweig immer aus dem Befehlscache abgerufen. Wenn diese Anweisung ignoriert wird, gibt es einen Zyklus pro Einnahmezweig IPC Strafe, die ausreichend groß ist.

Es gibt vier Programme, um dieses Leistungsproblem mit Zweigen zu lösen:

  • Vorhersage nicht genommen: Holen Sie sich die Anweisung immer nach dem Zweig aus dem Befehlscache ab, führen Sie sie jedoch nur aus, wenn der Zweig nicht genommen wird. Wenn der Zweig nicht genommen wird, bleibt die Pipeline voll. Wenn der Zweig genommen wird, wird die Anweisung gespült (markiert, als wäre er eine NOP), und die Gelegenheit eines Zyklus, einen Anweisungen zu beenden, geht verloren.
  • Zweig wahrscheinlich: Abrufen Sie die Anweisung immer nach dem Zweig aus dem Befehlscache ab, führen Sie sie jedoch nur aus, wenn der Zweig genommen wurde. Der Compiler kann den Zweigverzögerungsschlitz in einem solchen Zweig jederzeit füllen, und da Zweige häufiger als nicht eingenommen werden, haben solche Zweige eine geringere IPC -Strafe als die vorherige Art.
  • Zweigverzögerungsschlitz: Holen Sie sich die Anweisung immer nach dem Zweig aus dem Befehlscache und führen Sie sie immer aus, auch wenn der Zweig genommen wird. Anstatt eine IPC -Strafe für einen Bruchteil der genommenen Zweige (möglicherweise 60%) oder nicht für 40%) zu erheben, nehmen Branch -Verzögerungs -Slots eine IPC -Strafe für die Zweige an, in die der Compiler den Zweig -Verzögerungs -Slot nicht planen konnte. Die SPARC-, MIPS- und MC88K -Designer haben einen Zweigverzögerungsschlitz in ihre ISAs entwickelt.
  • Zweigvorhersage: Parallel zum Abholen jeder Anweisung, raten Sie mal, ob die Anweisung ein Zweig oder Sprung ist, und erraten Sie das Ziel. Aben Sie im Zyklus nach einem Zweig oder Sprung die Anweisung am erratenen Ziel. Wenn die Vermutung falsch ist, spülen Sie das falsch abgerufene Ziel.

Zuerst waren verzögerte Zweige umstritten, da ihre Semantik kompliziert ist. Ein verzögerter Zweig gibt an, dass der Sprung zu einem neuen Standort stattfindet nach Die nächste Anweisung. Diese nächste Anweisung ist derjenige, der nach dem Zweig unvermeidlich vom Befehlscache geladen wird.

Verspätete Zweige wurden kritisiert[von wem?] Als schlechte kurzfristige Wahl im ISA-Design:

  • Compiler haben in der Regel Schwierigkeiten, logisch unabhängige Anweisungen zu finden, die nach dem Zweig platziert werden sollen (die Anweisung nach dem Zweig wird als Verzögerungsschlitz bezeichnet), damit sie NOPs in die Verzögerungsschlitze einfügen müssen.
  • Superscalar Prozessoren, die mehrere Anweisungen pro Zyklus abrufen und irgendeine Form von Zweigvorhersage haben müssen, profitieren nicht von verzögerten Zweigen. Das Alpha ISA ließ verzögerte Zweige aus, da es für Supercalar -Prozessoren bestimmt war.
  • Der schwerwiegendste Nachteil der verzögerten Zweige ist die zusätzliche Kontrollkomplexität, die sie mit sich bringen. Wenn die Anweisung für Verzögerungsschlitz eine Ausnahme nimmt, muss der Prozessor eher in der Filiale als in der nächsten Anweisung neu gestartet werden. Ausnahmen haben dann im Wesentlichen zwei Adressen, die Ausnahmeadresse und die Neustartadresse, und die Erzeugung und Unterscheidung zwischen den beiden in allen Fällen war eine Quelle von Fehler für spätere Entwürfe.

Ausnahmen

Angenommen, ein 32-Bit-RISC verarbeitet einen Anweisungen hinzufügen, der zwei große Zahlen hinzufügt, und das Ergebnis passt nicht in 32 Bit.

Die einfachste Lösung, die von den meisten Architekturen bereitgestellt wird, ist die Verpackung der Arithmetik. Zahlen größer als der maximal mögliche codierte Wert haben ihre wichtigsten Bits abgehackt, bis sie passen. Im üblichen Ganzzahl -Zahlensystem 3000000000+3000000000 = 6000000000. Mit vorzeichenlosen 32 -Bit -Verpackungsarithmetik, 3000000000+3000000000 = 1705032704 (6000000000 Mod 2^32). Dies scheint nicht besonders nützlich zu sein. Der größte Vorteil der Verpackungsarithmetik besteht darin, dass jede Operation ein gut definiertes Ergebnis hat.

Aber der Programmierer, insbesondere wenn die Programmierung in einer Sprache unterstützt wird Dicke Ganzzahlen (z.B. Lispeln oder Planen), möchte möglicherweise nicht die Arithmetik einwickeln. Einige Architekturen (z. B. MIPS) definieren spezielle Additionsvorgänge, die auf spezielle Standorte auf Überlauf verzweigen, anstatt das Ergebnis zu wickeln. Software am Zielort ist für die Behebung des Problems verantwortlich. Diese Sonderzweig wird als Ausnahme bezeichnet. Ausnahmen unterscheiden sich von regulären Zweigen darin, dass die Zieladresse nicht von der Anweisung selbst angegeben wird, und die Zweigentscheidung hängt vom Ergebnis der Anweisung ab.

Die häufigste Art von Software-sichtbarer Ausnahme in einer der klassischen RISC-Maschinen ist a TLB Miss.

Ausnahmen unterscheiden sich von Zweigen und Sprüngen, da diese anderen Kontrollflussänderungen in der Decodes -Stufe aufgelöst werden. Ausnahmen sind in der Schreibweise aufgelöst. Wenn eine Ausnahme erkannt wird, werden die folgenden Anweisungen (früher in der Pipeline) als ungültig markiert, und wenn sie bis zum Ende des Rohrs fließen, werden ihre Ergebnisse verworfen. Der Programmzähler ist auf die Adresse eines speziellen Ausnahmehandlers eingestellt, und spezielle Register werden mit Ausnahmeort und Ursache geschrieben.

Um es für die Software einfach (und schnell) zu machen, um das Problem zu beheben und das Programm neu zu starten, muss die CPU eine genaue Ausnahme nutzen. Eine genaue Ausnahme bedeutet, dass alle Anweisungen bis zur Ausnahme von Anweisungen ausgeführt wurden und die Ausnahme von Anweisungen und alles danach nicht ausgeführt wurden.

Um genaue Ausnahmen zu machen, muss die CPU verpflichten Änderungen des Software sichtbaren Status in der Programmreihenfolge. Dieser In-Ordnung-Commit geschieht in der klassischen RISC-Pipeline ganz natürlich. Die meisten Anweisungen schreiben ihre Ergebnisse in die Registerdatei in der Schreibback -Phase, so dass diese schreiben automatisch in Programmreihenfolge. Speichern Sie ihre Ergebnisse jedoch in die Warteschlange der Store -Daten in der Zugriffsstufe. Wenn die Store -Anweisung eine Ausnahme nimmt, wird der Store -Datenwarteschlangeneintrag ungültig, so dass er später nicht in die Cache -Daten SRAM geschrieben wird.

Cache -Miss -Handling

Gelegentlich enthält entweder der Daten- oder der Anweisungs -Cache keinen erforderlichen Daten- oder Anweisungen. In diesen Fällen muss die CPU den Betrieb aussetzen, bis der Cache mit den erforderlichen Daten gefüllt werden kann und dann die Ausführung wieder aufnehmen muss. Das Problem, den Cache mit den erforderlichen Daten zu füllen (und potenziell zurück in den Speicher der ausgegebenen Cache -Linie) ist für die Pipeline -Organisation nicht spezifisch und wird hier nicht erörtert.

Es gibt zwei Strategien, um das Problem der Suspend-/Lebenslauf zu bewältigen. Das erste ist ein globales Stallsignal. Dieses Signal verhindert, dass Anweisungen die Pipeline im Allgemeinen hinuntersteigt, indem sie zu Beginn jeder Stufe die Uhr zu den Flip-Flops abschlägen. Der Nachteil dieser Strategie besteht darin, dass es eine große Anzahl von Flip -Flops gibt, sodass das globale Stallsignal lange dauert, bis sie sich verbreitet. Da die Maschine im Allgemeinen in demselben Zyklus stehen muss, in dem sie den Zustand identifiziert, der den Stand erfordert, wird das Stallsignal zu einem Geschwindigkeitsbegrenzungs-Kritikpfad.

Eine weitere Strategie zum Umgang mit Suspend/Lebenslauf besteht darin, die Ausnahmegellogik wiederzuverwenden. Die Maschine nimmt eine Ausnahme auf die beleidigende Anweisung und alle weiteren Anweisungen werden ungültig. Wenn der Cache mit den erforderlichen Daten gefüllt wurde, hat der Anweisungen, der den Cache -Fehlgang verursachte, neu gestartet. Um Datencache -Miss -Handhabung zu beschleunigen, kann die Anweisung neu gestartet werden, damit der Zugriffszyklus ein Zyklus nach dem Ausfüllen des Datencache erfolgt.

Siehe auch

Verweise

  • Hennessy, John L.; Patterson, David A. (2011). Computerarchitektur, ein quantitativer Ansatz (5. Aufl.). Morgan Kaufmann. ISBN 978-0123838728.
  1. ^ Patterson, David (12. Mai 1981). "RISC I: Ein reduzierter Befehlssatz VLSI -Computer". ISCA '81. S. 443–457.
  2. ^ Patterson, David (12. Mai 1981). "RISC I: Ein reduzierter Befehlssatz VLSI -Computer". ISCA '81. S. 443–457.