Pipelining
Komplexere Pipelines
Komplexere Piplelines
• Pipeline‐Stufen sind nicht auf 5 festgelegt!
• z.B. weitere Unterteilung von IF, ID, EX, MEM, WB – Erlaubt höhere Taktung
– Kann aufgrund der Instruktions‐Komplexität erforderlich sein
– Kann aufgrund von Instruktionen mit zeitlich unbalancierten Stufen erforderlich sein
• Wie „pipelined“ man x86 ISA mit Instruktionslängen zwischen 1 und 17 Bytes?
– Komplexe Instruktionen der x86 ISA werden in Folge von Mikroinstruktionen übersetzt
– Mikroinstruktionssatz ist vom Typ RISC
– Pipelining findet auf den Mikroinstruktionen statt
• Beispiel AMD Opteron X4:
Was das ist sehen wir noch im Kapitel Multiple‐Issue
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Pipeline‐Stufen einiger ausgewählter Prozessoren
Mikroprozesor Jahr Taktrate Pipeline‐Stufen Leistung
Intel 486 1989 25 MHz 5 5 W
Intel Pentium 1993 66 MHz 5 10 W
Intel Pentium Pro 1997 200 MHz 10 29 W
Intel Pentium 4 Willamette 2001 2000 MHz 22 75 W Intel Pentium 4 Prescott 2004 3600 MHz 31 103 W
Intel Core 2006 2930 MHz 14 75 W
UltraSPARC IV+ 2005 2100 MHz 14 90 W
Sun UltraSPARC T1 (Niagara) 2005 1200 MHz 6 70 W
Pipeline‐Stufen sinken wieder?
• Aggressives Pipelining ist sehr Leistungshungrig
• Aktueller Trend eher zu Multi‐Cores mit geringerer Leistungsaufnahme pro Core.
Data‐Hazards
Motivation
Ist die Pipelined‐Ausführung immer ohne Probleme möglich?
Beispiel:
sub $2, $1, $3 and $12, $2, $5 or $13, $6, $2 add $14, $2, $2 sw $15, 100($2)
Also, alle vier nachfolgenden Instruktionen hängen von der sub‐
Instruktion ab.
Annahme:
$2 speichert 10 vor der sub‐Instruktion.
$2 speichert ‐20 nach der sub‐Instruktion.
Betrachten wir die Pipeline:
sub $2, $1, $3 and $12, $2, $5 or $13, $6, $2 add $14, $2, $2 sw $15, 100($2)
Problem Rückwärtsabhängigkeiten
Instr.‐
Zeile
Sollte aus
$2 lesen
Liest aus $2 and
or add sw
Data‐Hazard
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Behandeln von Data‐Hazards mittels Forwarding
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Allgemeine Lösung mittels Forwarding‐Unit
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
0 1 2
0 1 2
WB WB
EX/MEM.Rd
MEM/WB.Rd
Implementation der Forwarding‐Unit
Bemerkungen
Die Bestimmung von ForwardB erfolgt analog. (Übung)
Das Ganze muss noch als Wahrheitstabelle aufgeschrieben und dann als kombinatorische Schaltung realisiert werden.
Wie sieht die Wahrheitstabelle von ForwardA nach voriger
hergeleiteter Vorschrift aus? (Übung) [Tipp: um Platz zu sparen sollte man möglichst viele „don‘t cares“ verwenden.]
Auch mit der Erweiterung auf ForwardB ist die Implementation der Forwarding‐Unit noch unvollständig. Was passiert z.B. für:
lw $2, 0($1) sw $2, 4($1)
Erweiterung: Forwarding muss z.B. auch in die MEM‐Stufe eingebaut werden. (Übung)
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‐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.
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