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?
Respuesta
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.
En la parte #else, ¿no deberían evaluar a (x) y no estar vacíos? –
oops, sí, por supuesto. Editado – Tomas
, ¿qué archivo de encabezado contiene esta definición en los directorios de inclusión del usuario? –
La probabilidad() e improbables() macros son nombres bonitos definidos en las cabeceras del núcleo de algo que es un verdadero gcc feature
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.
@Nikolai Gracias por el enlace. –
No hay problema. Este es un documento muy esclarecedor, incluso en una tercera lectura :) –
- 1. Espacio de nombres confusión y macros
- 2. Al utilizar macros tipo función en C
- 3. ¿Se pueden utilizar selectores jQuery con observadores de mutación DOM?
- 4. ¿Hasta dónde pueden llegar las macros LISP?
- 5. ¿Cuándo apareció la idea de las macros (transformación de código definida por el usuario)?
- 6. ¿Dónde se almacenan las macros?
- 7. No se pueden ejecutar las pruebas MSTest con cobertura de código habilitada al utilizar NHibernate
- 8. Manejo de interrupción de Linux en el espacio de usuario
- 9. ¿Pueden las macros Racket tomar argumentos de palabra clave?
- 10. ManyToManyField ordenado que se pueden utilizar en fieldsets
- 11. macros en macros
- 12. ¿Cómo se pueden cargar los módulos del kernel de Linux desde el código C?
- 13. No se pueden registrar errores de Código 500 en ELMAH
- 14. Ejemplos de las macros de Lisp que se pueden usar para
- 15. en kernel y espacio de usuario
- 16. Compilación de código Lisp con macros de lectura
- 17. ¿Por qué los nombres de usuario no se pueden cambiar?
- 18. ¿Barreras de memoria en el espacio de usuario? (Linux, x86-64)
- 19. Los objetos grandes no se pueden utilizar en el modo de confirmación automática
- 20. Herramientas de refactorización de código para C, ¿se pueden usar en GNU/Linux? Se prefiere FOSS
- 21. Implementando syscalls cancelables en el espacio de usuario
- 22. ¿Macros de macroproducción en C?
- 23. ¿Cómo se pueden redactar los mensajes sin utilizar el iniciador y el selector en wp7?
- 24. ¿Cuáles son algunos buenos perfiladores PHP que se pueden utilizar?
- 25. clojure - código de evaluación en el espacio de nombres diferente
- 26. Casos raros donde se deben utilizar MACRO
- 27. ¿Puedo evitar que un espacio de usuario de Linux genere pthread en código crítico?
- 28. ¿Se pueden utilizar los modificadores de enrutamiento Can Rails (es decir, mymodel_path (modelo)) en los modelos?
- 29. Evaluación Clojure de macros
- 30. Uso de macros en Clojure
http://kerneltrap.org/node/4705 – pmg
¿duplicado? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –
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. –