Pipeline (Prozessor)

Instruction Pipelining ist eine Technik, die bei der Entwicklung moderner Mikroprozessoren, Mikrocontroller und CPUs eingesetzt wird, um deren Instruktionsdurchsatz (die Anzahl der Instruktionen, die in einer Zeiteinheit ausgeführt werden können) zu erhöhen.

Die Hauptidee besteht darin, die Verarbeitung eines CPU-Befehls, wie er durch den Befehlsmikrocode definiert ist, in eine Reihe unabhängiger Schritte von Mikrooperationen (auch "Mikrobefehle", "micro-op" oder "µop" genannt) zu unterteilen (als "Split" bezeichnet), mit Speicherung am Ende jedes Schritts. Dadurch kann die Steuerlogik der CPUs die Befehle mit der Verarbeitungsrate des langsamsten Schritts verarbeiten, was viel schneller ist als die Zeit, die für die Verarbeitung des Befehls als Einzelschritt benötigt wird.

Der Begriff Pipeline bezieht sich auf die Tatsache, dass jeder Schritt einen einzelnen Mikrobefehl trägt (wie ein Wassertropfen) und jeder Schritt mit einem anderen Schritt verbunden ist (Analogie; ähnlich wie Wasserrohre).

Die meisten modernen CPUs werden von einer Uhr angetrieben. Die CPU besteht intern aus Logik und Speicher (Flip-Flops). Wenn das Taktsignal eintrifft, speichern die Flip-Flops ihren neuen Wert, dann benötigt die Logik eine gewisse Zeit, um die neuen Werte der Flip-Flops zu dekodieren. Dann trifft der nächste Taktimpuls ein, und die Flip-Flops speichern weitere Werte, und so weiter. Durch Aufteilen der Logik in kleinere Teile und Einfügen von Flip-Flops zwischen die Logikteile wird die von der Logik benötigte Zeit (zum Dekodieren von Werten bis zur Erzeugung gültiger Ausgaben in Abhängigkeit von diesen Werten) verringert. Auf diese Weise kann die Taktperiode reduziert werden. Beispielsweise wird
die RISC-Pipeline in fünf Stufen mit einer Reihe von Flip-Flops zwischen jeder Stufe wie folgt unterteilt:

  1. Anweisung abrufen
  2. Befehlsdekodierung und Registerabruf
  3. Ausführen
  4. Speicherzugriff
  5. Register zurückschreiben

Prozessoren mit Pipelining bestehen intern aus Stufen (Modulen), die semi-unabhängig an separaten Mikroinstruktionen arbeiten können. Jede Stufe ist durch Flip-Flops mit der nächsten Stufe verbunden (wie eine "Kette"), so dass der Output der Stufe ein Input für eine andere Stufe ist, bis die Aufgabe der Verarbeitung von Anweisungen erledigt ist. Eine solche Organisation von prozessorinternen Modulen reduziert die Gesamtverarbeitungszeit der Anweisung.

Eine Nicht-Pipeline-Architektur ist nicht so effizient, da einige CPU-Module im Leerlauf sind, während ein anderes Modul während des Befehlszyklus aktiv ist. Pipelining beseitigt die Leerlaufzeit in einer Pipeline-CPU nicht vollständig, aber wenn CPU-Module parallel arbeiten, erhöht sich der Befehlsdurchsatz.

Eine Instruktionspipeline gilt als vollständig pipelinisiert, wenn sie in jedem Taktzyklus eine neue Instruktion aufnehmen kann. Eine Pipeline, die nicht vollständig in die Pipeline eingebunden ist, hat Wartezyklen, die den Fortschritt der Pipeline verzögern.

Einfache fünfstufige Pipeline in einer RISC-Maschine (IF = Instruction Fetch, ID = Instruction Decode, EX = Execute, MEM = Memory Access, WB = Register Write Back). Die vertikale Achse sind aufeinanderfolgende Befehle, die horizontale Achse ist die Zeit. In der grünen Spalte befindet sich also der früheste Befehl im WB-Stadium, und der letzte Befehl befindet sich im Befehlsabruf (Instruction Fetch).Zoom
Einfache fünfstufige Pipeline in einer RISC-Maschine (IF = Instruction Fetch, ID = Instruction Decode, EX = Execute, MEM = Memory Access, WB = Register Write Back). Die vertikale Achse sind aufeinanderfolgende Befehle, die horizontale Achse ist die Zeit. In der grünen Spalte befindet sich also der früheste Befehl im WB-Stadium, und der letzte Befehl befindet sich im Befehlsabruf (Instruction Fetch).

Vor- und Nachteile des Pipelining

