Ich habe mich immer gefragt, wo/wie die Vorhersagedaten gespeichert sind? Gibt es eine Grenze? Sind es nur neuere Zweige? Ich bin hauptsächlich besorgt über die Intel-Architektur, aber alles, was ich über jede Architektur lernen kann, wird geschätzt.Wo/wie werden Verzweigungsvorhersagedaten gespeichert?
Antwort
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).
- 1. Wo werden Makros gespeichert?
- 2. Wo werden Zeigermetadaten gespeichert?
- 3. Wo die Einrichtungseinstellungen gespeichert werden
- 4. Sitzungswerte können nicht gespeichert werden
- 5. Metabox-Daten werden nicht gespeichert
- 6. Warum werden keine Originalpasswörter gespeichert?
- 7. Wo werden ServiceWorker Daten gespeichert?
- 8. Wo werden String-Daten gespeichert?
- 9. Wie werden die Gewerkschaftsmitglieder gespeichert?
- 10. Wo werden const Daten gespeichert?
- 11. Wo werden SSIS-Pakete gespeichert?
- 12. Wo werden heruntergeladene Sounddateien gespeichert?
- 13. Wie werden Logcat-Nachrichten gespeichert?
- 14. Wo können Metadaten gespeichert werden?
- 15. Wie SAS-Bibliotheken gespeichert werden
- 16. Django: Sitzungsdaten werden nicht gespeichert
- 17. Wo werden InAPP-Käufe gespeichert?
- 18. HTML: wenn Seiten gespeichert werden, haben Bilder/Dateien nicht gespeichert
- 19. Wo werden Bilder in Programmen gespeichert?
- 20. Wie können mehrsprachige Daten gespeichert werden?
- 21. Daten werden nicht in AutoIt gespeichert
- 22. Wie Versionskontrolldaten in mysql gespeichert werden
- 23. Wie MVC MiniProfiler Ergebnisse gespeichert werden
- 24. Wie werden Bitmaps im GridView-Adapter gespeichert?
- 25. Wie Peer-Verbindungen in Array gespeichert werden
- 26. Wo werden lokale Variablen zur Kompilierzeit gespeichert?
- 27. Android: Erfordern ein Bild vorübergehend gespeichert werden
- 28. CakePHP 2.6.7 hasViele Daten werden nicht gespeichert
- 29. Shopify API - Produktbild kann nicht gespeichert werden
- 30. Magento - wann werden Bestelldaten in DB gespeichert
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
@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
@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. –