Vorhersage der Gedächtnisabhängigkeit - Memory dependence prediction

Speicherabhängigkeitsvorhersage ist eine Technik, eingesetzt durch Hochleistungs- out-of-order execution Mikroprozessoren , die ausgeführt Speicherzugriffsoperationen (Laden und Speichern) von der Programmreihenfolge, wahre Abhängigkeiten zwischen den Lade- und Speichervorgänge bei vorherzusagen Befehlsausführungszeit. Mit den vorhergesagten Abhängigkeitsinformationen kann der Prozessor dann entscheiden , bestimmte Ladevorgänge und Speicher spekulativ außerhalb der Reihenfolge auszuführen , während verhindert wird, dass andere Ladevorgänge und Speicher außerhalb der Reihenfolge ausgeführt werden (wobei sie in der Reihenfolge gehalten werden). Später in der Pipeline werden Speicherdisambiguierungstechniken verwendet, um festzustellen, ob die Ladevorgänge und Speicher korrekt ausgeführt wurden, und, falls nicht, um sie wiederherzustellen.

Durch die Verwendung des Speicherabhängigkeits-Prädiktors, um die meisten abhängigen Ladevorgänge und Speicher in Ordnung zu halten, profitiert der Prozessor von den Vorteilen einer aggressiven Ausführung / Speicherausführung außerhalb der Reihenfolge, vermeidet jedoch viele Verstöße gegen die Speicherabhängigkeit, die auftreten, wenn Ladevorgänge und Speicher falsch ausgeführt wurden. Dies erhöht die Leistung, da weniger Pipeline-Leergut erforderlich ist, um diese Verstöße gegen die Speicherabhängigkeit zu beheben. Sehen Sie sich die Speicher Begriffsklärung Artikel für weitere Informationen über Speicher Abhängigkeiten, Speicher Abhängigkeit Verletzungen und Erholung.

Im Allgemeinen sagt die Vorhersage der Speicherabhängigkeit voraus, ob zwei Speicheroperationen abhängig sind, dh ob sie durch Zugriff auf denselben Speicherort interagieren. Neben der Verwendung der Speicherabhängigkeitsvorhersage zum Speichern (RAW oder True) für die Planung von Ladevorgängen und Speichern außerhalb der Reihenfolge wurden andere Anwendungen der Speicherabhängigkeitsvorhersage vorgeschlagen. Siehe zum Beispiel.

Die Vorhersage der Speicherabhängigkeit ist eine Optimierung zusätzlich zur Spekulation der Speicherabhängigkeit . Die Semantik der sequentiellen Ausführung impliziert, dass Speicher und Ladevorgänge in der vom Programm angegebenen Reihenfolge ausgeführt werden. Wie bei der Ausführung anderer Befehle außerhalb der Reihenfolge kann es jedoch möglich sein, zwei Speicheroperationen in einer anderen Reihenfolge als der vom Programm implizierten auszuführen. Dies ist möglich, wenn die beiden Operationen unabhängig sind. Bei Spekulationen zur Speicherabhängigkeit kann eine Last vor einem Speicher ausgeführt werden, der ihr vorausgeht. Spekulationen sind erfolgreich, wenn die Last unabhängig vom Speicher ist, dh wenn die beiden Anweisungen auf unterschiedliche Speicherorte zugreifen. Die Spekulation schlägt fehl, wenn die Last vom Speicher abhängt, dh wenn sich die beiden Zugriffe im Speicher überlappen. Bei den ersten modernen, nicht in Ordnung befindlichen Designs wurde die Speicherspekulation nicht verwendet, da ihre Vorteile begrenzt waren. Da der Umfang der Ausführung außerhalb der Reihenfolge über einige zehn Befehle zunahm, wurden Spekulationen über naive Speicherabhängigkeit verwendet. Bei naiven Spekulationen zur Speicherabhängigkeit darf eine Last jeden vorhergehenden Speicher umgehen. Wie bei jeder Form von Spekulation ist es wichtig, die Vorteile korrekter Spekulation gegen die Strafe abzuwägen, die bei falscher Spekulation gezahlt wird. Wenn der Umfang der Ausführung außerhalb der Reihenfolge weiter auf mehrere zehn Anweisungen ansteigt, verringern sich die Leistungsvorteile naiver Spekulationen. Um die Vorteile aggressiver Spekulationen über die Speicherabhängigkeit beizubehalten und gleichzeitig die Kosten für Fehlspezifikationen zu vermeiden, wurden mehrere Prädiktoren vorgeschlagen.