Vorteile des Pipelining:

  1. Die Zykluszeit des Prozessors wird reduziert; der Befehlsdurchsatz wird erhöht. Pipelining verringert nicht die Zeit, die für die Fertigstellung eines Befehls benötigt wird; stattdessen erhöht es die Anzahl der Befehle, die gleichzeitig ("auf einmal") verarbeitet werden können, und verringert die Verzögerung zwischen abgeschlossenen Befehlen (als "Durchsatz" bezeichnet).
    Je mehr Pipelinestufen ein Prozessor hat, desto mehr Instruktionen kann er "auf einmal" verarbeiten und desto geringer ist die Verzögerung zwischen den abgeschlossenen Instruktionen. Jeder vorherrschende Allzweck-Mikroprozessor, der heute hergestellt wird, verwendet mindestens 2 Pipeline-Stufen bis zu 30 oder 40 Stufen.
  2. Wenn Pipelining verwendet wird, kann die CPU-Arithmetik-Logik-Einheit schneller entworfen werden, wird aber komplexer sein.
  3. Pipelining erhöht theoretisch die Leistung gegenüber einem nicht gepipelineten Kern um einen Faktor der Anzahl der Stufen (unter der Annahme, dass die Taktfrequenz ebenfalls um denselben Faktor ansteigt), und der Code ist ideal für die Pipelineausführung.
  4. Pipeline-CPUs arbeiten in der Regel mit einer höheren Taktfrequenz als die RAM-Taktfrequenz (ab 2008 arbeiten RAMs im Vergleich zu CPUs mit einer niedrigeren Frequenz), wodurch die Gesamtleistung der Computer erhöht wird.

Nachteile des Pipelining:

Pipelining hat viele Nachteile, obwohl es eine Menge von Techniken gibt, die von CPUs und Compiler-Designern verwendet werden, um die meisten davon zu überwinden; im Folgenden finden Sie eine Liste der üblichen Nachteile:

  1. Das Design eines Non-Pipeline-Prozessors ist einfacher und billiger in der Herstellung, ein Non-Pipeline-Prozessor führt immer nur einen einzigen Befehl auf einmal aus. Dadurch werden Verzögerungen bei der Verzweigung (beim Pipelining wird jede Verzweigung verzögert) sowie Probleme bei der gleichzeitigen Ausführung von seriellen Befehlen vermieden.
  2. Bei einem Pipeline-Prozessor erhöht das Einfügen von Flip-Flops zwischen Modulen die Befehlslatenz im Vergleich zu einem Nichtpipeline-Prozessor.
  3. Ein Prozessor ohne Pipeline hat einen definierten Befehlsdurchsatz. Die Leistung eines Pipeline-Prozessors ist viel schwieriger vorherzusagen und kann für verschiedene Programme stark variieren.
  4. Viele Entwürfe umfassen Pipelines mit einer Länge von 7, 10, 20, 31 und noch mehr Stufen; ein Nachteil einer langen Pipeline ist, dass bei einer Programmverzweigung die gesamte Pipeline gespült (geräumt) werden muss. Der höhere Durchsatz von Pipelines ist zu gering, wenn der ausgeführte Code viele Verzweigungen enthält: Der Prozessor kann nicht im Voraus wissen, wo die nächste Anweisung zu lesen ist, und muss auf das Ende der Verzweigungsanweisung warten, so dass die dahinter liegende Pipeline leer bleibt. Dieser Nachteil kann verringert werden, indem vorhergesagt wird, ob die Verzweigungsinstruktion einer bedingten Verzweigung auf der Grundlage der vorherigen Aktivität verzweigt wird. Nachdem die Verzweigung aufgelöst ist, muss die nächste Anweisung den ganzen Weg durch die Pipeline zurücklegen, bevor ihr Ergebnis verfügbar wird und der Prozessor wieder "weiterarbeitet". In solchen extremen Fällen könnte die Leistung eines Prozessors mit Pipeline schlechter sein als die eines Prozessors ohne Pipeline.
  5. Leider sind nicht alle Anweisungen unabhängig. In einer einfachen Pipeline kann die Fertigstellung einer Anweisung 5 Schritte erfordern. Um mit voller Leistung zu arbeiten, muss diese Pipeline 4 aufeinanderfolgende unabhängige Anweisungen ausführen, während die erste abgeschlossen wird. Jede dieser 4 Instruktionen könnte von der Ausgabe der ersten Instruktion abhängen, was dazu führt, dass die Pipeline-Steuerlogik wartet und einen Stillstand oder einen vergeudeten Taktzyklus in die Pipeline einfügt, bis die Abhängigkeit aufgelöst ist. Glücklicherweise können Techniken wie die Weiterleitung die Fälle, in denen eine Blockierung erforderlich ist, erheblich reduzieren.
  6. Selbstmodifizierende Programme können auf einer Pipeline-Architektur möglicherweise nicht ordnungsgemäß ausgeführt werden, wenn die zu modifizierenden Befehle in der Nähe der auszuführenden Befehle liegen. Dies kann dadurch verursacht werden, dass sich die Befehle bereits in der Prefetch-Eingabewarteschlange befinden, so dass die Änderung möglicherweise nicht für die bevorstehende Ausführung von Befehlen wirksam wird. Befehls-Caches machen das Problem noch schlimmer.
  7. Gefährdungen: Wenn ein Programmierer (oder Compiler) Assemblercode schreibt, geht er im Allgemeinen davon aus, dass jeder Befehl ausgeführt wird, bevor der nächste Befehl ausgeführt wird. Wenn diese Annahme nicht durch Pipelining bestätigt wird, führt dies dazu, dass sich ein Programm falsch verhält, und die Situation wird als Hazard bezeichnet. Es gibt
    verschiedene
    Techniken zur Lösung von Gefahren oder zur Umgehung von Gefahren, wie z.B. Weiterleiten und Verzögern (durch Einfügen eines Blockierens oder eines verschwendeten Taktzyklus).

