Die meisten, wenn nicht alle modernen Prozessoren verwenden eine Technik namens "Verzweigungsvorhersage", mit der sie raten, welchen Weg man in einen Wenn-Dann-Else-Zweig nehmen soll.Tritt der Verzweigungs-Prädiktor dabei ein?
Ich habe eine Frage bezüglich des Schemas. Lassen Sie sich sagen, dass wir dieses Stück Code haben, in keiner bestimmten Sprache:
if(someCondition)
{
// some action
return someValue;
}
// some other action
return someOtherValue;
Logisch gesehen, ist, dass Code zu diesem Code-äquivalent:
if(someCondition)
{
// some action
return someValue;
}
else
{
// some other action
return someOtherValue;
}
Der Verzweigungsprädiktor ‚vorhersagen‘ in der den Zweig würde zweites Beispiel, aber was ist mit dem ersten Beispiel? Wird es raten? Was wird in die Pipeline geladen? Gibt es irgendeine Geschwindigkeit, die man mit den beiden Beispielen erreichen kann, wenn man den Einfluss des tatsächlichen Codes in den Blöcken außer Acht lässt?
Meine Vermutung, es ist abhängig vom Compiler: Wenn Anweisungen implementiert werden (in Assembly) mit Sprüngen, die nur durchgeführt werden, wenn das Vergleichsflag im Register gesetzt ist. Wie der Assembler aussieht, hängt vom Compiler ab. Wenn es keinen gemeinsamen Weg gibt, mit dem jeder Compiler arbeitet, was ich bezweifle, ist dies Compiler-abhängig. Was würde in diesem Fall bei den neuesten Visual Studio C++ - und GC++ - Compilern passieren?
Als Hexafraktion aufgezeigt, die Beziehung zwischen den Rückgabewerten sowie wie someCondition
bestimmt wird ... der Verzweigung Prädiktor möglicherweise nicht treten. Betrachten wir nur wahr und falsch als Rückgabewerte. Für die Bedingung nehmen wir sowohl an, dass es ein Feld ist, das vorherbestimmt wurde, entweder innerhalb oder außerhalb der Funktion, eine lokale Variable und irgendeine arithmetische Aussage.
Um ehrlich zu sein, ich vermute nicht, dass es einen großen Unterschied zwischen dem Fall gibt, dass die Bedingung eine lokale Variable ist, und dem Fall, dass das Feld in der gleichen Funktion vorgegeben wurde.
Denken Sie daran, dass es manchmal numerische Optimierungen gibt, die ein Compiler ohne Verzweigung durchführen kann. Abhängig davon, wie Ihre 'someCondition' berechnet wird und die Beziehung zwischen den beiden Rückgabewerten, ist es theoretisch möglich, dass in einigen Fällen eine Verzweigungslogik/Bit-Twiddling/Arithmetik möglich ist. Darüber hinaus haben Architekturen wie ARM eine bedingte Ausführung, was bedeutet, dass viel Logik, die Verzweigungen beinhalten würde, verzweigt ausgeführt werden kann. Bedingte Anweisungen enthalten eine Bedingung als Teil des Opcodes, und wenn die Bedingung nicht erfüllt ist, wird die Inst. wird zu einem Nop gemacht. – hexafraction
Es ist * höchst * unwahrscheinlich, dass diese beiden Codeteile nicht auf denselben Maschinencode kompiliert werden. Wenn Sie über das Verhalten der CPU sprechen möchten, vergleichen Sie den Assembly-/Maschinencode. –
Ich denke du kannst das "* Logisch sprechen *" weglassen. Diese beiden Snippets sind genau gleichwertig, und ich erwarte, dass der Compiler denselben Bytecode/Assembly für sie ausgibt. Der Verzweigungsprädiktor kann also keinen Unterschied erkennen und behandelt sie gleich ... – Bergi