Das ist eine gute Frage! Ich glaube, die Verwirrung, die es verursacht, ist auf Intels seltsame Benennungsschemata zurückzuführen, die oft die Begriffe in der Wissenschaft überladen. Ich werde versuchen, sowohl Ihre Frage zu beantworten als auch die Verwirrung, die ich in den Kommentaren sehe, zu klären.
Zunächst einmal. Ich stimme zu, dass in der Terminologie der Computerwissenschaften ein Verzweigungszielpuffer nicht gleichbedeutend mit Verzweigungsprädiktor ist. In der Terminologie von Intel ist der Branch Target Buffer (BTB) [in Großbuchstaben] jedoch etwas Spezifisches und enthält sowohl einen Prädiktor als auch einen Verzweigungszielpuffercache (BTBC), der nur eine Tabelle mit Verzweigungsbefehlen und deren Zielen auf einem genommenen Ergebnis darstellt. Diese BTBC verstehen die meisten Leute als Verzweigungszielpuffer [Kleinschreibung]. Also, was ist der Branch Address Calculator (BAC) und warum brauchen wir ihn, wenn wir einen BTB haben?
Sie verstehen also, dass moderne Prozessoren in Pipelines mit mehreren Stufen aufgeteilt sind. Ob dies ein einfacher Pipelineprozessor oder ein außer Betrieb befindlicher Supersclarprozessor ist, die ersten Stufen sind typischerweise holen dann decodieren . In der fetch Stufe haben wir nur die Adresse der aktuellen Anweisung, die im Programmzähler (PC) enthalten ist. Wir verwenden den PC, um Bytes aus dem Speicher zu laden und sie an die Stufe decodieren zu senden. In den meisten Fällen inkrementieren wir den PC, um die nachfolgende (n) Anweisung (en) zu laden, aber in anderen Fällen verarbeiten wir eine Kontrollflussanweisung, die den Inhalt des PC vollständig ändern kann.
Der Zweck des BTB besteht darin, zu erraten, ob die Adresse im PC auf einen Verzweigungsbefehl zeigt, und wenn ja, wie sollte die nächste Adresse im PC lauten? Das ist gut, wir können einen Prädiktor für bedingte Verzweigungen und den BTBC für die nächste Adresse verwenden. Wenn die Vorhersage richtig war, ist das großartig! Wenn die Vorhersage falsch war, was dann? Wenn der BTB die einzige Einheit ist, die wir haben, müssen wir warten, bis der Zweig die Ausgabe / execute Stufe der Pipeline erreicht. Wir müssten die Pipeline spülen und neu beginnen. Aber nicht jede Situation muss so spät gelöst werden. Hier kommt der Branch Address Calculator (BAC) ins Spiel.
Der BTB wird in der Phase fetch der Pipeline verwendet, der BAC befindet sich jedoch in der Stufe decode . Sobald der Befehl, den wir abgerufen haben, entschlüsselt ist, haben wir tatsächlich viel mehr Informationen, die nützlich sein können. Die erste neue Information, die wir kennen, ist: "Ist die Anweisung, die ich tatsächlich einen Zweig abgerufen habe?" In der Abrufphase haben wir keine Ahnung und das BTB kann nur raten, aber in der Dekodierungsstufe wissen wir es sicher. Es ist möglich, dass der BTB eine Verzweigung voraussagt, wenn die Anweisung tatsächlich keine Verzweigung ist; In diesem Fall stoppt der BAC die Abrufeinheit, korrigiert den BTB und führt das erneute Abrufen korrekt aus.
Was ist mit Zweigen wie %code% und %code% ? Diese können bei der Dekodierung validiert werden. Der BAC prüft den BTB, prüft, ob Einträge in der BTBC vorhanden sind, und setzt den Prädiktor so, dass er ihn immer vorhersagt. Für %code% -Verzweigungen kann die BAC nicht bestätigen, ob sie bereits genommen / noch nicht genommen wurden, aber sie kann zumindest die vorhergesagte Adresse validieren und den BTB im Falle einer schlechten Adressenvorhersage korrigieren. Manchmal wird der BTB überhaupt keine Filiale erkennen / vorhersagen. Die BAC muss dies korrigieren und dem BTB neue Informationen über diese Anweisung geben. Da der BAC keinen eigenen bedingten Prädiktor hat, verwendet er einen einfachen Mechanismus (Rückwärtszweige genommen, Vorwärtszweige nicht genommen).
Jemand muss mein Verständnis dieser Hardware-Zähler bestätigen, aber ich glaube, sie meinen Folgendes:
Dies erklärt, warum der Nachteil der Erkennung einer Fehlvorhersage im BTB 2/3 Zyklen beträgt, während der Nachweis einer Fehlvorhersage im BAC 8 Zyklen beträgt.
Ich betrachte zur Zeit die verschiedenen Teile der CPU-Pipeline, die Verzweigungsfehlvorhersagen erkennen können. Ich habe Folgendes gefunden:
Ich weiß, was 2 und 3 erkennen, aber ich verstehe nicht, welche Fehlvorhersage innerhalb des BTB erkannt wird. Die BAC detektiert, wo der BTB fälschlicherweise eine Verzweigung für einen Nicht-Verzweigungsbefehl vorhergesagt hat, wobei der BTB keine Verzweigung erkannt hat, oder der BTB hat die Zieladresse für einen x86-RET-Befehl falsch vorhergesagt. Die Ausführungseinheit wertet die Verzweigung aus und stellt fest, ob sie korrekt war.
Welche Art von Fehlvorhersage wird am Verzweigungszielpuffer erkannt? Was genau wird hier als Fehlvorhersage erkannt?
Der einzige Hinweis, den ich finden konnte, war der in Vol. 3 der Intel Developer Manuals (die zwei BPU CLEAR-Ereigniszähler unten):
BPU sagte eine genommene Verzweigung vorher voraus, falsch angenommen, dass es war nicht genommen.
Dies scheint zu implizieren, dass die Vorhersage nicht "synchron", sondern "asynchron" gemacht wird, daher das "falsch angenommen" ?? /
UPDATE:
Ross, das ist die CPU-Verzweigungsschaltung, aus dem ursprünglichen Intel-Patent (wie für das "Lesen"?):
Ich sehe keine "Branch Prediction Unit" irgendwo? Wäre es vernünftig, dass jemand, der dieses Papier gelesen hat, annehmen würde, dass "BPU" eine faule Art ist, BTB-Schaltung, BTB-Cache, BAC und RSB zusammen zu gruppieren?
Also meine Frage steht immer noch, welche Komponente hebt das BPU CLEAR Signal?