Nicht auflösbare Data‐Hazards
Nicht jeder Data‐Hazard lässt sich durch Forwarding
auflösen. Beispiel: Zugriff auf vorher gelesenes Register.
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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‐Ergebins 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.
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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?
Lässt sich das Verbessern?
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
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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 Erinnerung 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
(auch Superskalare CPU bezeichnet)
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
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
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
Loop: lw $t0, 0($s1) # $t0=Array-Element addu $t0, $t0, $s2 # addiere Wert
sw $t0, 0($s1) # Speichere Element addi $s1, $s1, -4 # nächstes Element bne $s1, $zero, Loop # solange $s1 != 0 Compiler erzeugt Assembler‐Code:
und ordnet Instruktionen so an, dass keine Pipeline‐Stalls entstehen
Was ist der CPI‐Wert?
Verbesserung: Loop‐Unrolling
Loop: lw $t0, 0($s1) # $t0=Array-Element addu $t0, $t0, $s2 # addiere Wert
sw $t0, 0($s1) # Speichere Element addi $s1, $s1, -4 # nächstes Element bne $s1, $zero, Loop # solange $s1 != 0 Code wie vorher (der Einfachheit sei Loop‐Index Vielfaches von 4):
Loop‐Body vier mal kopiert und Register‐Renaming
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Was ist der CPI‐Wert?
Multiple‐Issue
Dynamic‐Multiple‐Issue
Generelle‐Idee
• CPU entscheidet, ob und wie viele aufeinander folgende Instruktionen parallel gestartet werden können
• Compiler erzeugt nur eine Folge von Instruktionen; kein VLIW
• Instruktions‐Scheduling des Compilers nicht mehr erforderlich aber trotzdem aus Performance‐
Gründen sinnvoll
• Verbesserung der Superskalarität durch dynamisches Pipeline‐Scheduling:
Instruktionsreihenfolge darf geändert werden, um
Stalls zu vermeiden
Dynamic‐Pipeline‐Scheduling Motivation
lw $t0, 20($s2) # zunächst $t0 laden
addu $t1, $t0, $t2 # addu durch lw verzögert sub $s4, $s4, $t3 # sub könnte schon starten slti $t5, $s4, 20 # und genau so auch slti
Warum nicht sub (und ggf. slti) vor addu vorziehen?
Dynamic‐Pipeline‐Scheduling generell
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Wiedervorlage: Daten einiger ausgewählter Prozessoren
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012