-O2 e -O3

3 risposte [Ultimo messaggio]
Ritratto di LeoEdre
LeoEdre
(Monster)
Offline
Monster
Iscritto: 21/01/2007
Messaggi: 371

Ho impostato alcune variabili di ottimizzazione CFLAGS, tra cui -O3.
Lanciando lo script ./configure, viene creato un Makefile che contiene sia i miei CFLAGS, sia altri aggiunti automaticamente, tra cui l'opzione -O2.
E' normale? Come si comporta il compilatore nel caso trovi sia -O2 che -O3?

Ritratto di michele-p
michele-p
(Guru)
Offline
Guru
Iscritto: 22/01/2007
Messaggi: 3268

...laddove c'è -O2 applica le ottimizzazioni relative all'impostazione medesima, alias (da "man gcc");

Quote:

Optimize even more. GCC performs nearly all supported optimizations that do not involve a spacespeed tradeoff. The compiler does not perform loop unrolling or function inlining when you specify -O2. As compared to -O, this option increases both compilation time and the performance of the generated code.
-O2 turns on all optimization flags specified by -O. It also turns on the following optimization flags: -fthread-jumps -fcrossjumping -optimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks -fgcse -fgcse-lm -fexpensive-optimizations -frerun-cse-after-loop fcaller-saves -fpeephole2 -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fregmove -fstrict-aliasing -fstrict-overflow -fdelete-null-pointer-checks -freorder-blocks -freorder-functions -falign-func‐tions -falign-jumps -falign-loops -falign-labels -ftree-vrp -ftree-pre

mentre per -O3 (sempre dal manuale in linea);

Quote:

Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the -fin‐line-functions, -funswitch-loops and -fgcse-after-reload options.

Bye

Ritratto di LeoEdre
LeoEdre
(Monster)
Offline
Monster
Iscritto: 21/01/2007
Messaggi: 371

Quote:

michele-p ha scritto:
...laddove c'è -O2 applica le ottimizzazioni relative all'impostazione medesima, alias (da "man gcc");

Quote:

Optimize even more. GCC performs nearly all supported optimizations that do not involve a spacespeed tradeoff. The compiler does not perform loop unrolling or function inlining when you specify -O2. As compared to -O, this option increases both compilation time and the performance of the generated code.
-O2 turns on all optimization flags specified by -O. It also turns on the following optimization flags: -fthread-jumps -fcrossjumping -optimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks -fgcse -fgcse-lm -fexpensive-optimizations -frerun-cse-after-loop fcaller-saves -fpeephole2 -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fregmove -fstrict-aliasing -fstrict-overflow -fdelete-null-pointer-checks -freorder-blocks -freorder-functions -falign-func‐tions -falign-jumps -falign-loops -falign-labels -ftree-vrp -ftree-pre

mentre per -O3 (sempre dal manuale in linea);

Quote:

Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the -fin‐line-functions, -funswitch-loops and -fgcse-after-reload options.

Bye

Ma quindi se ci sono entrambi applica comunque anche le impostazioni di -O3?

Ritratto di michele-p
michele-p
(Guru)
Offline
Guru
Iscritto: 22/01/2007
Messaggi: 3268

...certo, e te ne accorgi durante la fase di compilazione poiché nell'output del comando make (per dirla in maniera grezza; quando appaiono tutte le scritte durante la fse di compilazione); in alcune parti c'è l'-O2 in altre l'-O3. Puoi ancora ulteriormente ottimizzare usando il flag -march.
Ad esempio io che ho un AMD Thunderbird oltre a -O3 passo anche -march=athlon-tbird ....così come ve ne sono delle altre. Le ottimizzazioni (ed in ogni caso le "direttive" della compilazione) sono nei file Makefile. Se hai un programma scritto in C++ e vuoi procedere all'ottimizzazione puoi dare, nell'ordine, il comando (ad esempio con il mio AMD);

export CXXFLAGS="-O3 -march=athlon-tbird"

./configure (eventualmente imponi anche qui altri parametri)

make

make install (questo da root se devi andare a installare in una cartella dove l'utente normale ha permessi ristretti oppure direttamente da utente normale se installi il programma compilato, ad esempio, nella home utente dove hai i permessi di lettura/scrittura).
E' chiaro che se il programma è un "misto" di C++ e C, le ottimizzazioni di cui sopra interessereanno solo la parte in C++, mentre la parte in C verrà compilata con le solite opzioni di default alias proprio l'-O2. Per evitare ciò allora si potrà dare anche;

export CFLAGS="-O3 -march=athlon-tbird"

In genere le variabili d'ambiente sulle quali agire appaiono fornendo il comando;

./configure --help

Bye