Nicht auflösbare Data‐Hazards
Nicht jeder Data‐Hazard lässt sich durch Forwarding
auflösen. Beispiel: Zugriff auf
vorher gelesenes Register.
Pipeline‐Stall als Lösung
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Allgemeine Lösung mittels Hazard‐Detection‐Unit
Implementation der Hazard‐Detection‐Unit
Quiz: Vermeiden von Pipeline‐Stalls
lw $t1, 0($t0) lw $t2, 4($t0)
add $t3, $t1, $t2 sw $t3, 12($t0) lw $t4, 8($t0)
add $t5, $t1, $t4 sw $t5, 16($t0)
Wo findet ein Pipe‐
line‐Stall statt? Bitte ankreuzen.
Bitte Befehle umorganisie‐
ren, sodass alle Stalls vermieden werden.
Anzahl Taktzyklen mit Stalls?
Anzahl Taktzyklen ohne Stalls?
Control‐Hazards
Control‐Hazards
Branch‐Not‐Taken‐Strategie und Pipeline‐Flush
Flush = Verwerfe Instruktionen in der Pipeline. Hier: Setze IF/ID‐, ID/EX‐ und
EX/MEM‐Register auf 0.
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Reduktion des Branch‐Delays
• Adressberechnung kann schon in der ID‐Stufe stattfinden
• beq und bne erfordert lediglich ein 32‐Bit‐XOR und ein 32‐Bit‐OR
– Dazu braucht man keine ALU
– Also auch in der ID‐Stufe realisierbar
• Damit ist der Sprung schon in der ID‐
Stufe entschieden
Beispiel: für $1 und $3:
Reduktion des Branch‐Delays
• Konsequenz
– Branch‐Delay ist damit ein Instruktions‐Zyklus
– Wir brauchen lediglich ein Flush‐IF/ID‐Register
Reduktion des Branch‐Delays
• Achtung!
– Forwarding aus späteren Stufen macht die Sache kompliziert.
– Kann Pipeline‐Stall aufgrund von Data‐Hazards erforderlich
machen.
• z.B. ein Zyklus, wenn ALU‐Ergebnis in den Vergleich einfließt
• z.B. zwei Zyklen, wenn
Vergleichsoperator einen Schritt vorher aus dem Speicher geladen wurde
– Betrachten wir aber hier nicht
genauer.
Dynamic‐Branch‐Prediction‐Strategie
Unterer Teil der Adresse
Branch hat stattgefunden
0x00 1
0x04 0
0x08 1
...
0xf8 0
0xfc 0
Branch‐Prediction‐Buffer 0x400000 : lw $1, 0($4)
0x400004 : beq $1, $0, 40 0x400008 : add $1, $1, $1 0x40000c : ...
...
...
0x40c004 : bne $3, $4, 120
...
Vorhersagegenauigkeit
Annahme unendlich langer Loop, der immer 9 mal und dann einmal nicht durchlaufen wird. Was ist die
Vorhersagegenauigkeit der vorher beschriebenen Branch‐Prediction?
loop: ...
...
bne $1,$2,loop ...
j loop
N‐Bit‐Vorhersage am Beispiel 2‐Bit
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Vorhersagegenauigkeit
Annahme unendlich langer Loop, der immer 9 mal und dann einmal nicht durchlaufen wird. Was ist die
Vorhersagegenauigkeit der vorher beschriebenen 2‐Bit‐Branch‐
Prediction?
loop: ...
...
bne $1,$2,loop ...
j loop
Branch‐Delay‐Slot‐Idee
loop: ...
...
bne $1,$2,loop
<instruktion>
<instruktion>
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
• Wird immer ausgeführt.
• Instruktion muss aber unabhängig von der Branch‐Entscheidung sein.
• Das muss der Compiler entscheiden.
• Im Zweifelsfall: nop passt immer.
Beispiele von Branch‐Delay‐Slot‐Schedules
Weniger Branches mit Conditional‐Instruktionen
Beispiel MIPS‐Instruktionen movn und movz :
movn $8, $11, $4 # $8 = $11, wenn $4 != 0 movz $8, $11, $4 # $8 = $11, wenn $4 == 0 Beispiel ARM‐ISA:
ADDEQ r0,r1,r2 ; If zero flag set then…
; ... r0 = r1 + r2
Quiz
Betrachte die folgenden Branch‐Strategien:
1. Vorhersage Branch findet statt
2. Vorhersage Branch findet nicht statt
3. Dynamische Branch‐Vorhersage (mit 90% Genauigkeit) Was ist die beste Strategie, wenn:
• Branch findet mit 5% Häufigkeit statt?
• Branch findet mit 95% Häufigkeit statt?
• Branch findet mit 70% Häufigkeit statt?
Multiple‐Issue
Motivation
• Bisher: Instruction‐Level‐Parallelism (ILP) durch Pipelining
– ILP kann durch Pipeline‐Stufe erhöht werden
– Pipelines mit mehr Stufen sind anfälliger gegenüber Data‐ und Control‐
Hazards
– Also: Pipeline‐Stufen nur bis zu gewisser Tiefe sinnvoll – Außerdem: Grenzen aufgrund der Leistungsaufnahme
– CPI bleibt gleich oder steigt sogar (wegen Hazards), Clock‐Rate steigt
• Hier eine weitere Methode um ILP zu steigern: Multiple‐Issue
– Replikation von internen CPU‐Strukturen, sodass mehrere Instruktionen pro Pipeline‐Stufe möglich sind
– CPI sinkt und Clock‐Rate bleibt gleich (oder sinkt sogar wegen erhöhter Komplexität)
– Beispiel: CPI eines 4‐Wege‐Multiple‐Issue‐Mikroprozessor hat eine ideale CPI von? 0.25!
– CPI liegt aber in der Regel höher, wie wir gleich sehen werden
• Wir unterscheiden zwischen:
– Static‐Multiple‐Issue: Entscheidungen werden zur Compile‐Zeit gefällt
– Dynamic‐Multiple‐Issue: Entscheidungen werden zur Laufzeit gefällt
Multiple‐Issue
Static‐Multiple‐Issue
Generelle Idee
• Eine große Instruktion pro Clock‐Cycle
• Große Instruktion besteht aus mehreren gleichzeitig stattfindenden Operationen
• Aber nicht jede Kombination von Operationen möglich
• Beispiel:
– ALU‐Operation und Speicheroperation gleichzeitig möglich
– Aber zwei ALU‐Operation auf einmal nicht möglich
• Terminologie: VLIW (Very Long Instruction Word)
Beispiel am MIPS‐Datenpfad
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Extra ALU für gleichzeitige Adresskalkulation
ALU für arithmetische
Operationen
Statische Two‐Issue Pipeline im Betrieb
Was ist der CPI‐Wert?
Was ist nun die Aufgabe des Compilers?
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012