Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

CPI Der einzelne Befehl braucht immer noch 5 Zyklen (stimmt nicht ganz, einige brauchen weniger!) Was verbessert wird, ist der Durchsatz = #Befehle /

Ähnliche Präsentationen


Präsentation zum Thema: "CPI Der einzelne Befehl braucht immer noch 5 Zyklen (stimmt nicht ganz, einige brauchen weniger!) Was verbessert wird, ist der Durchsatz = #Befehle /"—  Präsentation transkript:

1 CPI Der einzelne Befehl braucht immer noch 5 Zyklen (stimmt nicht ganz, einige brauchen weniger!) Was verbessert wird, ist der Durchsatz = #Befehle / Zeit Neue definieren: CPI = 1/ Durchsatz = Zeit / #Befehle (Zeit in Takten)

2 Pipelining: Speedup bei ideal gefüllter Pipeline(1)
Annahmen: Abarbeitungszeit eines Befehls ohne Pipelining in k Phasen, jede Phase braucht 1 Zyklus Beschleunigung bei m auszuführenden Befehlen: m = 1: Laufzeit mit Pipeline = k * 1/k = k  keine Beschleunigung m = 2: Laufzeit mit Pipeline = k + 1  Beschleunigung um Faktor 2 k / (k+1) Kap. 3

3 Pipelining: Speedup bei ideal gefüllter Pipeline (2)
m  1: Laufzeit ohne Pipeline = m k Laufzeit mit Pipeline = (m-k+1) + 2 (k-1) = m + k -1,  Beschleunigung (Speedup) um Ergebnis: Für m >> k nähert sich der Speedup also der Anzahl k der Pipelinestufen. Kap. 3

4 Pipelining: Hazards Pipeline kann nicht in jedem Takt einen Befehl ausführen. Grund: Hazards Typen von Hazards: Cache Misses, z.B. Instruction-Fetch Miss Datenabhängigkeiten (data hazards) – benötigter Operand ist noch nicht berechnet, Ressourcen-Konflikte (resource hazards) – mehrere Befehle in der Pipeline brauchen in einem Zyklus dieselbe Ressource, bedingte Sprünge (control hazards) – Fortsetzung noch unklar.

5 Pipelining: Hazards Datenabhängigkeiten (data hazards): Befehlsfolge:
1. LOAD R0, 5, R1; // Adresse = Inhalt von Register R0 + 5, // lade Speicherinhalt an Adresse in Register R1 2. ADD R1, R2, R3; // Addiere Inhalte der Register R1, R2, // speichere Ergebnis in R3 ab. 3. SUB R4, R5, R6; // Subtrahiere Inhalt von R5 von R4, Erg. in R6 4. MUL R7, R8, R9; // Multipliziere Inhalt von R8 und R7, Erg. in R9 Problem: Der Wert in R1 steht dem ADD-Befehl nicht rechtzeitig zur Verfügung, falls man die Pipeline nicht stoppt. Kap. 3 5 5

6 Pipelining: Hazards Takt Befehlholen Decodieren/ Ausführen Abspeichern Operand holen LOAD ADD LOAD SUB ADD LOAD MUL SUB ADD LOAD MUL SUB ADD Problem: In Takt 3 ist Register R1 noch nicht mit dem richtigen Wert belegt! Nehme 4 Pipelinestufen an: Operandholen  Operand holen

7 Pipelining: Hazards Lösung 1: Einfügen von NOPs (NOP = no operation) Takt Befehlholen Decodieren/ Ausführen Abspeichern Operand holen LOAD NOP LOAD NOP NOP LOAD ADD NOP NOP LOAD SUB ADD NOP NOP Jetzt korrekt: In Takt 4 wurde R1 korrekt belegt und in Takt 5 der richtige Operand aus Register R1 geladen!

