Was ist der Unterschied zwischen verzögerter Verzweigung und Verzweigungsvorhersage?

Ich studiere, wie die verzögerte Verzweigung funktioniert, und ich versuche, die verzögerte Verzweigung von der Verzweigungsvorhersage zu unterscheiden. Was ist der Unterschied? Ist eine verzögerte Verzweigung ein Mittel, um ein Kontrollrisiko zu erleichtern?

Antworten (2)

Verzögerte Verzweigung und Verzweigungsvorhersage sind zwei verschiedene Möglichkeiten, die Auswirkungen einer langen Ausführungspipeline abzuschwächen. Ohne sie muss die Pipeline jedes Mal anhalten, wenn eine bedingte Verzweigung vorgenommen wird, da der Befehlsabrufmechanismus nicht wissen kann, welcher Befehl als nächster nach dem Verzweigungsbefehl ausgeführt werden soll, bis die Berechnungen, von denen er abhängt, abgeschlossen sind.

Verzögerte Verzweigung bedeutet einfach, dass eine gewisse Anzahl von Anweisungen, die nach der Verzweigung im Anweisungsstrom erscheinen, ausgeführt werden, unabhängig davon, in welche Richtung die Verzweigung letztendlich geht. In vielen Fällen kann ein Compiler Anweisungen in diese Slots einfügen, die eigentlich nicht vom Zweig selbst abhängen, aber wenn dies nicht möglich ist, muss er sie mit NOPs füllen, was sowieso die Leistung beeinträchtigt. Dieser Ansatz hält die Hardware einfach, belastet aber die Compiler-Technologie.

Die Verzweigungsvorhersage ist ein eher hardwareorientierter Ansatz, bei dem der Befehlsabrufer einfach „errät“, in welche Richtung die Verzweigung gehen wird, Anweisungen auf diesem Pfad ausführt, und wenn sich später herausstellt, dass er falsch geraten hat, werden die Ergebnisse dieser Anweisungen geworfen weg. Verschiedene Systeme haben verschiedene Möglichkeiten, die Genauigkeit der Vermutung zu verbessern. Manchmal fügt der Compiler einen Hinweis in den Befehlsstrom ein, und manchmal verfolgt die Hardware, welchen Weg jeder Zweig in der Vergangenheit gegangen ist.

Einige ISAs unterstützen das Annullieren von Verzweigungsverzögerungsschlitzen, wo der Befehl dynamisch in eine nop umgewandelt wird, typischerweise wenn die Verzweigung nicht genommen wird (dh der Verzögerungsschlitzbefehl ist von dem genommenen Pfad). Es ist auch möglich, einen Verzögerungsschlitz mit einem Befehl zu füllen, der auf einem Pfad nutzlos, aber nicht schädlich ist, was im Allgemeinen ein freies Register erfordert, um das (möglicherweise unbenutzte) Ergebnis des Befehls zu halten. Eine Hinweisanweisung wie Prefetch ist ebenfalls "sicher".

Die verzögerte Verzweigung führt Befehle ohne Verzweigung und Abhängigkeit nach der Verzweigung aus, um eine Verschwendung von Zyklen während der Verzweigungs- und Zieladressenberechnung zu vermeiden. Die Verzweigungsvorhersage soll annehmen, dass eine Verzweigung nicht genommen wird (statische Verzweigungsvorhersage) oder basierend auf der Historie vorhersagen (dynamische Verzweigungsvorhersage), um Anweisungen nach der Verzweigung gemäß der Vorhersage auszuführen. Es gibt einen Unterschied zwischen dem Ausführen eines Teils, der für eine Verzweigung irrelevant ist, und dem Vorhersagen einer Verzweigung, die gemäß der Vorhersage auszuführen ist.