/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-11-2021-07-05/informatik-math/mips/mips-7.txt


1. Einzyklus
2. Mehrzyklus
3. Überlappende Abarbeitung (Pipelining)


Einzyklus:
1. Befehl holen
2. Befehl dekodieren

Überlappende und taktsynchrone Verarbeitung

Die Stufen sind voneinander getrennte Schaltnetze

Pipeline-Stufe, Pipeline-Phase: Kombinatorische Schaltnetze

Pipeline-Stufen sind über Pipeline-Register voneinander getrennt

Pipeline-Register: Nicht sichtbare Puffer-Register 

Schaltnetze Si

Die Pipeline-Register werden om selben Taktsignal gesteuert und arbeiten synchron

Je nach Tiefe und Gatter-Anzahl = Schaltnetz hat verschiedene Verzögerungszeiten 

Da synchron: Muss gewartet werden. Das Schaltnetz mit längster Verzögerungszeit: Kritischer Pfad

Minimal mögliche Taktperiode 

Latenz einer Pipeline: Anzahl der Takte, die ein Befehl braucht um alle Stufen einer Pipeline zu durchlaufen

k: Anzahl der Pipeline-Stufen 

Durchsatz: Anzahl der Befehle die eine Pipeline pro Takt verlassen können

Prozessor ohne Pipeline: n*k Takte, bei n Befehlen 

k-stufige Pipeline: k+n-1

Beschleunigung - Speedup S = (n*k)/(k+n-1)


Stufen:
1. Befehl holen 
2. Befehl dekodieren
3. Operanden in der ALU bereitstellen
4. Operation in der ALU ausführen bzw. Speicherzugriff
5. Resultat ins Architekturregister zurückschreiben 

MIPS-Pipeline 

IF, ID, EX, MEM, WB


IF-ID: Ir, PC+4
Ir: Befehlsregister

ID-EX: Ai1, Ai2

Ai1, Ai2: ALU-Eingaberegiser

EX-MEM: Ao

ALU-Ausgaberegister: Ao

IF-Phase: Befehl wird von der Befehlsbereitstellungseinheit in die Pipeline geladen: Wird aus dem Code-Cache geladen und in Ir übertragen
Befehlszähler wird um 4 erhöht

ID-Stufe: Befehl wird aus Befehlsregister entnommen und dekodiert
Es werden Steuersignale erzeugt
Es werden Operanden aus dem Registersatz geladen und in Ai1 und Ai2 gespeichert

EX-Phase: Eigentliche Operation in der ALU wird ausgeführt

MEM-Stufe: Für Lade, Speicher und Sprungbefehle

Speicherbefehl: Aus Ao in den Speicher schreiben 
Ladebefehl: Ins Ladewert-Register Lv übertragen 
Sprungbefehl: Sprungziel-Addresse aus Jta in den Befehlszähler 

WB-Phase:
Entweder der Wert des ALU-Ergebnisregister oder des Ladewert-Registers ins Universalregister

Pipeline-Konflikte

Die Situationen die zu Pipeline-Konflikten führen: Pipeline-Hemmisse (Hazards)

Datenkonflikte: Operand noch nicht verfügbar
Das Resultat soll in ein Register geschrieben werden, was noch von einem vorherigen Befehl genutzt wird

Steuerflusskonflikte: Programmsteuerbefehle: Zieladdresse noch nicht berechnet oder nicht klar: Ob überhaupt gesprungen wird

Struktur und Ressourcen-Konflikte 

Befehle, Instructions I1, I2

Datenabhängigkeiten zwischen den Befehlen 

Datenabhängigkeit führt zu Datenkonflikt 

Drei Arten von Datenabhängigkeiten

1. Echte Datenabhängigkeit - True Dependency - Lese-nach-Schreib-Konflikt - Read after Write (RAW)
2. Gegenabhängigkeit - Anti Dependency - Schreibe-nach-Lese-Konflikt Write after Read (WAR)
3. Ausgabeabhängigkeit - Output Dependency - Write after Write - WAW

True - Anti - Output 
RAW WAR WAW

True - RAW
Anti - WAR
Output - WAW 

ED: Echte Datenabhängigkeit 
GA: Gegenabhängigkeit
AA: Ausgabeabhängigkeit

Gegenabhängigkeiten und Ausgabeabhängigkeiten: Scheinbare Datenabhängigkeiten, Name Dependency, Namensabhängigkeit
Sind nicht probelmimmanent

Können durch Variablenumbennenung entfernt werden

Echte Datenabhängigkeiten: Datenabhängigkeiten

Wenn die Befehle nur weit genug entfernt sind, spielen Datenabhängigkeiten keine Rolle

Echte Datenabhängigkeit: Befehle, die in-order ausgeführt werden

I1: $t1 in WB
I2: $t1 in ID

Software-Lösungen: 

1. Einfügen von Leerbefehlen: Fügt entsprechend Leerbefehle ein 
2. Statische Befehlsumordnung 

Hardware-Lösungen: 

1. Lehrlauf der Pipeline
2. Forwarding 
3. Dynamische Befehlsumordnug

Leerlauf der Pipeline: Anhalten der Pipeline 
Datenabhängigkeit muss erkannt werden 

Pipeline-Sperrung, Interlocking, Stalling 
Pipeline-Leerlauf 

Pipeline-Blase (Bubble)

Forwarding: Mehr Aufwand: Wird nicht aus dem Architekturregister sondern direkt aus dem ALU-Ausgaberegister geladen 
Nach WB und in ID

Ao: Nach EX

IF, ID, EX, MEM, WB

$t1: Nach WB

Ao: Nach EX

Da ID auf EX folgt, passt!


Forwarding mit Interlocking


Wie implementieren: Vergleich von Register-Quell und Ziel-Addresse, entsprechend schalten 




Steuerflusskonflikte

Sprungbefehl: Erst nach MEM

Also, drei Takte 

IF, ID, EX, MEM, WB

MEM: Drei Takte 

Software-Lösungen, Steuerflusskonflikte
1. Verzögerte Sprungtechnik: Einfügen von Verzögerungszeitschlitze - Delay Slots
2. Statische Befehlsumordnung: Die Verzögerungszeitschlitze wird vom Compiler mit Befehlen, die in der logischen Reihenfolge vor dem Sprung liegen gefüllt
3. Statische Sprungvorhersage: Bei bedingten Sprüngen: Ausführen oder nicht ausführen 

Keine reine Softwarelösung

Hardware-Lösungen:

1. Pipeline-Leerlauf 
2. Dynamische Sprungvorhersage


DLX: Deluxe von Hennesy und Patterson stark mit MIPS verwandt