8 Pipelining: Hazards Beobachtung: 1 NOP kann eingespart werden, wenn das Ergebnis des LOAD-Befehls nach der Execute-Phase direkt der ALU zur Verfügung gestellt wird, um den ADD-Befehl auszuführen. Takt Befehlholen Decodieren/ Ausführen Abspeichern Operand holen LOAD NOP LOAD ADD NOP LOAD SUB ADD NOP LOAD MUL SUB ADD NOP Aber: Dazu ist Zusatzhardware nötig, die diese Datenabhängigkeiten erkennt und das „Forwarding“ durchführt! Linie verschoben

9 Forwarding: „Zusatzleitungen“
Daten werden ohne Umweg über die Register direkt an die ALU gelegt e g i s t r 1 R a d 2 6 S n x W A D m o y L U u l M Z I F : c f h / E X x e c u t e / M E M : M e m o r y a c c e s s W B : W r i t e b a c k a d d r e s s c a l c u l a t i o n I n s t r u c i o m e y A d 4 3 2 l S h f M x 1 P C W a R g

10 Pipelining: Hazards Neue Befehlsfolge:
Lösung 2: Umordnen von Befehlen 1. LOAD R0, 5, R1; // Adresse = Inhalt von Register R0 + 5, lade // Speicherinhalt an Adresse in Register R1 2. ADD R1, R2, R3; // Addiere Inhalte der Register R1, R2, // speichere Ergebnis in R3 ab. 3. SUB R4, R5, R6; // Subtrahiere Inhalt von R5 von R4, Erg. in R6 4. MUL R7, R8, R9; // Multipliziere Inhalt von R8 und R7, Erg. in R9 Neue Befehlsfolge: 1. LOAD R0, 5, R1; 2. SUB R4, R5, R6; 3. MUL R7, R8, R9; 4. ADD R1, R2, R3; Wichtig: Umordnen nicht beliebig möglich (Datenabhängigkeiten beachten!)

11 Pipelining: Hazards Lösung 2: Umordnen von Befehlen Takt Befehlholen Decodieren/ Ausführen Abspeichern Operand holen LOAD SUB LOAD MUL SUB LOAD ADD MUL SUB LOAD ADD MUL SUB Jetzt korrekt: In Takt 4 wurde R1 korrekt belegt und in Takt 5 der richtige Operand aus Register R1 geladen!

12 Pipelining: Hazards Bedingte Verzweigungen (control hazards):
Befehlsfolge: 1. ADD R1, R2, R3; // Addiere Inhalte der Register R1, R2, Erg. in R3 2. JMP>0 R4 <label>; // Wenn Inhalt von R4 > 0, springe zu // Programmzeile <label> 3. MUL R5, R6, R7; // Multipliziere Inhalt von R5 und R6, Erg. in R7 <label>: Problem: Die Ausführung des MUL-Befehls wird angefangen, bevor die Sprungbedingung ausgewertet wurde. Mögliche Lösung: Branch Prediction „Raten“ der nächsten Instruktion (z.B. durch Analysen der Häufigkeit des einen oder anderen Ausgangs der Abfrage) Spekulativer Sprung Leeren der Pipeline und „Rücksetzen“ bei falscher Vorhersage

13 Zusammenfassung Beschleunigung um bis zu Faktor k durch Einsatz einer Pipeline (k = Anzahl der Pipeline-Stufen). Hazards verringern die Beschleunigung. Viele Möglichkeiten (z.T. in Hardware) Hazards zu vermeiden Softwaremäßig: NOPs Umstellen der Instruktionen eines Maschinenprogramms durch Code-optimierende Compiler Hardwaremäßig: Forwarding Branch Prediction (Hardware merkt sich, ob bei den letzten Ausführungen des bedingten Sprungbefehls verzweigt wurde oder nicht) Kap. 3


Herunterladen ppt "CPI Der einzelne Befehl braucht immer noch 5 Zyklen (stimmt nicht ganz, einige brauchen weniger!) Was verbessert wird, ist der Durchsatz = #Befehle /"

Ähnliche Präsentationen


Google-Anzeigen