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
Wie im Kommentarbereich zu Ihrer Frage finden Sie richtig heraus:
__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.