2012-02-12 20 views
5

Sto sviluppando per la piattaforma AVR e ho una domanda. Non voglio che la libreria in virgola mobile sia collegata al mio codice, ma mi piace il concetto di avere valori analogici del range 0.0 ... 1.0 invece di 0 ... 255 e 0 ... 1023, a seconda di anche se sto usando una porta come input o come output.Ottimizzazione in virgola mobile GCC compatta in tempo

Quindi ho deciso di moltiplicare gli argomenti delle funzioni di input/output per 1023.0 e 255.0, rispettivamente. Ora, la mia domanda è: se a implementare la divisione in questo modo:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0))) 

sarà GCC (con la bandiera -O3 acceso) ottimizzare il tempo di compilazione moltiplicazioni in virgola, noti al momento della compilazione e espressi per un integrale galleggiante digitare, in operazioni con numeri interi? (So ​​che quando si utilizzano queste macro con argomenti non costanti, l'ottimizzazione non è possibile, voglio solo sapere se verrà eseguita nell'altro caso.)

+1

Non dovrebbe essere questa una moltiplicazione, non una divisione? ('analog_out (7, 0.5)' diventa una scrittura di '0.5 * 255' sulla porta 7, piuttosto che una scrittura di 0 tagliata da 1/510) ... – Borealid

+0

sì, certo :) Risolto. –

+3

Provalo e scoprilo! 'gcc -S' produrrà un dump di assembly. Probabilmente vuoi '-O2 -ffast-math' per questo, non' -O3' ('-O3' attiva le ottimizzazioni che sono quasi sempre un net * lose *, come inlining troppo aggressivo, è pensato per essere usato un file in cui il tuo programma spende il 90% delle volte). – zwol

risposta

3

GCC dovrebbe sempre eseguire il piegamento costante se si fornisce il bit come valore letterale numerico. Se si desidera che il compilatore far rispettare la costanza, si potrebbe ottenere via con qualcosa di simile:

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0)) 
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0))) 
2

Generalmente, penso che gcc -O2 eseguirà tutte le operazioni aritmetiche su costanti al momento della compilazione.
Non lo converte in aritmetica di interi - solo in un numero intero costante.

Potrebbe essere pericoloso fare affidamento su, soprattutto se altre persone mantengono il codice. Una situazione in cui il passaggio di un parametro non costante a una macro provoca un errore non è buono.

+0

Non si verifica un errore, voglio solo che sia ottimizzato. –

Problemi correlati