Sind BOOST_LIKELY und __builtin_expect noch relevant?

8

Ich verstehe, was erklärt wird hier sowie diese Hinweise zur CPU für statische Verzweigungsvorhersage enthalten.

Ich frage mich, wie relevant diese auf Intel-CPUs sind, jetzt da Intel-CPUs die Unterstützung für statische Vorhersagehinweise fallengelassen haben, wie bereits erwähnt hier . Wenn ich jetzt verstehe, wie es jetzt funktioniert, ist die Anzahl der Verzweigungsbefehle im Pfad das einzige, was der Compiler steuern kann und welcher Zweigpfad vorhergesagt, abgerufen und decodiert wird zur Laufzeit entschieden.

Gibt es Szenarien, in denen Verzweigungshinweise in Code immer noch nützlich sind für Software, die auf aktuelle Intel-Prozessoren abzielt, vielleicht bedingte Rückgabe oder zur Vermeidung der Anzahl von Verzweigungsbefehlen im kritischen Pfad im Falle verschachtelter if / else-Anweisungen?

Auch wenn diese noch relevant sind, werden alle Details zu gcc und anderen populären Compilern geschätzt.

P.S. Ich bin nicht für vorzeitige Optimierung oder für den Code mit diesen Makros, aber ich interessiere mich für das Thema, wie ich mit einigen zeitkritischen Code arbeite und immer noch Code Unordnung zu reduzieren, wo möglich.

Danke

    
Jeevaka 15.05.2015, 18:49
quelle

1 Antwort

1

Wie im Kommentarbereich zu Ihrer Frage finden Sie richtig heraus:

  1. Es gibt keine statischen Hinweise zur Verzweigungsvorhersage in Opcode-Maps mehr auf Intel x86 CPUs;
  2. Die dynamische Verzweigungsvorhersage für "kalte" bedingte Sprünge neigt dazu, den Fall-Pfad vorherzusagen;
  3. Der Compiler kann __builtin_expect verwenden, um neu anzuordnen, welcher Pfad des if-then-else-Konstrukts in der generierten Assembly als Fallthrough-Fall platziert wird.

Betrachten Sie nun eine Codebasis, die für mehrere Zielarchitekturen kompiliert wird, nicht nur für Intel x86. Viele von ihnen haben entweder statische Verzweigungshinweise, dynamische Verzweigungsvorhersager unterschiedlicher Komplexität oder beides.

Als Beispiel bietet die Intel Itanium-Architektur ein umfassendes System von Vorhersagehinweisen für alle Arten von Anweisungen: Steuerfluss, Laden / Speichern usw. Und Itanium wurde entwickelt, um Code umfassend durch einen Compiler mit all diesen statisch zugewiesenen zu optimieren Anweisungen Slots in einem Bündel und Hinweise.

Daher ist __builtin_expect immer noch relevant für (seltene) Fälle, wenn 1) korrekte Verzweigungsvorhersageinformationen zu schwer waren, um automatisch von einem Compiler abgeleitet zu werden, und 2) die zugrundeliegende Hardware auf wenigstens einer der Zielarchitekturen ebenfalls bekannt war nicht in der Lage, sie dynamisch zuverlässig vorherzusagen. Vorausgesetzt, dass Prozessoren mit geringer Leistung primitive Verzweigungsvorhersager enthalten, die den Verzweigungsverlauf nicht verfolgen, aber immer den Fallthrough-Pfad wählen, beginnt er, vorteilhaft zu sein. Für moderne Intel x86-Hardware, nicht so sehr.

    
Grigory Rechistov 09.02.2018 15:04
quelle

Tags und Links