Ist es möglich, dem Verzweigungsprädiktor mitzuteilen, wie wahrscheinlich es ist, der Verzweigung zu folgen?

Lesezeit: 2 Minuten

Benutzeravatar von Andy Shulman
Andy Schulmann

Nur um es klarzustellen, ich strebe hier keine Portabilität an, also sind alle Lösungen, die mich an eine bestimmte Box binden, in Ordnung.

Grundsätzlich habe ich eine if-Anweisung, die zu 99% als wahr ausgewertet wird, und versuche, die Leistung bis zum letzten Takt herauszuholen. Kann ich eine Art Compiler-Befehl ausgeben (mit GCC 4.1.2 und x86 ISA, if it matters), um dem Branch-Prädiktor mitzuteilen, dass er für diesen Branch zwischenspeichern soll?

  • Mit Profile Guided Optimization kompilieren (-fprofile-generate, auf einigen Testdaten ausführen, -fprofile-use). Dann kennt gcc die Statistiken für jeden Zweig und kann den Code optimal für den schnellen Pfad auslegen. Aber builtin_expect ist immer noch eine gute Idee für Orte, an denen es hilft, falls Code ohne PGO kompiliert wird. Der Linux-Kernel hat dafür einige gute Makros (z. B. wahrscheinlich() und unwahrscheinlich()), da es schwierig ist, Profildaten für einen Kernel zu generieren.

    – Peter Cordes

    6. Dezember 2009 um 3:44 Uhr

  • MS bietet auch PGO an — blogs.msdn.com/vcblog/archive/2008/11/12/pogo.aspx.

    – Hassan Syed

    27. Dezember 2009 um 1:37 Uhr

  • Wäre schön, wenn Sie genau auf den Abschnitt zitieren / zeigen könnten, in dem es heißt, dass der Hinweis auf neueren Architekturen ignoriert wird.

    – int3

    5. Dezember 2009 um 14:29 Uhr

  • Kapitel 3.12 “Statische Vorhersage” in dem von mir angegebenen Link.

    – Günther Piez

    5. Dezember 2009 um 14:56 Uhr

  • Wenn Sie sagen, dass kleinere Schleifen perfekt vorhergesagt werden können, bedeutet das nicht, dass die Schleife einmal abgeschlossen werden muss (wobei möglicherweise die Kanten falsch vorhergesagt werden) und dann alle Iterationen dazu gebracht werden müssen, das nächste Mal, wenn die Schleife ausgeführt wird, perfekt vorherzusagen?

    – Ken Arrari

    5. Dezember 2019 um 19:59 Uhr

  • In Microsoft-Umgebungen wird vorausgesagt, dass if-Anweisungen immer wahr sind. Einige Versionen verfügen über eine profilgeführte Optimierung.

    – Charles Beattie

    16. Juni 2010 um 8:20 Uhr

  • Siehe auch: stackoverflow.com/questions/109710/…

    – Ciro Santilli OurBigBook.com

    30. Juni 2015 um 8:57 Uhr

  • Übrigens müssen Sie builtin_expect wahrscheinlich nicht verwenden, wenn Sie die profilgeführte Optimierung verwenden. PGO zeichnet auf, in welche Richtung jeder Zweig gegangen ist. Wenn Sie also mit -fprofile-use kompilieren, weiß gcc, welcher Fall für jeden Zweig der gemeinsame ist. Es schadet dennoch nicht, builtin_expect zu verwenden, um ihm den schnellen Pfad mitzuteilen, falls Ihr Code jedoch ohne PGO erstellt wird.

    – Peter Cordes

    6. Dezember 2009 um 3:40 Uhr

  • Nein, es kann gültige Anwendungsfälle dafür geben. Beispielsweise gibt es Compiler, die als unmittelbaren Code nach c ausgeben und in jede Zeile ein “if (break) break_into_debugger()” einfügen, um eine plattformunabhängige Debugging-Lösung bereitzustellen.

    – Lothar

    5. Dezember 2009 um 6:20 Uhr

  • Tatsächlich sind Verzweigungsvorhersagefehler auf Prozessoren mit tiefer Pipeline extrem teuer, da sie eine vollständige Pipelinespülung erfordern. 20-mal so teuer wie die Ausführung einer Anweisung ist eine vernünftige Schätzung. Wenn ihm seine Benchmarks sagen, dass er ein Problem mit der Verzweigungsvorhersage hat, dann tut er das Richtige. VTune gibt Ihnen übrigens sehr gute Daten dazu, falls Sie es noch nicht ausprobiert haben.

    – Don Neufeld

    5. Dezember 2009 um 7:21 Uhr

1417930cookie-checkIst es möglich, dem Verzweigungsprädiktor mitzuteilen, wie wahrscheinlich es ist, der Verzweigung zu folgen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy