4.5 KiB
4.5 KiB
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
- Anpassung Befehlssatz an Pipelinebedingungen
- 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
-
Befehlsholphase (IF)
- Lesen des Befehls
- separater Speicher von Befehlen und Daten
- Vermeidung von Konflikten mit Datenzugriffen
STR R1, [R2]
bzwADD R4, R5, R6
-
Dekodier- / Register-Lese-Phase (ID)
- Lesen der Register
- möglich wegen fester Plätze für Registernummern im Befehlswort
R1, R2
bzwR5, R6
lesen
- Lesen der Register
-
Ausführungs- / Adressberechnungsphase (EX)
- Berechnung arithmetischer Funktionen
R5 + R6
- bzw. Adresse für Speicherzugriff
[R2] + 0
- Berechnung arithmetischer Funktionen
-
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
- Speichern in Register
-
Reihenfolge ohne Pipelining (3 Befehle)
-
Reihenfolge mit Pipelining (3 Befehle)
Pipeline-Konflikte
Strukturelle Konflikte (structural hazards)
- resultieren aus Ressourcenkonflikten
- überlappende Instruktionen, die gleiche Ressource benutzen
Beispiel strukturelle Konflikte
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
- Instruktion liest aus Register, nachdem eine andere reingeschrieben hat
- Write-After-Read
- Write after Write
- 2 Instruktionen haben gleiches Ergebnisregister
- WAR / WAW
- Konflikte durch Doppelverwendung
- können durch mehr Register gelöst werden
- Konflikte durch Doppelverwendung
- bspw. Read-After-Write
Steuerungskonflikte (control hazards)
- resultieren aus Sprüngen
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
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)
- Default not taken
- 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)
- 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
- Sprung beim letzten Mal ausgeführt?
- Vorhersage
- Sprung verhält sich wie beim letzten Mal
- Nachfolgebefehle
- ab vorhergesagter Adresse holen
- Falls Vorhersage Falsch
- Vorhersagebit invertieren
- wird mit (Teil der) Adresse des Sprungbefehls indiziert
- Sprungzielvorhersage