Beispiele

Generische Pipeline

Auf der rechten Seite ist eine generische Pipeline mit vier Stufen zu sehen:

  1. Holen Sie
  2. entschlüsseln
  3. Ausführen
  4. Zurückschreiben

Der obere graue Kasten ist die Liste der Instruktionen, die darauf warten, ausgeführt zu werden; der untere graue Kasten ist die Liste der Instruktionen, die bereits ausgeführt wurden; und der mittlere weiße Kasten ist die Pipeline.

Die Ausführung ist wie folgt:

Zeit

Ausführung

0

Vier Befehle warten darauf, ausgeführt zu werden

1

  • die grüne Anweisung wird aus dem Speicher geholt

2

  • der grüne Befehl wird dekodiert
  • die violette Anweisung wird aus dem Speicher geholt

3

  • der grüne Befehl ausgeführt wird (die eigentliche Operation wird ausgeführt)
  • der violette Befehl wird dekodiert
  • die blaue Anweisung geholt wird

4

  • die Ergebnisse des grünen Befehls werden in die Registerdatei oder den Speicher zurückgeschrieben
  • der violette Befehl wird ausgeführt
  • der blaue Befehl wird dekodiert
  • die rote Anweisung geholt wird

5

  • der grüne Befehl abgeschlossen ist
  • die violette Anweisung wird zurückgeschrieben
  • die blaue Anweisung wird ausgeführt
  • der rote Befehl wird dekodiert

6

  • Die violette Anweisung ist abgeschlossen
  • die blaue Anweisung wird zurückgeschrieben
  • die rote Anweisung wird ausgeführt

7

  • der blaue Befehl ist abgeschlossen
  • die rote Anweisung wird zurückgeschrieben

8

  • die rote Anweisung ist abgeschlossen

9

Alle Anweisungen werden ausgeführt

Seifenblase

Wenn ein "Schluckauf" (Unterbrechung) bei der Ausführung auftritt, entsteht in der Pipeline eine "Blase", in der nichts Nützliches geschieht. In Zyklus 2 wird das Holen der violetten Anweisung verzögert, und die Dekodierungsphase in Zyklus 3 enthält nun eine "Blase". Alles hinter der violetten Anweisung wird ebenfalls verzögert, aber alles vor der violetten Anweisung fährt mit der Ausführung fort.

Verglichen mit der obigen Ausführung ergibt die Blase eindeutig eine Gesamtausführungszeit von 8 statt 7 Uhr-Ticks.

Blasen sind wie Stände (Verzögerungen), in denen beim Holen, Entschlüsseln, Ausführen und Zurückschreiben nichts Nützliches geschieht. Es ist wie ein NOP-Code (kurz für No OPeration).

Beispiel 1

Eine typische Anweisung zum Addieren von zwei Zahlen könnte ADD A, B, C sein, die die in den Speicherplätzen A und B gefundenen Werte addiert und dann das Ergebnis in Speicherplatz C ablegt. In einem Pipeline-Prozessor würde der Pipeline-Controller dies in eine Reihe von Aufgaben aufteilen, die ähnlich sind:

LADEN A, R1 LADEN B, R2 HINZUFÜGEN R1, R2, R3 SPEICHERN R3, C LADEN nächste Anweisung

Die Stellen 'R1' und 'R2' sind Register in der CPU. Die in den mit 'A' und 'B' bezeichneten Speicherstellen gespeicherten Werte werden in diese Register geladen (kopiert), dann addiert und das Ergebnis in einer mit 'C' bezeichneten Speicherstelle gespeichert.

In diesem Beispiel besteht die Pipeline aus drei Stufen: Laden, Ausführen und Speichern. Jeder der Schritte wird als Pipeline-Stufen bezeichnet.

