update
BIN
Writerside/images/image_532.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
Writerside/images/image_533.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
Writerside/images/image_534.png
Normal file
After Width: | Height: | Size: 6.7 KiB |
BIN
Writerside/images/image_535.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
Writerside/images/image_536.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
Writerside/images/image_537.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
Writerside/images/image_538.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
Writerside/images/image_539.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
Writerside/images/image_540.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
Writerside/images/image_541.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Writerside/images/image_542.png
Normal file
After Width: | Height: | Size: 28 KiB |
@ -69,7 +69,7 @@
|
|||||||
<toc-element toc-title="Rechnersysteme">
|
<toc-element toc-title="Rechnersysteme">
|
||||||
<toc-element topic="Rechnersysteme_Intro.md"/>
|
<toc-element topic="Rechnersysteme_Intro.md"/>
|
||||||
<toc-element topic="Caches.md"/>
|
<toc-element topic="Caches.md"/>
|
||||||
|
<toc-element topic="Multicore.md"/>
|
||||||
</toc-element>
|
</toc-element>
|
||||||
</toc-element>
|
</toc-element>
|
||||||
</toc-element>
|
</toc-element>
|
||||||
|
135
Writerside/topics/RA/Multicore.md
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
# 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
|
||||||
|

|
||||||
|
- **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)**
|
||||||
|
- 
|
||||||
|
- **Reihenfolge mit Pipelining (3 Befehle)**
|
||||||
|
- 
|
||||||
|
- 
|
||||||
|
|
||||||
|
## Pipeline-Konflikte
|
||||||
|
### Strukturelle Konflikte (structural hazards)
|
||||||
|
- resultieren aus Ressourcenkonflikten
|
||||||
|
- überlappende Instruktionen, die gleiche Ressource benutzen
|
||||||
|
|
||||||
|
#### Beispiel strukturelle Konflikte
|
||||||
|
- 
|
||||||
|
- 
|
||||||
|
- Alternative Darstellung:
|
||||||
|
- 
|
||||||
|
|
||||||
|
### 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
|
||||||
|
- 
|
||||||
|
|
||||||
|
## 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)
|
||||||
|
- 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**
|
||||||
|
- Vorhersage
|
||||||
|
- Sprung verhält sich wie beim letzten Mal
|
||||||
|
- Nachfolgebefehle
|
||||||
|
- ab vorhergesagter Adresse holen
|
||||||
|
- Falls Vorhersage Falsch
|
||||||
|
- Vorhersagebit invertieren
|
||||||
|
- **Sprungzielvorhersage**
|
||||||
|
- **Branch Target Buffer (BTB)**
|
||||||
|
- 
|
||||||
|
- Erfolgt in IF-Phase
|
||||||
|
- Verhalten ähnlich eines Caches
|
||||||
|
- adressiert mit Sprungbefehlsadresse
|
||||||
|
- BTB liefer vorhergesagte Adresse als Ergebnis
|
||||||
|
- Keine Verzögerung
|
||||||
|
- WENN KORREKT
|
||||||
|
|
||||||
|
|