2009-11-03 7 views
22

Encontré estas 2 macros en el código del kernel de Linux. Sé que son instrucciones para el compilador (gcc) para optimizaciones en caso de bifurcación. Mi pregunta es, ¿podemos usar estas macros en el código de espacio del usuario? ¿Dará alguna optimización? Cualquier ejemplo será de mucha ayuda.¿Se pueden utilizar macros probables/improbables en el código de espacio de usuario?

+0

http://kerneltrap.org/node/4705 – pmg

+0

¿duplicado? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –

+0

Revisé estas publicaciones, pero ambas hablan de cosas relacionadas con el núcleo. Quería saber si mismo se puede usar en el código de usuario. –

Respuesta

40

Sí que pueden. In the Linux kernel, que se definen como

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

Las macros __builtin_expect son macros específicos de GCC que utilizan la predicción de ramificación; le dicen al procesador si es probable que una condición sea verdadera, de modo que el procesador pueda captar previamente las instrucciones en el "lado" correcto de la bifurcación.

Usted debe envolver los define en una ifdef para asegurar la compilación de otros compiladores:

#ifdef __GNUC__ 
#define likely(x)  __builtin_expect(!!(x), 1) 
#define unlikely(x)  __builtin_expect(!!(x), 0) 
#else 
#define likely(x)  (x) 
#define unlikely(x)  (x) 
#endif 

Definitivamente le dará optimizaciones si lo usa para las predicciones correctas sucursales.

+1

En la parte #else, ¿no deberían evaluar a (x) y no estar vacíos? –

+1

oops, sí, por supuesto. Editado – Tomas

+0

, ¿qué archivo de encabezado contiene esta definición en los directorios de inclusión del usuario? –

4

La probabilidad() e improbables() macros son nombres bonitos definidos en las cabeceras del núcleo de algo que es un verdadero gcc feature

9

Eche un vistazo a What Every Programmer Should Know About Memory en "6.2.2 Optimizar el acceso al caché de instrucción de nivel 1" - hay una sección sobre esto.

+0

@Nikolai Gracias por el enlace. –

+0

No hay problema. Este es un documento muy esclarecedor, incluso en una tercera lectura :) –

Cuestiones relacionadas