2016-06-06 8 views
1

Die Verzweigung, von der angenommen wird, dass sie am wahrscheinlichsten ist, wird dann abgerufen und spekulativ ausgeführt. Wenn später festgestellt wird, dass die Schätzung falsch war, werden die spekulativ ausgeführten oder teilweise ausgeführten Anweisungen verworfen und die Pipeline beginnt mit dem korrekten Zweig , was zu einer Verzögerung führt.Verzweigungsvorhersage. Wie funktioniert es in der Tat?

Das Zitat stammt aus Wikipedia.

Warum ist es möglich, ausgeführte Anweisungen immer zu verwerfen? Zum Beispiel, was ist mit einer Situation, in der der erste Befehl in einem falsch vorhergesagten Zweig syscall 0x60 ist (unter Linux ist es eine Unterbrechung: "Programm beenden"). Ich weiß, dass das Programm im Falle einer falschen Vorhersage nicht verlassen wird, sondern wie die CPU es verwerfen kann.

Ich weiß, dass jeder Befehl (auf Mikro-Ops aufgeteilt) muss beendet werden, um abgeschlossen zu sein. Vielleicht ist es wichtig für spekulative Ausführung?

+1

Die ersten Stufen in der Befehlspipeline, die Speicher oder Register nicht ändern (z. B. Anweisungsabruf und -decodierung), können immer ausgeführt werden, ohne dass Probleme beim Verwerfen der Ergebnisse auftreten. – interjay

Antwort

0

Die spekulative Ausführung gilt normalerweise für Laderegister und Verzweigungen. Diese werden leicht durch die CPU unter Verwendung von Techniken wie register renaming zurückgespult.

Nicht alle Anweisungen können zuverlässig zurückgesetzt werden. Wie Sie Bezeichner haben, können Dinge wie ein syscall nicht. Wenn Sie zum Beispiel einen Systemaufruf zum Löschen einer Datei ausgeführt haben, kann die CPU diesen nicht zurücksetzen! Was hier passiert, ist, dass, wenn eine spekulative Ausführung aktiv ist, ein bestimmter Befehl einen "Stillstand" in der Ausführung verursacht, während die CPU wartet, um das tatsächliche Ergebnis der Verzweigung zu bestimmen.

+0

Also, die Antwort ist: Nur leicht zurück-zurück-Anweisung kann spekulativ ausgeführt werden. ** Erster ** nicht leicht zurückgehender Befehl stoppt die spekulative Ausführung, bis das Ergebnis von brnach nicht bekannt ist. Recht? – Gilgamesz

+0

@Gilgamesz - yep – Sean

+0

Warum sollte 'syscall' nicht leicht verworfen werden? Es ist im Grunde ein 'JMP', der nur das Befehlszeigerregister ändert, richtig? Irgendwelche Quellen dazu? – vidstige