Macros de predicción de bifurcación en GCC

Una de las técnicas de optimización más utilizadas en el kernel de Linux es “__builtin_expect”. Cuando trabajamos con código condicional (sentencias if-else), a menudo sabemos qué rama es verdadera y cuál no. Si el compilador conoce esta información de antemano, puede generar el código más optimizado.

Veamos la definición de macro de las macros «probable()» e «improbable()» del código del kernel de Linux » http://lxr.linux.no/linux+v3.6.5/include/linux/compiler.h » [línea no 146 y 147].

#define likely(x)      __builtin_expect(!!(x), 1)
#define unlikely(x)    __builtin_expect(!!(x), 0)

En el siguiente ejemplo, estamos marcando la rama como probablemente verdadera:

const char *home_dir ;
  
home_dir = getenv("HOME");
if (likely(home_dir)) 
    printf("home directory: %s\n", home_dir);
else
    perror("getenv");

Para el ejemplo anterior, hemos marcado la condición «si» como «probable()» verdadera, por lo que el compilador colocará el código verdadero inmediatamente después de la bifurcación y el código falso dentro de la instrucción de bifurcación. De esta manera, el compilador puede lograr la optimización. Pero no utilice las macros «probable()» e «improbable()» a ciegas. Si la predicción es correcta, significa que hay un ciclo cero de instrucción de salto, pero si la predicción es incorrecta, tomará varios ciclos, porque el procesador necesita vaciar su tubería, lo que es peor que ninguna predicción.

El acceso a la memoria es la operación de CPU más lenta en comparación con otras operaciones de CPU. Para evitar esta limitación, la CPU utiliza «cachés de CPU», por ejemplo, caché L1, caché L2, etc. La idea detrás del caché es copiar una parte de la memoria en la propia CPU. Podemos acceder a la memoria caché mucho más rápido que cualquier otra memoria. Pero el problema es que, con el tamaño limitado de la «memoria caché», no podemos copiar toda la memoria en la caché. Por lo tanto, la CPU tiene que adivinar qué memoria se utilizará en el futuro cercano y cargar esa memoria en la memoria caché de la CPU y las macros anteriores son sugerencias para cargar memoria en la memoria caché de la CPU.

Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *