EMZETT.
Login

CPU-Pipeline

Kurz: Eine CPU-Pipeline zerlegt die Ausführung eines Befehls in mehrere Stufen, die wie ein Fließband gleichzeitig an verschiedenen Befehlen arbeiten. Dadurch wird pro Takt im Idealfall ein Befehl fertig, obwohl jeder mehrere Takte braucht.

Genauer: Statt einen Befehl komplett zu erledigen, bevor der nächste beginnt, überlappt die CPU die Schritte. Während Befehl 1 ausgeführt wird, wird Befehl 2 schon dekodiert und Befehl 3 geholt. Das erhöht den Durchsatz und erlaubt höhere Takte, weil jede Stufe weniger Arbeit hat.

Im Detail

Klassische 5 Stufen (RISC):

StufeAufgabe
IF (Instruction Fetch)Befehl aus dem Speicher/Cache holen
ID (Instruction Decode)Befehl dekodieren, Register lesen
EX (Execute)In der ALU rechnen
MEM (Memory)Speicher lesen/schreiben
WB (Write Back)Ergebnis ins Register schreiben
Takt:    1   2   3   4   5   6   7
Bef. 1:  IF  ID  EX  MEM WB
Bef. 2:      IF  ID  EX  MEM WB
Bef. 3:          IF  ID  EX  MEM WB

Nach dem Anlaufen wird ab Takt 5 in jedem Takt ein Befehl fertig.

Probleme (Hazards):

  • Datenabhängigkeit: Ein Befehl braucht das Ergebnis des vorigen. Lösung: Weiterleiten (Forwarding) oder kurze Pause (Stall).
  • Strukturkonflikt: Zwei Stufen brauchen dieselbe Einheit gleichzeitig.
  • Steuerungskonflikt (Sprünge): Bei einer Verzweigung weiß man nicht, welche Befehle als Nächstes kommen. Die Sprungvorhersage rät. Bei falscher Vorhersage werden die falsch geladenen Befehle verworfen („Pipeline-Flush”, verliert 10 – 20 Takte).

Weiterentwicklungen:

  • Superskalar: Mehrere Pipelines parallel, mehrere Befehle pro Takt.
  • Out-of-Order-Ausführung: Befehle werden umgeordnet, sobald Daten bereit sind.
  • Tiefe Pipelines: Intel Pentium 4 hatte 31 Stufen, was hohen Takt, aber teure Fehlvorhersagen brachte. Moderne Kerne haben ca. 14 – 20.

Warum wichtig? Pipelines erklären, warum Code mit vielen unvorhersehbaren Sprüngen langsamer ist und warum IPC (Befehle pro Takt) wichtiger ist als nur GHz.

Siehe auch: Out-of-Order Execution, CPU-Aufbau: Rechenwerke und Cache, x86-64 und ARM64