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.

IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
Ohne Pipeline
Ohne Pipeline
Mit Pipeline (idealerweise)
Mit Pipeline (idealerweise)
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
IF
IF
ID
ID
EX
EX
MA
MA
WB
WB
25 Takte
25 Takte
9 Takte
9 Takte
Befehl 1
Befehl 1
Befehl 2
Befehl 2
Befehl 3
Befehl 3
Befehl 4
Befehl 4
Befehl 5
Befehl 5
Befehl 1
Befehl 1
Befehl 2
Befehl 2
Befehl 3
Befehl 3
Befehl 4
Befehl 4
Befehl 5
Befehl 5
Viewer does not support full SVG 1.1

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:


  1. ohne Pipeline-Konflikte/Hazard ↩︎

Previous