Der gem5 Simulator bietet die Möglichkeit, die Ausführung auf der virtualisierten Pipeline zu visualisieren. Dazu werden vom Simulator während der Ausführung Debug-Ausgaben gespeichert, die wiederum für die Erstellung einer übersichtlichen Darstellung verwendet werden.
# Superskalare Architekturen
Ziel dieser Aufgabe ist es, dass Sie sich mit der grundlegenden Funktionalität des Pipeline-Viewers vertraut machen. Zu diesem Zweck steht in ILIAS der Quellcode einer einfachen DAXPY-Loop bereit, den sie auf dem Simulator ausführen sollen. Anschließend können sie das tracefile mit dem mitgelieferten pipeview-Tool umwandeln und mit less anschauen.
Vor der Bearbeitung des Blatts ```git pull``` im Verzeichnis mit den Aufgaben ausführen (```parallel_computer_architecture/exercises/``` auf der VM).
## Aufgabe 1: Scoreboarding / Register Renaming
In diesem Übungsblatt wird die out-of-order Ausführung auf der Pipeline der [```O3CPU```](http://www.m5sim.org/O3CPU) genauer betrachtet.
Die Pipeline der ```O3CPU``` hat die folgenden 5 Stufen:
1. Fetch: Holt Befehle aus dem *Instruction Cache*.
2. Decode: Dekodiert Befehle. Kann ausserdem unbedingte, direkte Sprungbefehle ausführen ohne die execute Stufe zu benutzen.
3. Rename: Implementiert dynamisches Register Renaming. Dabei werden die von den Befehlen verwendeten Architektur Register dynamisch auf ein größeres physical Register File abgebildet.
4. Issue/Execute/Writeback: Implementiert eine Variante des aus der vorlesung bekannten Scoreboard-Algorithmus.
5. Commit: Implementiert einen *Inorder Commit*.
Der gem5 Simulator bietet die Möglichkeit, die Ausführung auf der virtualisierten Pipeline zu visualisieren. Dazu werden vom Simulator während der Ausführung Debug-Ausgaben gespeichert, die wiederum für die Erstellung einer übersichtlichen Darstellung verwendet werden. Anschließend können sie das tracefile mit dem mitgelieferten pipeview-Tool umwandeln und mit dem Programm less darstellen.
In der Datei ```mul/multiplication.c``` im Verzeichnis dieses Aufgabenblatts befindet sich ein einfaches Programm, dass die folgende Funktion ausführt.
```{.c}
void mult(int* x, int* y, int a, int n)
{
int i;
for (i = 0; i < n; i++) {
y[i] = x[i] * y[i];
}
}
```
* Kompilieren Sie den Quellcode für den Simulator
* Führen Sie den Simulator aus, so dass die benötigten Ausgaben erzeugt werden:
Achten Sie beim umwandeln des Trace darauf, dass die angebene Cycle Time in Femtosekunden mit der Taktfrequenz der Simulation übereinstimmt. 500 enstpricht 2 GHz.
* Die Visualisierung lässt sich dann wie folgt darstellen:
less -r pipeview.out
Suchen Sie in der Pipelinevisualisierung die eine Ausführung der Schleife die möglichst schnell abläuft.
Ignorieren Sie insbesondere Zeilen die = statt . enthalten.
### Fragen:
1. Wie lange dauert die Ausführung der einzelnen der IEW-Stufe der Pipeline für die verschiedenen
Instruktionstypen.
2. Wo können Sie das verhalten des gem5 Scoreboards, mit der Beschreibung des Scoreboard-Algorithmus aus der Vorlesung in Einklang bringen?
3. Lassen sich einige der Abweichungen durch Register Renaming erklären.
4. Lassen sich einige der Abweichungen erklären, wenn man annimmt, dass die Ausführung in der IEW-Stufe bei ldr Befehlen 3 Takte dauern würde?
### Abgabe:
Antworten auf die Fragen.
## Aufgabe 2: Superskalare Befehlsausführung
Die Pipeline des gem5 lässt sich so konfigurieren, dass nicht nur in der ```Execute Stufe``` Instruktionen parallel ausgeführt werden können.
Dies wird über die width Parameter der einzelnen Stufen gesteuert. Passen Sie das Skript ```pipeline-py``` so an, dass das sich die breite der
Pipeline zwischen 1 und 8 per Kommandozeilenparameter variieren lässt.
Im Unterverzeichnis ```automotive``` finden Sie verschiedene Benchmarkprogramme.
Führen sie die folgenden Benchmarks aus für alle Breiten der Pipeline aus.