This commit is contained in:
David Schirrmeister 2024-07-03 14:56:30 +02:00
parent 1315cb00fc
commit 8bedef57aa
13 changed files with 136 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -69,7 +69,7 @@
<toc-element toc-title="Rechnersysteme">
<toc-element topic="Rechnersysteme_Intro.md"/>
<toc-element topic="Caches.md"/>
<toc-element topic="Multicore.md"/>
</toc-element>
</toc-element>
</toc-element>

View 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
![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