Kapitel 8 - Superskalarität
- Was ist Dynamic Scheduling?
- Wie funktioniert Out-Of-Order Execution?
- Was heißt Multiple-Issu?
- Wie arbeitet spekulative Befehlsausführung?
- Wie arbeiten Tomasulo und VLIW-Prozessoren?
|
Was bedeutet superskalar?
Mit normalen Pipelines (Überlappen von Instruktionen) ist nur eine maximale
Performance von einem Befehl / Takt technisch und theoretisch möglich. Um diese
Grenze zu unterschreiten, ist Parallelität auf Befehlsebene (Instruction Level
Parallelism) notwendig. Dies bedeutet das der typische Risc-Prozessor, um Einiges
erweitert werden muss:
- Prozessor muss in der Lage sein, mehrere Befehle gleichzeitig pro Takt zu
laden
- Branches dürfen möglichst nicht zur Behinderung des Befehlsflusses führen
(deshalb Sprungvorhersage)
- Datenabhängigkeiten treten hier in erhöhtem Maße auf und müssen behandelbar
sein
- um echte Datenabhängigkeiten auflösen zu können, is Out-Of-Order Ausführung
mit anschließender "Sortierung" notwendig
Dynamic Scheduling
Static Scheduling nutzt lediglich Compilertechniken zur Separierung
unabhängiger Befehle und ist sehr unflexibel. Beim Dynamic Scheduling wird durch
Präsenz mehrerer paralleler Buffer und Execution Units versucht, Ressourcen- und
Datenkonflikte zu eliminieren.
Out-Of-Order Execution
In-Order-Issue Pipes müssen, falls ein Befehle gestoppt wird, alle
Folgebefehle warten. Durch eine zusätzliche Hardware, welche das Umordnen der
Befehlsausführung zur Laufzeit vornimmt, kann dies verhindert werden. Möglichkeiten
dafür sind Scoreboards oder Tomasulo.
Was ist das Problem des Präzisen Zustandes?
Das Prinzip des Präzisen Zustandes besagt, daß bei Unterbrechungen
(Interrupts, Exeptions) der Zustand der CPU sicherbar und wiederherstellbar sein
muss. Dieses Konzept muss auch bei superskalaren Architekturen gelten. Dies ist in
superskalaren Architekturen weitaus aufwendiger und bedarf zusätzlicher Hardware.
Welche Entwurfskriterien sind zu betrachten?
- Stategien zum holen mehrerer Instruktionen pro Takt (und Einfluss von
Branches)
- Methoden zum Auffinden von Datenabhängigkeiten zwischen Registerinhalten
- Methoden zum Aussenden (Issue) mehrerer Befehle gleichzeitig
- Ressourcen zur paralellen Ausführung (mehrere Ausführungseinheiten und
Zwischenbuffer)
- Ausführung mehrerer LOAD/STORE-Pipelines in enger Abstimmung mit
Ausführungseinheiten (LOAD/STORE Instruktionen müssen entkoppelt auf Grund der
verschiedenen Latenzzeiten ablaufen können)
- Methoden zur Bestimmung der korrekten Ausführungsreihenfolge und
Speicherfolge der Register
Superskalare Prozessoren müssen nicht die Instruktionssequentialität
(siehe out-of-order-execution)einhalten, jedoch immer die
Ergebnissequentialität (siehe in-order-commit).
Superskalar-Prozessoren und VLIW-Prozessoren als Multipe-Issue CPU's
Beide Techniken senden mehr als nur einen Befehl pro Taktzyklus aus und
versuchen so, die CPI unter eins zu drücken. Moderne Prozessoren kombinieren beide
Techniken. Der größte Unterschied zwischen beiden Technologien besteht darin, daß
Very Long Instruction Word basierende Systeme für verschiedene Prozessoren neu
compiliert werden muss. Superskalare-Prozessoren sind dagegen gleich kompatibel.
Was heißt Multiple-Issu?
Ist das Mehrfach-Aussenden von Befehlen, welchen gewissen issue criteria
unterliegen müssen. Die folgende Abbildung zeigt das Superskalarprinzip - eine
5-stufige Pipeline mit zweifacher Superskalarität.
Superskalarität mit VLIW
Der IA-64-Befehlssatz von Intel wird auf "Very Long Instruction Words"
basieren. Es werden drei Instruktionen ein einen fetten 128 Bit Befehl gepackt.
Hier besteht nun die Möglichkeit, explizit festzulegen, welche Befehle parallel
abgearbeitet werden sollen bzw. können. So eröffnen sich völlig neue
Optimierungsmöglichkeiten im Compilerbau. Man nennt dieses Prinzip EPIC. Der
Transmeta verwendet auch VLIW. Hier muss aber der Compiler nicht die Optimierungen
vornehmen, da der Transmeta um der Core eine Morphing Softwareebene hat, welche die
Aufteilung in parallel abarbeitbare Befehle ausführt. Dadurch, daß nun explizit
gesagt wird, welche Instruktionen parallel ausführbar sind, ist nun nicht mehr so
viel Chipfläche zum Auflösen von Hazards notwendig und kann z.B. für mehr Register
verwendet werden.
Das Scoreboard
Ein Scoreboard ist eine zusätzliche Steuereinheit, welche die Verantwortung
für das Befehlsaussenden und das Erkennen von Konflikten trägt. Das Scoreboard
wählt aus einem Pool potentiel ausführbarer Befehle (Instruction Window) einen Satz
von Befehlen aus. Ein Register wird als ungültig markiert, wenn die Dekodiereinheit
erkannt hat, dass ein Befehl sein Ergebnis in dieses Register schreiben möchte. So
wird verhindert, dass ein anderer Befehl dieses Register liest, solange es ungültig
ist. Nachteil ist, daß keine Ressourcen- und auch keine Datenabhängigkeiten
auftreten dürfen. Eine bessere Variante ist die Tomasulo-Methode, welche eine
Auflösung von WAR- und WAW-Konflikten ermöglicht.
Zusammenfassend gesagt, besteht ein Scoreboard aus einer Vielzahl von Zählern (wie
oft wurde gelesen und geschrieben) für die verwendeten Register und
Funktionseinheiten. Ein Scoreboard, welches auch WAR und WAW Konflikte lösen kann,
wäre zwar extrem aufwendig aber möglich.
Wann können Befehle mit der Scoreboard Technik nicht ausgesandt werden?
- Wenn ein aktueller Operand geschrieben wird (RAW)
- Wenn das Ergebnisregister gelesen wird (WAR)
- Wenn das Ergebnisregister geschrieben wird (WAW)
WAR und WAW sind weniger schwerwiegend als RAW Abhängigkeiten, da diese nur
Ressourcenkonflikte darstellen. RAW Konflikte logische Abhängigkeiten und können
nicht so einfach aufgelöst werden. Mit der Scoreboard Methode muss gewartet werden,
bis der abhängige Vorgängerbefehl sein Ergebnis geschrieben hat. Erst dann kann der
Folgebefehl das benötigte Datum lesen und mit der Abarbeitung fortsetzen. Lösen
lassen sich alle Probleme mit Out-Of-Order Execution und Register
Renaming Technik. Dazu muss das Scoreboard erweitert werden.
Die Tomasulo-Methode
Hauptidee sind hier sogenannte Reservation Stations, welche eine Art
Zwischenpuffer für Operanden darstellen. Die Reservation Stations besitzen eine
eindeutige ID, welche jedem Befehl mitgegeben wird. So kann die richtige
Reihenfolge beibehalten werden. Wird ein Befehl ausgeführt, arbeitet dieser nicht
auf den eigentlichen Registern, sondern auf den assoziierten Reservation Stations,
was das Prinzip des schon erwähnten Register Renamings ist. Über einen Common Data
Bus werden die Ergebnisse zu allen beteiligten Einheiten gebroadcaset. Reservation
Stations erkennen Hazards und können selbst entscheiden, wann sie den dazugehörigen
Befehl ausführen. Nämlich erst dann, wenn alle Operanden vorliegen. Um controll
stalls komplett vermeiden zu können, wird die Tomasulo-Methode mit der
spekulativen Befehlsausführung kombiniert.
Wie arbeitet die spekulative Befehlsausführung?
Sprungziel-Befehle werden schon ausgeführt, wenn das Ergebnis des Sprungtests
noch gar nicht vorliegt. Somit muss es die Möglichkeit geben, bei falscher
Vorhersage alle Änderungen zu Verwerfen (Rollback-Fähigkeit). Die
Hauptsächliche Hardware-Erweiterung liegt in der Aufspaltung der
Ergebnisschreibphase in eine Bereitstellungsphase mit Zwischenspeicherung im
Reorder Buffer und eine Phase in der ein Befehl commited, d.h. gänzlich der
Ausführung übergeben wird. Ein commit bedeutet, daß eine eventuelle
Sprungvorhersage richtig war! Somit stellt dies eine Kombination von
out-of-order-execution via Tomasulo mit einem erzwungenen in-order-commit
dar.
Der Reorder-Buffer stellt in der Welt des Tomasulo weitere Register zur
Verfügung, welche auch die Funktion von Store Buffern übernehmen könnten, so daß
dieser als Teil des Tomasulo nicht direkt mehr erkennbar wäre. (Store Buffer
enthalten Informationen darüber, welche Reservation Stations, welches Ergebnis
erwartet)
Aus welchen Feldern setzt sich ein Reorder-Buffer-Eintrag zusammen?
- Befehlstyp (Branch, Store oder Registeroperaton)
- Zielfeld (Registernummer oder Speicheradresse)
- Datenfeld (Ergebnis der Operation)
Die Phasen des Tomasulo
|
Fetch und Decode
|
Holt Instruktionen in einen Befehlscache. Die Decode-Unit holt sich einen
Teil der Befehle und versucht mehrere gleichzeitig zu decodieren
(In-Order).
Dabei wird versucht Sprünge vorherzusagen.
Übergibt dekodierten Befehle in der richtigen Reihenfolge an die Dispatch
(Issue) Unit.
|
|
Dispatch / Issue
|
Holt dekodierte Befehle aus Befehlspuffer und übergibt sie In-Order an die
Reservation Stations der Execute Units, sobald alle Operanden
verfügbar sind (Issue). Solange im Reorder Buffer Platz ist,
reserviert sie ein Feld für diesen Befehl mit Hilfe des Tags und gibt dieses
an die RS weiter. Wenn nicht wartet sie, bis ein Platz frei wird. (Dispatch
Phase)
|
|
Execution
|
Führt Befehle auf den Schattenregistern aus, um Data Hazards zu meiden.
Befehle werden in den Reorder-Buffer geschrieben und Out-Of-Order
ausgeführt, solange es keine RAW-Konflikte gibt. Nach Beenden eines Befehls
wird Ergebnis an alle RS gebroadcastet, so dass wartende Befehle fortfahren
können.
(Write result)
|
|
Commit
|
Die Commit/Completion oder Retire Einheit schreibt die Ergebnisse aus den
Renaming Registern in die echten ISA Register zurück, nachdem sie
geprüft hat, ob abhängige vorangehende Befehle ihre Ergebnisse geliefert
haben und keine falsche Sprungvorhersage eingetreten war.
|
Erklären Sie die Phasen Issue, Execute, Write Result und Commit!

