2014-09-03 15 views

Antwort

5

Irgendwo intern im Prozessor. Was genau gemacht wird, hängt vom Prozessor ab.

In einem sehr einfachen Fall könnten Sie 4096 Bits Verzweigungsvorhersagedaten nehmen. Dann nehmen Sie für jeden Zweig die letzten 12 Bits der Adresse der Verzweigung, die 4096 verschiedene Werte ergibt, und nehmen diese als den Index in Ihre Verzweigungsvorhersagedaten auf. Und da Sie nur ein Datenbit haben, speichern Sie einfach, ob die letzte Verzweigung genommen wurde.

Der Vorteil ist, dass es sehr billig ist. Der Nachteil ist, dass zwei Zweige mit exakt 4096 Bytes den gleichen Eintrag in der Tabelle verwenden. Wenn also Ihr Code diese beiden Zweige ständig ausführt und eine immer genommen wird und eine nie genommen wird, ist die Verzweigungsvorhersage ziemlich schlecht.

Einige Prozessoren verwenden zwei Bits pro Zweig, was bedeutet "stark genommen", "genommen", "nicht genommen", "stark nicht genommen". Jedes Mal wenn eine Verzweigung genommen wird, bewegt sich die Vorhersage in Richtung "stark genommen", wenn die Verzweigung nicht genommen wird, bewegt sie sich in Richtung "stark nicht genommen". Dies funktioniert besser, wenn Zweige mit seltenen Ausnahmen verwendet werden.

Einige Prozessoren verwenden nicht nur die letzten 12 oder mehr Bits der Verzweigungsadresse, sondern sie mischen ein, ob die letzten vier Zweige genommen wurden. Angenommen, Sie haben den Code

if (x >= 0) { ... } 
if (x <= 0) { ... } 

und x ist selten 0, aber ziemlich zufällig positiv oder negativ. Dann ist der erste Zweig schwer vorherzusagen, aber der zweite wird nie genommen, nachdem der erste genommen wurde, und immer wenn der erste nicht genommen wird. Indem Sie diese Informationen einmischen, verwenden Sie zwei Einträge in der Verzweigungsvorhersagetabelle für die zweite Verzweigung, aber die Vorhersage für die zweite Verzweigung ist sehr genau, auch wenn die Verzweigung zufällig gewählt oder nicht genommen wird.

Sie haben immer das Problem, dass derselbe Eintrag in der Verzweigungsvorhersagetabelle für mehr als eine Verzweigung verwendet wird; damit lebst du einfach. (Wenn wir etwas cleveres machen, würde das viel zu viel Speicher beanspruchen. Wir verwenden 1 oder 2 Bit pro Verzweigungsvorhersage, so dass wir massive Tabellen mit sehr wenig Speicher haben können).

+0

Ich habe mich gefragt, warum sie es nicht in ein paar unbenutzte Bits in den Opcode im Code selbst stecken. Schätze, das wäre wirklich langsam, da es wieder zu Ram gehen müsste. – johnnycrash

+0

@johnnacrash, Stick was? Die Verzweigungsauflösung ist nicht statisch für eine einzelne Verzweigungsstelle im Programm (eine eindeutige IP/PC), das beste Beispiel ist eine Schleifenverzweigung - sie wird nur bis zu dem Punkt genommen, an dem sie nicht mehr verwendet wird. Einige Verzweigungsprädiktoren würden mehrere Einträge für diese Zweige in unterschiedlichen Verlaufskontexten enthalten. Wenn Sie andererseits beabsichtigen, diese Bits während der Laufzeit zu ändern, suchen Sie nach dem Modifizierungscode und denken Sie noch einmal darüber nach. – Leeor

+0

@Leeor Da dies nur ein Hinweis wäre, gäbe es kein selbst-modifizierendes Code-Problem. (Außerdem würde das Front-End die Änderung vornehmen.) Es würde ein Problem geben, wenn mehrere Programme/Threads den Code ausführen würden. In diesem Fall kann ein Icache Refill eine Vorhersage aus dem Verlauf eines anderen Threads machen. Dies würde auch mehr schmutzige Cache-Blöcke zum Zurückschreiben bedeuten. –

Verwandte Themen