Gentoo offre molti tipi di personalizzazioni in fase di compilazione. Anche chi non utilizza Gentoo avrà (a lungo andare) sentito parlare di make.conf. make.conf è il file di configurazione che informa portage su cosa e come passare alcuni parametri di ottimizzazione al compilatore. Tra i vari (tanti) parametri di ottimizzazione che il compilatore offre spicca tra tutti -march , che nella riga del make.conf è contenuta in una riga simile a CFLAGS=”-O2 -march=native -pipe” .

Non mi avventuro nella spiegazione di sudetto parametro , ma vorrei soffermarmi su -march il quale indica al compilatore per quale tipo di Cpu ottimizzare il codice della compilazione .

Esempio : -march=pentium ottimizzerà il codice per un pentium di prima generazione ; -march = pentiumpro ottimizzerà il codice per un pentium pro e così via. Compilazioni generiche sono : x86_64 , i686 , i586 etc per codice comune a quelle architetture non eccessivamente ottimizzato. Dalla versione 4.2 di GCC è possibile passare il parametro native a -march ; questo setterà automaticamente le opzioni della propria cpu nel caso si abbia dei dubbi su cosa passare al compilatore. Ma “native” quale impostazione utilizzerà ? Quale “architettura” passerà al compilatore ? Scopriamolo con questo test :

# gcc -march=native -E -v – </dev/null 2>&1 | sed -n ‘s/.* -v – //p’
Controllare cosa riporta nell’output il parametro -mtune=

Esempio su un processore Intel(R) Core(TM)2 Solo CPU U3500 @ 1.40GHz :

# gcc -march=native -E -v – </dev/null 2>&1 | sed -n ‘s/.* -v – //p’
Riporterà :

gcc -march=native -E -v – </dev/null 2>&1 | sed -n ‘s/.* -v – //p’
-march=core2 -mcx16 -msahf -mno-movbe -mno-aes
-mno-pclmul -mno-popcnt -mno-abm -mno-lwp -mno-fma -mno-fma4
-mno-xop -mno-bmi -mno-tbm -mno-avx -mno-sse4.2 -msse4.1
–param l1-cache-size=32 –param l1-cache-line-size=64
–param l2-cache-size=3072 -mtune=core2

Quindi per la CPU Intel U3500 -march=native imposterà l’ottimizzazione per un core2.

Un ulteriore codice da passare al compilatore per scoprire come verrà settata -march è :

gcc -march=native -E -v – &1 | grep mtune
Che restituirà un output simile al seguente :

/usr/libexec/gcc/x86_64-pc-linux-gnu/4.6.3/cc1
-E -quiet -v -march=core2 -mcx16 -msahf -mno-movbe
-mno-aes -mno-pclmul -mno-popcnt -mno-abm
-mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi
-mno-tbm -mno-avx -mno-sse4.2 -msse4.1 –param l1-cache-size=32
–param l1-cache-line-size=64 –param l2-cache-size=3072 -mtune=core2