c++ - para - ¿Cuál es el punto del atributo probablemente(verdadero)
en html, el atributo alt se emplea para (1)
Estaba leyendo algo sobre los atributos en C ++ en cppreference . Mencionaron el atributo probable (verdadero) allí y ahora me pregunto para qué sirve. Lamentablemente no pude encontrar más información en la web.
¿Es este algún tipo de predicción de bifurcación que usa un procesador durante la ejecución?
Sí exactamente. Se utiliza para dar al compilador más información sobre la sentencia if
para que pueda generar el código óptimo de acuerdo con la micro-arquitectura objetivo
Si bien cada micro-arquitectura tiene sus formas de estar informadas acerca de la probabilidad de una sucursal, podemos tomar un ejemplo simple del manual de Intel Optimization
Regla de ensamblaje / compilación 3. (M impacto, generalidad H) Organice el código para que sea coherente con el algoritmo de predicción de bifurcación estática: haga que el código de caída siguiente a una bifurcación condicional sea el objetivo probable para una bifurcación con un objetivo hacia adelante, y haga el código de caída tras una rama condicional es el objetivo improbable para una rama con un objetivo hacia atrás.
En pocas palabras, la predicción estática para las ramas hacia adelante no se toma (entonces el código después de la rama se ejecuta especulativamente, es la ruta probable) mientras que para las ramas hacia atrás se toma (para que el código después de la rama no se ejecute especulativamente).
Considere este código para 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;
}
Donde usé el __builtin_expect
para simular un [[problably(true)]]
.
Esto se compila en
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
Donde te ahorré un código de ensamblaje.
Si reemplaza el probably_true
con probably_false
el código se convierte en:
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
Puedes jugar con este ejemplo en codebolt.org .