Welcher Code bietet angesichts der Verzweigungsvorhersage und der Auswirkungen von Compileroptimierungen tendenziell eine überlegene Leistung?
Beachten Sie, dass bRareExceptionPresent eine ungewöhnliche Bedingung darstellt. Es ist nicht der normale Weg der Logik.
/* MOST COMMON path must branch around IF clause */
bool SomeFunction(bool bRareExceptionPresent)
{
// abort before function
if(bRareExceptionPresent)
{
return false;
}
.. function primary body ..
return true;
}
/* MOST COMMON path does NOT branch */
bool SomeFunction(bool bRareExceptionPresent)
{
if(!bRareExceptionPresent)
{
.. function primary body ..
}
else
{
return false;
}
return true;
}
optimization
theory
Dyasta
quelle
quelle
Antworten:
In der heutigen Welt spielt es keine Rolle, wenn überhaupt.
Dynamische Verzweigungsvorhersagen (über die seit Jahrzehnten nachgedacht wird (siehe Eine 1996 veröffentlichte Analyse der Schemata für dynamische Verzweigungsvorhersagen )) sind weit verbreitet.
Ein Beispiel hierfür finden Sie im ARM-Prozessor. Aus dem Arm Info Center zur Zweigvorhersage
Die Frage ist dann: "Was ist dynamische Verzweigungsvorhersage im Armprozessor?" Das fortgesetzte Lesen der dynamischen Verzweigungsvorhersage zeigt, dass ein 2-Bit-Vorhersageschema (in der Veröffentlichung beschrieben) Informationen darüber erstellt, ob die Verzweigung stark oder schwach genommen wird oder nicht.
Mit der Zeit (und mit der Zeit meine ich ein paar Durchgänge durch diesen Block) werden Informationen darüber aufgebaut, in welche Richtung der Code gehen wird.
Bei der statischen Vorhersage wird untersucht , wie der Code selbst aussieht und wie die Verzweigung beim Test erfolgt - zu einer vorherigen Anweisung oder einer weiteren im Code:
Wie von Sparky erwähnt, basiert dies auf dem Verständnis, dass Schleifen häufig Schleifen sind. Die Schleife verzweigt sich rückwärts (am Ende der Schleife befindet sich eine Verzweigung, um sie oben neu zu starten) - dies geschieht normalerweise.
Die Gefahr, den Compiler zu erraten, besteht darin, dass Sie nicht wissen, wie dieser Code tatsächlich kompiliert (und optimiert) wird. Und zum größten Teil spielt es keine Rolle. Bei der dynamischen Vorhersage wird zweimal durch die Funktion ein Überspringen der Schutzanweisung für eine vorzeitige Rückkehr vorhergesagt. Wenn die Leistung von zwei gespülten Rohrleitungen von kritischer Leistung ist, gibt es andere Dinge, über die Sie sich Sorgen machen müssen.
Die Zeit, die benötigt wird, um einen Stil über den anderen zu lesen, ist wahrscheinlich von größerer Bedeutung - Code sauber zu machen, damit ein Mensch ihn lesen kann, da der Compiler gut funktioniert, egal wie chaotisch oder idealisiert Sie den Code schreiben.
quelle
Nach meinem Verständnis wird die CPU beim ersten Auftreffen auf einen Zweig vorhersagen (sofern unterstützt), dass keine Vorwärtszweige und Rückwärtszweige verwendet werden. Der Grund dafür ist, dass angenommen wird, dass Schleifen (die typischerweise rückwärts verzweigen) angenommen werden.
Auf einigen Prozessoren können Sie in der Assembly-Anweisung einen Hinweis geben, welcher Pfad am wahrscheinlichsten ist. Details dazu entgehen mir im Moment.
Darüber hinaus unterstützen einige C-Compiler auch die statische Verzweigungsvorhersage, sodass Sie dem Compiler mitteilen können, welche Verzweigung wahrscheinlicher ist. Im Gegenzug kann es den generierten Code neu organisieren oder geänderte Anweisungen verwenden, um diese Informationen zu nutzen (oder sie einfach nur ignorieren).
Hoffe das hilft.
quelle
__builtin_expect
?