Hi,
Ich bereite mich gerade auf die mündliche Prüfung bei Lehmann vor und bin gerade bei Pipelining.Ich habe das Prinzip verstanden, weiß aber nicht wie es mit den Sprungbefehlen (vorallem bedingte Sprünge )funktioniert. Kann mir jemand bitte anhand eine Beipiels schreiben wo da die Probleme sind und wie man diese behebt (statische-, dynamische Vorhersage)?
Danke schon mal in voraus.
Das Problem, dass sich bei Pipelining und Sprüngen ergibt ist ja, dass u.U. Befehle ausgeführt werden, welche aufgrund eines Sprungs (oder umgekehrt weil in Wirklichkeit garnicht gesprungen wird) nicht ausgeführt werden sollen. Das kommt dadurch dass bei einer Pipeline ja schon die nächsten Befehle bearbeitet werden bevor der vorherige fertig ausgeführt wurde. Damit aber kein Stall (weiss leider das deutsche Wort dafür nicht) eintritt wenn ein Branchbefehl ausgeführt wird, wird eine Vorhersage getroffen ob der Spung wohl stattfindet oder nicht. Statische Vorhersagen wären z.B. dass alle Sprünge "rückwärts" als "wird stattfinden" vorhergesagt werden, alle Sprünge vorwärts als "wird nicht stattfinden". Dies hat damit zu tun dass Sprünge rückwärts statistisch wohl häufiger stattfinden, z.B. oft in for- und while-Schleifen.
Solange die Vorhersage stimmt ist alles gut, aber wenn sich der Computer mal irrt, müssen natürlich alle Auswirkungen der fälschlicherweise ausgeführten Befehle rückgängig gemacht werden. Falls z.B. Register R1 überschrieben wurde muss der alte Wert von R1 wieder hergestellt werden. Ein möglicher Weg das zu machen könnte sein, dass alle spekulativ ausgeführten Befehle nicht die "echten" Register überschreiben sondern in sogenannte Scratchregister schreiben, in diesem Fall dann z.B. in S1. Sollte die Vorhersage richtig gewesen sein wird der Wert von S1 in R1 kopiert, ansonsten halt nicht.
Dynamische Vorhersage wäre z.B., wenn vor jeder Sprungvorhersage in einer Tabelle nachgeguckt wird, ob dieser Sprung das letzte mal ausgeführt wurde oder nicht. Dafür muss dann natürlich die Tabelle immer aktuell gehalten werden, also wenn sich bei einem bestimmten Sprungbefehl im Programm etwas ändert muss das in die Tabelle eingetragen werden.
So, ich hoffe das hilft weiter [img]
http://www.fb18.de/gfx/23.gif[/img]
edit: dabei geht es natürlich um konditionelle Sprünge, nicht um den goto-Befehl. Bei diesem besteht das Problem nur dadrin dass die fetch-einheit den goto-Befehl auch erkennen muss damit es bei der Sprungadresse weitermacht die Befehle zu fetchen