2017-01-15 1 views
1

Ich habe gerade etwas über Attribute in C++ auf cppreference gelesen. Sie erwähnten das wahrscheinlich (wahre) Attribut dort und jetzt frage ich mich, wofür es gut ist. Leider konnte ich keine weiteren Informationen im Internet finden.Was ist der Punkt des wahrscheinlich (wahren) Attributs

Ist dies eine Verzweigungsvorhersage, die ein Prozessor während der Ausführung verwendet?

+2

Es ist genau das, was es ist - Hardware-Branch-Vorhersagen sehen – levengli

+0

es ist nur ein Beispiel dafür, was ein Attribut, das nur für die bedingten Verzweigungen gelten könnte, in dieser Form nicht wirklich existiert (nach meinem besten Wissen) – Cubbi

+0

Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber ich habe gerade einen Code mit folgender Syntax kompiliert: '[[wahrscheinlich (wahr)]] if (...) ... sonst ...' Habe ich nicht Überprüfen Sie den generierten Code, aber mindestens kompiliert (using msc und C++ 14) – Timo

Antwort

5

Ja, genau. Es wird verwendet, um dem Compiler mehr Informationen über die if-Anweisung zu geben, so dass es den optimalen Code entsprechend der Ziel-Mikroarchitektur erzeugen kann. Während jede Mikroarchitektur ihre Möglichkeiten hat, über die Wahrscheinlichkeit einer Verzweigung informiert zu werden, können wir ein einfaches Beispiel aus der Intel-Optimierung Handbuch nehmen

Montage/Compiler Coding Regel 3. (M Wirkung, H Allgemeinheit) Code Vereinbaren Sie mit die statische Verzweigungsvorhersagealgorithmus konsistent zu sein: die Fall- machen Durch Code, der einer bedingten Verzweigung folgt, ist das wahrscheinliche Ziel für eine Verzweigung mit einem Forw ard target, und machen Sie den Fall-Through-Code, der einem bedingten -Zweig folgt, das unwahrscheinliche Ziel für eine Verzweigung mit einem Rückwärtsziel.

Einfach gesagt, die statische Vorhersage für Vorwärtsverzweigungen ist nicht genommen (so dass der Code nach der Verzweigung spekulativ ausgeführt, es den wahrscheinlichen Weg ist), während für die Rückwärts Zweige genommen (so den Code nach der Zweig wird nicht spekulativ ausgeführt).

Betrachten Sie diesen Code für GCC:

#define probably_true(x) __builtin_expect(!!(x), 1) 
#define probably_false(x) __builtin_expect(!!(x), 0) 

int foo(int a, int b, int c) 
{ 
    if (probably_true(a==2)) 
     return a + b*c; 
    else 
     return a*b + 2*c; 
} 

Wo ich die eingebaute in __builtin_expect verwendet, um eine [[problably(true)]] zu simulieren.

Diese in

zusammengestellt bekommen
foo(int, int, int): 
     cmp  edi, 2   ;Compare a and 2 
     jne  .L2    ;If not equals jumps to .L2 

     ;This is the likely path (fall-through of a forward branch) 

     ;return a + b*c; 

.L2: 
     ;This is the unlikely path (target of a forward branch) 

     ;return a*b + 2*c; 

     ret 

Wo ich Ihnen einen Assembler-Code erspart.
Wenn Sie die probably_true mit probably_false der Code ersetzen wird:

foo(int, int, int): 
     cmp  edi, 2   ;Compare a and 2 
     je  .L5    ;If equals jumps to .L5 

     ;This is the likely path (fall-through of a forward branch) 

     ;return a*b + 2*c; 

.L5: 
     ;This is the unlikely path (target of a forward branch) 

     ;return a + b*c; 

     ret 

Sie mit with this example at codebolt.org spielen können.

+0

Schöne Antwort, danke!Wird also die Verzweigungsvorhersage immer den Befehl verwenden, der dem aktuell ausgeführten Befehl als Vorhersagepfad und dem Sprungpfad als Fehlerpfad folgt? – Timo

+1

@Timo Es hängt von der Architektur (oder besser der Mikroarchitektur) ab, in x86, für Vorwärtssprünge (die statisch vorhergesagt sind) ist Ihre Aussage wahr, aber nur beim ersten Mal, wenn die Verzweigung gesehen wird. Nach dem ersten Mal versucht der Verzweigungsprädiktor, ein Muster des Nicht-genommen-Verhaltens der Verzweigung zu erfassen. Für einen Startpunkt siehe [den entsprechenden Artikel in Wikipedia] (https://en.wikipedia.org/wiki/Branch_predictor). –

+0

Trotz der Ratschläge im Architekturhandbuch, auf dem modernen x86, verstehe ich, dass es keine statischen Prädiktionsregeln mehr gibt! _. Das heißt, die Art, wie moderne Verzweigungsprädiktoren entworfen werden, wird immer nur eine dynamische Vorhersage sein: Wenn die Verzweigung nicht gesehen wurde, basiert die Vorhersage nur darauf, was in den Vorhersagetabellen von anderen Sprüngen übrig ist, die dort hashten, oder vielleicht eine Vorgabe (wahrscheinlich Fallthrough-immer), wenn überhaupt nichts da ist. – BeeOnRope

Verwandte Themen