2013-10-28 21 views
5

Ho un compilatore g ++ 4.7.3. Sto cercando di seguire la descrizione delle bandiere di ottimizzazione http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.html e ho un problema successivo:Dubbi sul flag di ottimizzazione di gcc O3

Ho un programma, che dà tempi diversi con -O2 e -O3 flag. -O2 è due volte più veloce di -O3. Il tempo è 8ms con O2 e 16ms con O3.

Quindi mi piacerebbe capire cosa fa esattamente la differenza. Nel link sopra vedo:

"O3 Ottimizza ancora di più. -O3 attiva tutte le ottimizzazioni specificate da -O2 e attiva anche le funzioni -finline, -funswitch-loops, -fpredictive-commoning, -fgcse- after-reload, -ftree-vectorize e -fipa-cp-clone options. "

Così ho semplicemente prendere -O2 e aggiungi tutte le bandiere descritte:

-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone 

e il tempo è 30ms. Ma questa serie di opzioni dovrebbe essere equivalente a a -O3. Perché il tempo è diverso? Dove posso fare qualcosa di sbagliato?

P.S. Tutti i risultati sono perfettamente riproducibili con precisione di 1ms.


Ho controllato le opzioni mediante

g++ -c -Q -Ox --help=optimizers 

e visto che O3 ha ancora un'opzione aggiuntiva: -ftree-loop-distribuire-patterns. Ma quando aggiungo il set di opzioni:

-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone -ftree-loop-distribute-patterns 

la velocità è ancora 30 ms.

+2

ottimizzazione non è una scienza perfetta. Non c'è una ragione precisa per pensare che stai facendo qualcosa di sbagliato (ma dal momento che non hai fornito la tua metodologia per prendere queste misure, non c'è modo di sapere che non stai facendo qualcosa di sbagliato pure). – mah

+1

Almeno le opzioni di ottimizzazione GCC non garantiscono prestazioni più veloci per il set di opzioni di prestazioni. Ci sono molte cose, meno dimensioni potrebbero accelerare le prestazioni di più, ad es. colpi di cache, previsione delle diramazioni, ecc. –

+0

Per quello che vale, i documenti fanno ** non ** dicono esplicitamente che -O3 è -O2 più alcune opzioni extra - possono fare cose completamente diverse _in aggiunta a_ attivando quei flag di ottimizzazione, almeno dal testo della documentazione che hai pubblicato. – CmdrMoozy

risposta

7

È possibile ottenere g++ per mostrare ciò che le opzioni è attiva con l'opzione -Q:

g++ -c -Q -O3 --help=optimizers 

L'output è qualcosa di simile:

-O<number> 
    -Ofast 
    -Os 
    -falign-functions      [enabled] 
    -falign-jumps       [enabled] 
    -falign-labels      [enabled] 
    -falign-loops       [enabled] 
    -fasynchronous-unwind-tables   [enabled] 
    -fbranch-count-reg     [enabled] 
    -fbranch-probabilities    [disabled] 
    -fbranch-target-load-optimize   [disabled] 
    -fbranch-target-load-optimize2  [disabled] 
    -fbtr-bb-exclusive     [disabled] 
    -fcaller-saves      [enabled] 
    -fcombine-stack-adjustments   [enabled] 
    -fcommon        [enabled] 
    -fcompare-elim      [enabled] 
    -fconserve-stack      [disabled] 
    -fcprop-registers      [enabled] 
    -fcrossjumping      [enabled] 
    -fcse-follow-jumps     [enabled] 
    -fcx-fortran-rules     [disabled] 
    -fcx-limited-range     [disabled] 
    -fdata-sections      [disabled] 
    -fdce         [enabled] 
ETC.. 
+0

Grazie. Quindi mostra un'altra opzione aggiuntiva con O3: -ftree-loop-distribute-patterns. Quando lo aggiungo alle opzioni impostate, la velocità è ancora 30ms. – klm123

Problemi correlati