5

Ich würde gerne wissen, wie man effiziente Jump-Tabellen für x64-Prozessoren, entweder in C, C++ oder Assembly schreiben. Die Eingabe ist im Voraus bekannt, aber algorithmisch nicht vorherzusagen. Angenommen, ich kann im Eingangsstrom so weit voraussehen, wie ich möchte, kann ich der CPU dynamisch mitteilen, welche Adresse der nächste Zweig sein wird?Wie kann ich ein Verzweigungsziel dynamisch an eine x64-CPU anhängen?

Im Wesentlichen möchte ich den Branch Target Buffer programmatisch aktualisieren. Aber ich würde mich mit allem zufrieden geben, was es mir erlaubt, die Pipeline in Fällen zu leeren, in denen der Programmierer im Voraus weiß, wohin der nächste Zweig geht, indem er die Daten betrachtet, aber der Prozessor kann dies nicht aus vergangenen Mustern bestimmen.

Aus dieser Erkenntnis heraus eine sehr spezifische Frage ist, und dass ich wahrscheinlich versagt haben, es richtig zu vermitteln, hier sind ein paar alternativen Phrasierungen:

Gibt es eine x64 entspricht hbr Hinweis für Niederlassung auf dem Cell-Prozessor ?

Hilft es jemals, eine Assembly cmp früher als ihre bedingte Verzweigung zu verschieben, wie es bei Itanium der Fall war?

Basiert das vorhergesagte Ziel eines indirekten Sprungs jemals auf einem Registerwert anstatt auf der letzten verwendeten Adresse?

Danke!

Antwort

1

Wenn Sie keine genaue Antwort finden können, können Sie möglicherweise anstelle des Verzweigungszielpuffers den Rückkehradressenprädiktor verwenden. Die allgemeine Technik wird Kontext-Threading genannt, und eine Beschreibung kann in der Veröffentlichung Context Threading: A Flexible and Efficient Dispatch Technique for Virtual Machine Interpreters gefunden werden.

Die Idee für Sie wäre: Wenn Sie weit genug in die Zukunft schauen können, für JIT kompilieren Sie/emittieren Sie eine einzelne direkte call Anweisung in einige ausführbare Speicher für jede Eingabe, die eine Steuerung-Flow-Änderung bestimmt. Zum Beispiel, wenn Sie zehn Einheiten der Eingabe hatten, würden Sie 10 Anrufe ausgeben.

Bei der Ausführung würde sich dieser Code gut verhalten, da sich die Rücksprungadressen jeder aufgerufenen Funktion nicht ändern würden und alle Aufrufe direkt wären.

Eine Randnotiz, ich bin keine CPU-Architektur Person, so dass ich möglicherweise Dinge vereinfachen, aber im Prinzip denke ich, dass dies funktionieren sollte.