Bei einem Prozessor ohne Pipeline kann immer nur eine Stufe gleichzeitig arbeiten, so dass die gesamte Anweisung abgeschlossen sein muss, bevor die nächste Anweisung beginnen kann. Bei einem Prozessor mit Pipeline-Prozessor können alle Stufen gleichzeitig an verschiedenen Befehlen arbeiten. Wenn sich dieser Befehl also in der Ausführungsphase befindet, befindet sich ein zweiter Befehl in der Dekodierungsphase und ein dritter Befehl in der Abrufphase.

Beispiel 2

Um das Konzept besser zu verstehen, können wir uns eine theoretische 3-stufige Pipeline ansehen:

Bühne

Beschreibung

laden

Befehl aus dem Speicher lesen

Ausführen

Befehl ausführen

Laden

Ergebnis in Speicher und/oder Registern speichern

und eine Pseudocode-Assembly-Liste, die ausgeführt werden soll:

LOAD #40, A      MOVE A, B ; Kopieren von A in B ADD #20, B      STORE B, 0x300 ; Speichern von B in Speicherzelle 0x300

So würde es ausgeführt werden:

Uhr 1

laden

Ausführen

Laden

LADEN

 

 

Der Befehl LOAD wird aus dem Speicher geholt.

Uhr 2

laden

Ausführen

Laden

MOVE

LADEN

 

Der Befehl LOAD wird ausgeführt, während der Befehl MOVE aus dem Speicher geholt wird.

Uhr 3

laden

Ausführen

Laden

HINZUFÜGEN

MOVE

LADEN

Der Befehl LOAD befindet sich in der Stufe Store, wo sein Ergebnis (die Zahl 40) im Register A gespeichert wird. In der Zwischenzeit wird der Befehl MOVE ausgeführt. Da sie den Inhalt von A nach B verschieben muss, muss sie auf das Ende der LOAD-Anweisung warten.

Uhr 4

laden

Ausführen

Laden

SPEICHERN

HINZUFÜGEN

MOVE

Der STORE-Befehl wird geladen, während der MOVE-Befehl beendet wird und der ADD-Befehl berechnet wird.

Und so weiter. Beachten Sie, dass eine Anweisung manchmal vom Ergebnis einer anderen Anweisung abhängt (wie unser MOVE-Beispiel). Wenn mehr als eine Anweisung eine bestimmte Stelle für einen Operanden referenziert, entweder lesend (als Eingabe) oder schreibend (als Ausgabe), kann die Ausführung dieser Anweisungen in einer anderen Reihenfolge als der ursprünglichen Programmreihenfolge zu der (oben erwähnten) Gefahrensituation führen.

Generische 4-stufige Pipeline; die farbigen Kästen stellen voneinander unabhängige Anweisungen darZoom
Generische 4-stufige Pipeline; die farbigen Kästen stellen voneinander unabhängige Anweisungen dar

Eine Blase in Zyklus 3 verzögert die AusführungZoom
Eine Blase in Zyklus 3 verzögert die Ausführung

Verwandte Seiten

  • Pipeline (Berechnung)
  • Parallele Datenverarbeitung
  • Parallelität auf Anweisungsebene

Fragen und Antworten

F: Was ist Instruktions-Pipelining?


A: Befehlspipelining ist eine Technik, die beim Design moderner Mikroprozessoren, Mikrocontroller und CPUs eingesetzt wird, um den Befehlsdurchsatz zu erhöhen, indem die Verarbeitung eines CPU-Befehls in eine Reihe unabhängiger Schritte mit Speicherung am Ende jedes Schritts unterteilt wird.

F: Wie funktioniert das Pipelining?


A: Pipelining funktioniert, indem die Logik in kleinere Teile zerlegt und Flip-Flops zwischen die Teile der Logik eingefügt werden. Dadurch wird die Zeit verkürzt, die die Logik benötigt, um Werte zu dekodieren, bis sie in Abhängigkeit von diesen Werten gültige Ausgaben erzeugt. Dies ermöglicht schnellere Taktperioden.

F: Was sind einige Beispiele für Pipelines?


A: Ein Beispiel für eine Pipeline ist die RISC-Pipeline, die in fünf Stufen mit einer Reihe von Flip-Flops zwischen den einzelnen Stufen unterteilt ist.

F: Wie erhöht Pipelining den Befehlsdurchsatz?


A: Pipelining erhöht den Befehlsdurchsatz, da die CPU-Module parallel arbeiten können, was die Leerlaufzeit während eines Befehlszyklus verringert und die Gesamtverarbeitungszeit erhöht.

F: Ist jede Pipeline vollständig mit Pipelines ausgestattet?


A: Nein, nicht jede Pipeline ist vollständig mit Pipelines ausgestattet. Einige Pipelines haben Wartezyklen, die den Fortschritt in der Pipeline verzögern.

AlegsaOnline.com - 2020 / 2023 - License CC3