Die Vorhersage der selektiven Speicherabhängigkeit blockiert bestimmte Lasten, bis sicher ist, dass keine Verletzung auftreten kann. Abhängigkeiten werden nicht explizit vorhergesagt. Dieser Prädiktor kann Lasten länger als nötig verzögern und daher zu einer suboptimalen Leistung führen. In einigen Fällen ist es sogar schlechter, als alle Lasten so früh wie möglich naiv zu spekulieren. Dies liegt daran, dass es häufig schneller ist, falsch zu spekulieren und wiederherzustellen, als auf die Ausführung aller vorhergehenden Speicher zu warten. An der University of Wisconsin - Madison wurde eine genaue Vorhersage der Gedächtnisabhängigkeit entwickelt. Insbesondere verzögert die dynamische Spekulation und Synchronisierung das Laden nur so lange, wie dies erforderlich ist, indem der genaue Speicher vorhergesagt wird, auf den eine Last warten soll. Dieser Prädiktor sagt genaue Abhängigkeiten voraus (Speicher- und Ladepaar). Der Synonymprädiktor gruppiert alle Abhängigkeiten, die eine gemeinsame Lade- oder Speicheranweisung gemeinsam haben. Der Geschäftssatz- Prädiktor repräsentiert effizient mehrere potenzielle Abhängigkeiten, indem alle möglichen Speicher, von denen eine Last abhängig sein kann, zusammengefasst werden. Der Store Barrier Predictor behandelt bestimmte Store-Anweisungen als Barrieren. Das heißt, alle nachfolgenden Lade- oder Speichervorgänge dürfen den bestimmten Speicher nicht umgehen. Der Store Barrier Predictor sagt Abhängigkeiten nicht explizit voraus. Dieser Prädiktor kann nachfolgende, jedoch unabhängige Lasten unnötig verzögern. Die Vorhersage der Speicherabhängigkeit hat andere Anwendungen als die Planung von Ladevorgängen und Speichern. Beispielsweise verwenden spekulatives Speichern des Speichers und Umgehen des spekulativen Speichers die Vorhersage der Speicherabhängigkeit, um die Kommunikation von Werten durch den Speicher zu optimieren.

Analogie zur Verzweigungsvorhersage

Die Vorhersage der Speicherabhängigkeit für Lasten und Speicher ist analog zur Verzweigungsvorhersage für bedingte Verzweigungsbefehle . Bei der Verzweigungsvorhersage sagt der Verzweigungsprädiktor voraus, in welche Richtung sich die Verzweigung auflöst, bevor sie bekannt ist. Der Prozessor kann dann spekulativ Anweisungen über einen der Pfade der Verzweigung abrufen und ausführen. Später, wenn der Verzweigungsbefehl ausgeführt wird, kann festgestellt werden, ob der Verzweigungsbefehl korrekt vorhergesagt wurde. Wenn nicht, handelt es sich um eine Fehleinschätzung des Zweigs , und ein Pipeline-Flush ist erforderlich, um Anweisungen wegzuwerfen, die spekulativ abgerufen und ausgeführt wurden.

Die Verzweigungsvorhersage kann als zweistufiger Prozess betrachtet werden. Zunächst bestimmt der Prädiktor die Richtung des Zweigs (genommen oder nicht). Dies ist eine binäre Entscheidung. Dann bestimmt der Prädiktor die tatsächliche Zieladresse. In ähnlicher Weise kann die Vorhersage der Speicherabhängigkeit als ein zweistufiger Prozess betrachtet werden. Zunächst bestimmt der Prädiktor, ob eine Abhängigkeit besteht. Dann bestimmt es, welche diese Abhängigkeit ist.

Siehe auch

Verweise