161 lines
3.5 KiB
Markdown
161 lines
3.5 KiB
Markdown
## 📘 **Zusammenfassung: V6 Pipelining Datapath and Control – Computerarchitektur**
|
||
|
||
### 🔁 Wiederholung: Pipelined Datapath
|
||
|
||
- **Pipeline-Register** zwischen Stufen speichern Zwischenergebnisse:
|
||
|
||
- IF/ID, ID/EX, EX/MEM, MEM/WB
|
||
|
||
- **Ziel:** jede Stufe arbeitet gleichzeitig an unterschiedlichen Instruktionen
|
||
|
||
|
||
---
|
||
|
||
### 📦 Pipeline-Steuerung
|
||
|
||
- **Steuersignale** werden wie im Single-Cycle-Design aus dem Opcode abgeleitet.
|
||
|
||
- Vereinfachte & detaillierte Steuerung für jede Pipeline-Stufe:
|
||
|
||
- IF → ID → EX → MEM → WB
|
||
|
||
- Fehlerbehandlung und Hazard-Erkennung notwendig.
|
||
|
||
|
||
---
|
||
|
||
### ⚠️ Data Hazards & Forwarding
|
||
|
||
#### 📦 Beispiel-Hazard
|
||
|
||
```asm
|
||
sub $2, $1, $3 # Ergebnis wird in $2 geschrieben
|
||
and $12, $2, $5 # liest $2 → Hazard
|
||
or $13, $6, $2 # liest $2 → Hazard
|
||
```
|
||
|
||
#### 🛠 Lösungen
|
||
|
||
- **Forwarding (Bypassing):**
|
||
|
||
- Ergebnis wird direkt aus EX/MEM oder MEM/WB weitergeleitet.
|
||
|
||
- **Forwarding-Bedingungen:**
|
||
|
||
- EX-Hazard (vorherige Instruktion schreibt):
|
||
|
||
```
|
||
if EX/MEM.RegWrite && EX/MEM.RegisterRd ≠ 0
|
||
&& EX/MEM.RegisterRd == ID/EX.RegisterRs
|
||
→ ForwardA = 10
|
||
```
|
||
|
||
- MEM-Hazard (vor-vorherige Instruktion schreibt):
|
||
|
||
```
|
||
if MEM/WB.RegWrite && MEM/WB.RegisterRd ≠ 0
|
||
&& MEM/WB.RegisterRd == ID/EX.RegisterRs
|
||
→ ForwardA = 01
|
||
```
|
||
|
||
- **Revised Forwarding:** MEM-Forwarding nur, wenn kein EX-Hazard.
|
||
|
||
|
||
---
|
||
|
||
### 🔁 Load-Use Hazard
|
||
|
||
- Auftritt, wenn Instruktion direkt nach einem Load das geladene Register benötigt.
|
||
|
||
- **Lösung:** 1-Stall-Cycle (Bubble) einfügen.
|
||
|
||
- Erkennung:
|
||
|
||
```
|
||
if ID/EX.MemRead &&
|
||
(ID/EX.RegisterRt == IF/ID.RegisterRs ||
|
||
ID/EX.RegisterRt == IF/ID.RegisterRt)
|
||
→ Stall
|
||
```
|
||
|
||
|
||
---
|
||
|
||
### ⏱ Stalls & Bubbles
|
||
|
||
- **Bubble:** NOP wird in die Pipeline eingefügt
|
||
|
||
- PC und IF/ID-Register werden nicht aktualisiert (Pipeline pausiert)
|
||
|
||
- Compiler kann Code oft umsortieren, um Stalls zu vermeiden.
|
||
|
||
|
||
---
|
||
|
||
### 🔥 Branch Hazards & Lösungen
|
||
|
||
#### ⏳ Problem:
|
||
|
||
- Branch-Entscheidung erst in MEM-Stufe bekannt → falsche Befehle im IF
|
||
|
||
|
||
#### 🛠 Lösungen:
|
||
|
||
1. **Early Branch Resolution:**
|
||
|
||
- Zieladresse & Vergleich schon in ID berechnen
|
||
|
||
2. **Flush Pipeline:**
|
||
|
||
- Falls Branch genommen → falsche Instruktionen entfernen
|
||
|
||
3. **Branch Prediction:**
|
||
|
||
- **Static Prediction:**
|
||
|
||
- Rückwärts: taken (Schleifen)
|
||
|
||
- Vorwärts: not taken
|
||
|
||
- **Dynamic Prediction:**
|
||
|
||
- **1-Bit Predictor:** einfache Historie
|
||
|
||
- **2-Bit Predictor:** robuster gegen wiederholte Fehleinschätzungen
|
||
|
||
- **Branch Target Buffer (BTB):**
|
||
|
||
- Cache für Zieladressen
|
||
|
||
|
||
---
|
||
|
||
### 📐 Visualisierung
|
||
|
||
- **Multi-Cycle-Diagramme:** Ressourcen-Nutzung über Zeit
|
||
|
||
- **Single-Cycle-Diagramme:** Pipeline-Zustand zu einem Takt
|
||
|
||
|
||
---
|
||
|
||
### 📊 Performance-Effekte
|
||
|
||
- Forwarding & Prediction minimieren Stalls
|
||
|
||
- Dennoch: Stalls notwendig für Korrektheit
|
||
|
||
- Compiler kann helfen: **Instruction Scheduling**
|
||
|
||
|
||
---
|
||
|
||
### 📝 Für die Klausur merken
|
||
|
||
✅ Pipeline-Register & ihre Funktion
|
||
✅ Forwarding vs. Stalling: Bedingungen & Hardwarelogik
|
||
✅ Load-Use Hazard: Erkennung & Behebung
|
||
✅ Branch Hazards: Static & Dynamic Prediction, BTB
|
||
✅ Unterschied Multi- und Single-Cycle-Diagramme
|
||
|
||
--- |