Die Issue-Phase entnimmt einen Befehl aus dem Befehlsbuffer und versucht
diesen an eine freie Reservation Station zu übergeben. Dabei reserviert sie
einen Platz im Reorder-Buffer und gibt den dazugehörigen Tag an die
Reservation Station. So kann beim Ergebnis-Broadcasting das Ergebnis mit diesem Tag
gekennzeichnet werden. (1)
Sind nun alle notwendigen Operanden vorhanden und keine weiteren RAW-Abhängigkeiten
bestehen, kann der Befehl ausgeführt werden. (Execute-Phase). (2)
Ist das Ergebniss berechnet, wird es auf den CDB gelegt und in den
Reorder-Buffer geschrieben (Write Result). (3)
Der Reorder-Buffer ist als Ringbuffer angelegt, bei dem die Reihenfolge der
Befehle, durch die der erwarteten Ergebnisse (über das verliehene Tag) definiert
wird. Nun werden in der Commit-Phase falsch vorhergesagte Sprünge zurückgesetzt und
es wird bei dem richtigen Nachfolgebefehl fortgesetzt. Das Ergeniss wird in die ISA
Register zurückgeschrieben. (4)
Muliple Issue am Beispiel
Instruktionen werden in eine oder mehrere Mikrooperationen dekodiert und in
eine Warteschlange gestellt. Sprungerkennung erfolgt erst statisch und dann
dynamisch mit 4 History Bits (da siebenstufige Decode-Pipeline!). Dann werden
Register im Reorder-Buffer (der P4 hat Platz für 40 µOps) zugewiesen. Dabei
werden um Konflikte zu vermeiden Renaming-Register (Schattenregister)
eingesetzt. In der Execute Phase werden Mikrooperationen aus dem Reorderbuffer
entnommen und spekulativ ausgeführt.
Es wird ein komplexes Scoreboard verwendet, um aktive Operationen und
Register zu verwalten. Falls mehrere Mikrooperationen bereit sind, wählt ein
Algorithmus den nächst Wichtigsten aus (z.B. Sprünge).
Mikrooperationen deren Operanden alle verfügbar sind, werden in die Reservation
Stations geschrieben, welche 20 solcher Einträge aufnehmen kann. Dort warten
die Ops, bis eine entsprechende Ausführungseinheit frei wird.
Die Execute-Units haben fünf Ports, um Operationen auszuführen. Manche
Ausführungseinheiten teilen sich einen Port (FPU,MMX).
Die Retire (Completion) Einheit sendet fertige Ergebnisse an die richtige Stelle.
Der P2 unterstützt speculative execution. Falls begonnene Instruktionen nicht mehr
benötigt werden, wird die Rollback Fähigkeit genutzt.
Der Pentium 4 nutzt einen Trace Cache für die letzten drei dekodierten
Befehle. Im Hit Falle, bedient sich die Execution Unit direkt dieser Befehle, was
vor allem bei Schleifen einen beträchtlichen Speedup bringt.
Die UlraSparc 2 ist dagegen eine reine Risc Maschine mit vierfachen statt 2facher
Superskalarität. Durch das Risc Prinzip müssen hier Instruktionen nicht in mehrere
Mikrooperationen umgesetzt werden. Desweiteren unterstützt die meist gleich große
Befehlslänge das Pipelining besser, als die z.T. komplexeren Cisc Befehle des
Pentium.
Neu ist das so genannte Folding der PicoJava CPU, welche Instruktionen faltet, d.h.
zusammenfasst und gleiche Instruktionen in einem Zyklus (auf verschiedenen
Registern) abarbeiten kann. ( 5 x schneller als P2, obwohl auch CISC)
- Auflösung von RAW durch Out-Of-Order Ausführung möglich
- WAW und WAR Konflikte durch Register Renaming auflösbar
- Tomasulo liegt Idee der Reservation Stations zu Grunde
- Tomasulo wird zusammen mit Spekulativer Ausführung angewandt
- Meist vier Phasen, wie Fetch/Decode, Issue, Execute und Commit
Merktabelle: Superskalarität
Wie werden Unterbrechungsanforderungen gehandhabt?
Bei Interrupts muss sichergestellt werden, daß nach Abarbeitung der
Unterbrechung, die CPU wieder in einen sicheren (präzisen) Zustand zurückkehren
kann.
Das erste Verfahren benutzt Checkpoints, an denen der tatsächliche Zustand der CPU
ein Update erfährt und der bisherige in einen History-Buffer gelegt wird. Somit ist
jederzeit ein präziser Zustand wiederherstellbar (Recovery), wobei
innerhalb der Commit-Phase nur der korrekte Zustand hergestellt werden muss und die
nicht weiter benötigten aus dem Historybuffer wieder entfernt werden.
Das zweite Verfahren wird dem Ersten oft bevorzugt. Es steht eng mit der Verwendung
des Reorder-Buffers in Verbindung. Dabei wird der Zustand des Rechners in zwei
aufgeteilt:
- einen Physikalischen Zustand, der bei jeder ausgeführten Instruktion gesetzt
wird
- und einem architekturellen Zustand, welcher erst beschrieben wird, wenn ein
eventueller spekulativer Status geklärt wurde
Während der Commit-Phase, wird der spekulative Zustand in den architekturellen
(und den physikalischen) übernommen, die Renaming Register des Reorder-Buffers in
die Registerfile geschrieben bzw. die Store-Operation durchgeführt. Dabei wird der
"spekulative Zustand" ebenfalls im Reorder-Buffer mitgeloggt. Erst bei
Zusammenfassung Superskalar-CPU's - dynamic scheduled pinelines
Da das Pipeline Konzept schnell an seine Grenzen gelangt ist, ist eine andere
Methode notwendig. Es muss möglich sein, dass mehrere Befehle pro Takt beendet
werden können und unabhängige Befehle, welche in Pipes wegen vorangehender
Abhängigkeiten warten müssen, in der Ausführungsfolge vorzuziehen. Superskalare
Prozessoren erkennen parallel verarbeitbare Befehle von selbst und benötigen somit
keine speziell optimierenden Compiler, wie sie z.B. VLIW verlangen. Dafür
sind sie weitaus komplexer. Um RAW, WAW und WAR Abhängigkeiten zu vermeiden, wird
versucht Instruktionen anders anzuordnen. Dafür ist ein Scoreboard
notwendig, das für jedes benutzte Register die Leseabhängigkeiten und
Schreibabhängigkeiten zählt.
Der Tomasulo Algorithmus ist ein Verfahren, welches sich durchgesetzt hat,
da es WAW und WAR Konflikte dynamisch auflösen kann. Dies ist so einfach
möglich weil WAW und WAR keine echten Datenabhängigkeiten sind, sondern nur
entstehen, wenn ein späterer Befehl ein Register wiederverwendet, ohne die darin
enthaltenen Daten zu benötigen.
Hier tritt das Register Renaming oder "Arbeiten auf Schattenregistern" in
Kraft. Würde es mehr Register geben, könnten diese Abhängigkeiten schon vom
Compiler aufgelöst werden.
Mit Register Renaming werden intern versteckte Register benutzt, um Abhängigkeiten
aufzulösen.
Spekulative Ausführung wird benutzt um weitere Lücken im Ablauf zu füllen.
Hierbei werden Sprungziel-Befehle gegebenenfalls schon ausgeführt, wenn noch gar
nicht klar ist, ob dieser überhaupt wahr werden. Dies wird meist mit dynamischen
Scheduling nach Tomasulo kombiniert. Falsch vorhergesagte Befehle erreichen nie die
Commit-Phase und werden verworfen. Dies ist möglich, da sich die
Ereignis-Schreibphase in Bypassing (Zwischenspeicherung im
Reorder-Buffer) und dem Rückschreiben auf die echten ISA Register aufteilen
lässt.
Wie können RAW-Konflikte gelöst werden?
RAW Konflikte sind echte Abhängigkeiten und gekönnen nicht aufgelöst werden.
Es kann nur Versucht werden, durch eine Out-Of-Order Ausführung die
Ausführungseinheiten stets gefüllt zu halten, um somit negative Auswirkungen auf
den Befehlsfluss zu minimieren oder zu vermeiden.
|
|
|
|
|
Kapitel 1
|
Einleitung
|
|
Befehlsschleife, Risc und Cisc...
|
|
Kapitel 2
|
Interrupts
|
|
Interrupts, Polling, DMA...
|
|
Kapitel 3
|
Speicherschutz
|
|
Segmentation, Paging, Mapping, Multitasking...
|
|
Kapitel 4
|
Caches
|
|
Lokalität, Cache-Arten, Schreibstrategien...
|
|
Kapitel 5
|
Risc
|
|
Risc-Architektur, Load/Store, Registerfenster...
|
|
Kapitel 6
|
Pipelining
|
|
Prinzip, Datenkonflikte, Forwarding, Delayed Load
|
|
Kapitel 7
|
Branch Prediction
|
|
Statische / Dynamische Brach-Prediction...
|
|
Kapitel 8
|
Superskalarität
|
|
Out-Of-Order Execution, Scoreboard und Tomasulo, VLIW...
|
|
Kapitel 9
|
Parallelrechner
|
|
SMP,Vektorrechner, Cache-Kohärenz
|
|
|
|
|
|
|
Quellen:
|
Andrew S. Tanenbaum
Computerarchitektur
|
Andrew S. Tanenbaum
Moderne Betriebssysteme
|
Petterson
Computer Architectur & Design
|
Christian Märtin
Rechnerarchitekturen
|
Rehm
Skript und Vorlesung
|
Word Wide Web
Verschiedenste Seiten
|
|
|
|
|