zu sehen, ob die Verzweigungsvorhersage mein Programm tatsächlich verlangsamt oder
Verzweigungsvorhersage hilft keine Programme verlangsamen. Wenn die Leute über die Kosten verpasster Vorhersagen reden, reden sie darüber, wie viel teurer ein falsch vorhergesagter Zweig mit einem korrekt vorhergesagten Zweig verglichen wird.
Wenn die Verzweigungsvorhersage nicht existiert, wären alle Verzweigungen so teuer wie eine falsch vorhergesagte.
Also was "Fehlvorhersage Verzögerung ist zwischen 10 und 20 Uhr Zyklen" bedeutet wirklich, dass erfolgreiche Verzweigung Vorhersage 10 bis 20 Zyklen spart.
die Zweige entfernen nicht nur die Laufzeitleistung des Codes verbessert, es hilft auch, den Compiler den Code zu optimieren.
Warum Verzweigungsvorhersage dann verwenden?
Warum Verzweigungsprognose über das Entfernen von Verzweigungen verwenden? Du solltest nicht. Wenn ein Compiler Zweige entfernen kann, wird dies (vorausgesetzt, Optimierungen sind aktiviert), und wenn Programmierer Verzweigungen entfernen können (vorausgesetzt, dass dies die Lesbarkeit nicht beeinträchtigt oder es sich um einen performance-kritischen Code handelt), sollten sie dies tun.
Das macht die Verzweigungsvorhersage jedoch kaum nutzlos. Selbst wenn Sie so viele Zweige wie möglich aus einem Programm entfernen, enthält es immer noch viele, viele Zweige. Aus diesem Grund und aufgrund der Tatsache, wie teuer unvorhergesehene Zweige sind, ist eine Verzweigungsvorhersage für eine gute Leistung wesentlich.
Gibt es eine Möglichkeit, den Compiler zu zwingen, Assemblercode ohne Verzweigungen zu generieren?
Ein Optimierung der Compiler bereits Zweige von einem Programm entfernen, wenn es kann (ohne die Semantik des Programms zu ändern), aber, wenn wir über ein sehr einfaches int main() {return 0;}
-Typs Programm sprechen, ist es unmöglich, alle zu entfernen Geäst. Schleifen erfordern Verzweigungen (es sei denn, sie werden ausgerollt, aber das funktioniert nur, wenn Sie die Anzahl der Iterationen im Voraus kennen). Dies gilt auch für die meisten if- und switch-Anweisungen. Wenn Sie die Anzahl der if
s, switch
und Loops in Ihrem Programm minimieren können, großartig, aber Sie werden nicht in der Lage sein, alle zu entfernen.
oder um die Verzweigungsvorhersage zu deaktivieren, so dass CPU? also kann ich beide Ergebnisse vergleichen?
Nach meinem besten Wissen ist es unmöglich, Verzweigung Vorhersage auf x86 oder x86-64 CPUs zu deaktivieren. Und wie gesagt, dies würde niemals die Leistung verbessern (obwohl es es vorhersehbar machen könnte, aber das ist normalerweise nicht erforderlich in den Kontexten, in denen diese CPUs verwendet werden).
Ihre Frage wird mit der Antwort auf die verknüpfte Frage beantwortet. –
Beachten Sie, dass, wenn die CPU sie unterstützt, nicht jede Bedingung eine Verzweigung verursacht. Compiler sind ziemlich gut darin. Übrigens wird keine anständige CPU AFAIK Ihren Code im Falle von falschen Vorhersagen (messbar und im Durchschnitt!) Nicht verlangsamen, es wird es einfach nicht beschleunigen. Messen? Bereiten Sie einen Ad-hoc-Datensatz vor –
@GeorgeStocker Danke! nutzte dies, um zu verstehen, was "Verzweigungsvorhersage" ist, aber unten nicht bemerkte, dass er einige nützliche Informationen lieferte. –