2011-12-12 10 views
5

C'è un modo per indicare al compilatore che si conosce il valore di una particolare variabile deve essere all'interno di un determinato intervallo in un determinato punto del codice, per aiutare il compilatore ad ottimizzare? Sto scrivendo una libreria che rende possibile conoscere l'intervallo di alcune variabili in fase di compilazione, e sarebbe bello se potesse in qualche modo comunicare queste informazioni al compilatore in modo che il compilatore potesse usarlo per l'ottimizzazione. Mi piacerebbe aggiungere il supporto per qualsiasi compilatore in cui funzionerebbe anche se non fosse possibile far funzionare tutti (sembra il tipo di cosa che alcuni compilatori potrebbero avere come estensione, ma non ho trovato qualsiasi). So che potrei scrivere qualcosa del genere:Come comunicare le informazioni sull'intervallo al compilatore C++?

if(x < COMPILE_TIME_MIN or x > COMPILE_TIME_MAX) 
    return; 
// compiler will assume for code below that x is in range COMPILE_TIME_MIN..COMPILE_TIME_MAX 

Ma questo è un controllo di runtime. Forse c'è qualche trucco per fare in modo che il compilatore assuma l'intervallo senza il controllo?

+2

Avete qualche idea su che tipo di ottimizzazione sarebbe utile? –

+0

Se si utilizzano i modelli, è possibile eseguire effettivamente il tempo di compilazione controllando se tutte le informazioni sono note al momento della compilazione. –

+0

Stai usando la frase "il compilatore", ma non ci dici mai quale. Presumibilmente intendi qualche versione di g ++ o Visual C++, ma non è chiaro. L'ottimizzazione in generale non è affrontata dallo standard, quindi tutto ciò che si potrebbe fare qui è specifico dell'implementazione. –

risposta

6

Qualsiasi "suggerimento" sarebbe specifico del compilatore.

Ad esempio, Visual C++ consente di fornire tale suggerimento utilizzando the __assume intrinsic.

(altri compilatori possono anche fornire tali intrinseci, ma non sono abbastanza familiarità con altri compilatori per fornire ulteriori informazioni. Consultare la documentazione del compilatore, se siete interessati.)

+3

Dal mio googling, gcc 4.5 e precedenti possono passare anche queste informazioni con la stessa sintassi usando '#define __assume (cond) do {if (! (Cond)) __builtin_unreachable(); } while (0) ' –

+0

@DrewDormann Interessante. Penso che sarebbe meglio definire una singola macro '#define ASSUME_THIS_THING (x) ...' che si espande in '__assume (x)' su Visual C++ e il tuo snippet su gcc. È meglio non definire la tua macro con un nome riservato al compilatore (come '__assume'). –

+0

Wow, è fantastico. James, ti interessa unire le informazioni di Drew nella tua risposta? Poi segnerò come accettato. –

3

Non è standard, ma con gcc, arriva un comando chiamato __builtin_expect, con macro definite come likely e unlikely che servono al tuo scopo. Vedere ad esempio here nello spazio del kernel, ma __builtin_expect è un'estensione gcc e potrebbe essere utilizzato anche nello spazio utente (vedere this question), anche se likely e unlikely non sono definiti.

+0

C'è un errore di battitura nel commento sopra: dovrebbe essere '__builtin_expect'. GCC utilizza solo l'aspettativa come un suggerimento: non eviterà i casi in cui l'aspettativa non viene soddisfatta. –

+0

@MattG, sì, non so come ho scritto 'buildtin'! – Shahbaz

0

Non conosco alcuna tecnica di compilazione C++ che sfrutti queste informazioni, ma conosco varie tecniche di analisi statiche che fanno; il modo comune per "dire" qualcosa da questi strumenti sarebbe via assert s, per esempio:

assert(x > COMPILE_TIME_MIN); 
assert(x < COMPILE_TIME_MAX); 

Ma solito questi strumenti sarebbe anche in grado di analizzare le cose come "se le condizioni" da soli, in modo da non c'è bisogno speciale di farlo.

Inoltre, se l'intervallo è veramente piccolo, è anche possibile rappresentarlo in una variabile di dimensioni più ridotte, ad es. usando un breve o carattere - e aggiungendo COMPILE_TIME_MIN. Questo può aiutare questi strumenti, anche se non conosco la compilation stessa.

Infine, come in tutti gli approcci di ottimizzazione, suggerirei prima di profilare il codice per vedere se questo potrebbe davvero essere un collo di bottiglia. Inoltre, tieni presente che i compilatori sono progettati per l'ottimizzazione del codice "normale" - l'ottimizzazione manuale potrebbe sicuramente essere d'aiuto, fallo con attenzione.

Problemi correlati