Beispielaufgaben zu Pipelines

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Beispielaufgaben zu Pipelines
Ich habe mir einmal zwei Aufgaben zu Pipelines zum Üben gemacht, Vorschlag siehe Anhang. Regeln wie immer. Bed. Sprünge auswertung in der OH Phase, Ubed. Sprünge in der BD Phase.
Würde mich über Feedback (Anmerkugnen zu Fehlern Typos/harte Fehler etc.) sehr freuen.

Attachment:
FiktivePipelines.pdf: https://fsi.cs.fau.de/unb-attachments/post_154734/FiktivePipelines.pdf


Beim schnellen Überfliegen sind mir spontan zwei Sachen aufgefallen:

  • [m]jg[/m] bei Aufgabe 1 sollte im letzten Fall nicht komplett zur Ausführung kommen. Wenn ich es richtig verstanden habe, bedeutet rot, dass der Sprung nicht genommen wird, du führst hier aber - obwohl [m]je[/m] genommen wird, den darauffolgenden noch aus. Das erinnert ehrlich gesagt etwas an spekulative Ausführung und an die Anfang des Jahres bekannt gewordenen Seitenkanalangriffe Spectre und Meltdown :wink:
  • [m]cmp[/m] bei Aufgabe 2 sollte doch im Takt 6 bereits in OH1-Phase sein. Wenn man davon ausgeht, dass von Registern der im gleichen Takt geschriebene Wert wieder gelesen werden kann, sogar schon im Takt 5!

Noch ein Hinweis für die kommende Klausur: Eine solche Aufgabe würde sich an den Übungsaufgaben bzw. der Klausur aus dem Sommersemester 2017 orientieren. Unter anderem wird daher auch MIPS-Assembler und nicht x86-Assembler verwendet.

1 „Gefällt mir“

Erst einmal vielen Dank für deine schnelle Antwort!

Punkt 1. verstehe ich nicht ganz, sehe aber auch, dass in den Zeilen 20/21 ein Fehler ist. Sobald je in BD ist, wird das BH Feld blockiert - es kommen keine neue Befehle rein und wenn klar ist, ob gesprungen wird oder nicht (OH-Phase), wird ein neuer Befehl geladen. Da kein Befehl nach dem Sprung kommt (lend), wird das BH nur mit dem “trivialen” Befehl bzw. dem Nicht-Befehl geladen / leer gelassen.Auf jeden Fall jg fällt aus der Pipeline. Verstehe ich das richtig?

Punkt 2. Ja, das ist ein Fehler. Der ist mir beim Korrekturlesen entgangen, habs nun korrigiert. Vielen Dank!

Korrigiertes pdf im Anhang.

Ansonsten: x86 und MIPS pipelines sollten sich doch gleich verhalten, oder? Sprich, es ist egal, mit welchen Aufgaben man übt, solange man MIPS assembler code lesen/verstehen kann.

Attachment:
FiktivePipelines.pdf: https://fsi.cs.fau.de/unb-attachments/post_154737/FiktivePipelines.pdf


… wurde in deiner neuen Variante behoben.

Vom Prinzip her schon. Es müssen bei x86 aber auch implizite Abhängigkeiten mit dem Flags-Register, das bei bedingten Sprüngen verwendet wird, beachtet werden. Bei MIPS stehen die Registerzugriffe explizit da. (Daher könnte man sagen, MIPS ist einfacher). Und es muss auch immer darauf geachtet werden, wie genau die Pipeline aufgebaut wurde. Wann muss gewartet werden? Wann wird gesprungen? Wann kann man geänderte Registerwerte wieder lesen?


Ich habe mir jetzt einmal die Pipeline Aufgabe der Klausur von SS17 angesehen (MIPS). Aufgabe hat auch ein paar markante Unterschiede im Vergleich zu Altklausuren. Am meisten irritiert, dass es keine Befehl Dekodieren Phase gibt und bei Speicherzugriff nicht klar ist, wie wichtig/relevant dieser ist, (vermutlich nein).
Ich habe mich auch an der Aufgabe probiert, weiß aber nicht, wie ich die Operanden Holen Phase “Warten bei Hazards; Operanden lesen” eindeutig interpretieren soll.

  1. Ich habe die Aufgabe einmal so gehandhabt, dass in Phase 1. auch der Befehl dekodiert wird und feststeht, ob es Abhängigkeiten zwischen dem aktuellen Befehl und einem anderen Befehl in der Pipeline gibt. Z.b. add/inc/sub und einem Vergleichsbefehl. Dementsprechend warte ich bereits in Phase 1.

  2. Ansonsten würde ich erwarten: In einem Takt geht ein beq in Stufe 2., ein neuer Befehl wird in Stufe 1. geladen,
    Sobald für beq alle Abhängigkeiten bereinigt sind, geht es in Stufe 3., Befehlsz. wird aktualisiert und ein neuer Befehl wird in Stufe 1. geladen. Stufe 2. bliebe dann leer.

Attachment:
Klausur_SS17_Pipeline.pdf: https://fsi.cs.fau.de/unb-attachments/post_154740/Klausur_SS17_Pipeline.pdf


Warum also in Phase 1 warten?

Sehe ich auch so.