2009-11-03 7 views
22

Ho trovato queste 2 macro nel codice del kernel di Linux. So che sono istruzioni per il compilatore (gcc) per le ottimizzazioni in caso di ramificazione. La mia domanda è, possiamo usare queste macro nel codice dello spazio utente? Darà qualche ottimizzazione? Ogni esempio sarà molto utile.È possibile utilizzare macro probabili/improbabili nel codice dello spazio utente?

+0

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

+0

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

+0

Ho controllato questi post, ma entrambi parlano di roba relativa al kernel. Volevo sapere se lo stesso può essere utilizzato nel codice utente. –

risposta

40

Si possono. In the Linux kernel, essi sono definiti come

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

Le macro __builtin_expect sono macro specifiche GCC che utilizzano la previsione ramo; dicono al processore se è probabile che una condizione sia vera, in modo che il processore possa precaricare le istruzioni sul "lato" corretto del ramo.

Si dovrebbe avvolgere le definisce in un ifdef per garantire la compilazione su altri compilatori:

#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 

Sarà sicuramente vi darà ottimizzazioni se lo si utilizza per correggere le previsioni di filiale.

+1

Nella parte #else, non dovrebbero valutare (x) e non vuoti? –

+1

oops, sì, certo. Modificato – Tomas

+0

quale file di intestazione contiene questa definizione nelle directory utente include? –

4

La probabile() e improbabili() macro sono piuttosto nomi definiti negli header del kernel per qualcosa che è un vero e proprio gcc feature

9

Dai uno sguardo a What Every Programmer Should Know About Memory in "6.2.2 Ottimizzazione dell'accesso alla cache delle istruzioni di livello 1" - c'è una sezione su esattamente questo.

+0

@Nikolai Grazie per il collegamento. –

+0

Nessun problema. Questo è un documento molto illuminante, anche su una terza lettura :) –

Problemi correlati