# Multicore [?] ## Erweiterung Steuerwerk - Zur überlappenden Verarbeitung von Befehlen ### Phasenpipelining - Mehrere Befehle gleichzeitig im Prozessor in Arbeit - in unterschiedlichen Phasen - verwenden unterschiedliche Komponenten des Prozessors - **Je mehr Stufen, desto mehr Befehle gleichzeitig** - desto eher wird CPI = 1 erreicht - Voraussetzung - Anpassung Befehlssatz an Pipelinebedingungen - RISC, Load-Store, Register-Register - Probleme - Steuerungs-, Daten-, strukturelle Konflikte (=Hazards) - **Je mehr Stufen, desto schlimmer ist Leeren und Neustart der Pipeline nach falscher Sprungvorhersage** #### 14-18 Pipelinestufen optimal #### Verfahren zur Lösung der Konflikte - Hardware - Caches, Forwarding, Branch Prediction - Befehlssatzerweiterung - Software - Pipeline-gemäße Sortierung der Befehle durch den Compiler ## Beispiel anhand einer 5-Stufigen Pipeline ![image_532.png](image_532.png) - **Befehlsholphase (IF)** - Lesen des Befehls - separater Speicher von Befehlen und Daten - Vermeidung von Konflikten mit Datenzugriffen - `STR R1, [R2]` bzw `ADD R4, R5, R6` - **Dekodier- / Register-Lese-Phase (ID)** - Lesen der Register - möglich wegen fester Plätze für Registernummern im Befehlswort - `R1, R2` bzw `R5, R6` lesen - **Ausführungs- / Adressberechnungsphase (EX)** - Berechnung arithmetischer Funktionen - `R5 + R6` - bzw. Adresse für Speicherzugriff - `[R2] + 0` - **Speicherzugriffsphase (Mem)** - Wird nur bei Lade- / Speicherbefehlen benötigt - _Abspeichern des Werts R1 an zuvor berechnete Adresse [R2]_ - **Abspeicherungsphase (WB)** - Speichern in Register - Bei Speicherbefehlen (ohne Autoinkrement) nicht benötigt - _Speichern des Ergebnisses der Addition in R4_ - **Reihenfolge ohne Pipelining (3 Befehle)** - ![image_533.png](image_533.png) - **Reihenfolge mit Pipelining (3 Befehle)** - ![image_534.png](image_534.png) - ![image_535.png](image_535.png) ## Pipeline-Konflikte ### Strukturelle Konflikte (structural hazards) - resultieren aus Ressourcenkonflikten - überlappende Instruktionen, die gleiche Ressource benutzen #### Beispiel strukturelle Konflikte - ![image_536.png](image_536.png) - ![image_537.png](image_537.png) - Alternative Darstellung: - ![image_538.png](image_538.png) ### Datenkonflikte (data hazards) - resultieren aus Instruktionen, die von Ergebnissen einer vorigen Instruktion abhängig sind - _bspw. Read-After-Write_ - Instruktion liest aus Register, nachdem eine andere reingeschrieben hat - **Lösung durch Forwarding** - Write-After-Read - Write after Write - 2 Instruktionen haben gleiches Ergebnisregister - WAR / WAW - Konflikte durch Doppelverwendung - können durch mehr Register gelöst werden ### Steuerungskonflikte (control hazards) - resultieren aus Sprüngen - Befehle, die PC verändern - führt zu entleeren der Pipeline und einem erneuten Befüllen - ![image_539.png](image_539.png) ## Sprungvorhersage - Vorhersagen, ob Sprung ausgeführt wird - Falls nicht ausgeführt wird - Pipelinedurchlauf nicht unterbrechen - PC inkrementieren - nächste Instruktion machen - Falls richtig, kann Pipeline normal weiter laufen ### Korrektur Sprungvorhersage ![image_540.png](image_540.png) ### Methoden Sprungvorhersage #### Statisch (vom Computer implementiert) - Default-Annahmen über Sprungverhalten zur Laufzeit - Default not taken - bspw. Verzweigung (Sprung vorwärts) - Default taken - bspw. Schleifen (Sprung rückwärts) - Delayed branches - ersetzen den freien Slot in der Pipeline mit sinnvollen, Sprungunabhängigen Befehlen ### Dynamisch - in Abhängigkeit vom tatsächlichen Verhalten des Sprungs - **Sprungvorhersagepuffer (Branch History Table - BHT)** - ![image_541.png](image_541.png) - Sprungziel muss noch ausgerechnet werden - Kleiner Speicher - wird mit (Teil der) Adresse des Sprungbefehls indiziert - verwendet nur wenige untere Bits der Adresse - Enthält ein Bit - Sprung beim letzten Mal ausgeführt? - **Taken / not Taken** - Vorhersage - Sprung verhält sich wie beim letzten Mal - Nachfolgebefehle - ab vorhergesagter Adresse holen - Falls Vorhersage Falsch - Vorhersagebit invertieren - **Sprungzielvorhersage** - **Branch Target Buffer (BTB)** - ![image_542.png](image_542.png) - Erfolgt in IF-Phase - Verhalten ähnlich eines Caches - adressiert mit Sprungbefehlsadresse - BTB liefer vorhergesagte Adresse als Ergebnis - Keine Verzögerung - WENN KORREKT