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.
Es ist genau das, was es ist - Hardware-Branch-Vorhersagen sehen – levengli
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
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