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):
| Stufe | Aufgabe |
|---|---|
| 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