Zusammenfassung
Annahme:
- Die Ausführung eines Befehls besteht aus 5 Phasen:
- Instruction Fetch (IF)
- Instruction Decode (ID)
- Execution (EX)
- Memory Access (MA)
- Write Back (WB)
- 1 Takt pro Phase
- Es gibt insgesamt 5 Befehle
Ohne Pipelining kann ein Befehl nur dann ausgeführt wird, wenn die Ausführung des letztes Befehls fertig ist. In diesem Fall wir brauchen insgesamt $5 \times 5 = 25$ Takte.
Mit skalarer Pipelining können diese 5 Befehle idealerweise 1 9 Takte fertig ausgeführt werden.
Aber in praktisch treten Pipeline-Konflikte häufig auf. Pipeline-Konflikte verhindern, dass die nächste Instruktion im Befehlsstrom im zugewiesenen Taktzyklus ausgeführt wird.
Es gibt drei Typen der Konflikte:
- Strukturkonflikte
- Datenkonflikte
- RAW
- WAR
- WAW
- Steuerkonflikte
Die einfachste Auflösung der Pipeline-Konflikte ist:
Anhalten der Pipeline (Pipeline stall), oder
Einfügen eines Leerzyklus (Pipeline Bubble)
Aber das führt zu Leistungseinbußen.
Andere Einschränkungen/Nachteile skalarer Pipelines ist die obere Grenze des Durchsatzes ($IPC \leq 1$ oder $CPI \geq 1$). Lösung dazu ist Nebenläufigkeit:
- statische: VLIW (Very Long Instruction Word)
- dynamische: Superskalartechnik
- Algorithm: Tumasulo Algorithm
ohne Pipeline-Konflikte/Hazard ↩︎