# Switch a gcc-{4.5,4.6,4.7,4.8,4.9,5.x,6.x,7.x,8.x,9.x}

## ago

Questo topic vuole raccogliere l'attenzione di tutti coloro che non usano -march=native ma preferiscono specificare manualmente evitando tutte le ottimizzazioni che native include.

Mi sono accorto che con il passaggio a gcc-4.5.3 e gcc-4.6.2 il mio -march sul portatile è passato da prescott a pentium-m e sul fisso da core2 a corei7. Quindi onde evitare di affidarvi a documentazione/i poco aggiornate, potete controllare il vostro con:

```
gcc -march=native -E -v - </dev/null 2>&1 | sed -n 's/.* -v - //p'
```

ovviamente dopo aver fatto lo switch di gcc da gcc-config e aver lanciato source /etc/profile come il relativo warning suggerisce  :Wink: 

P.S. Aprirò un bug per vedere se inseriscono una cosa simile nella doc ufficiale.Last edited by ago on Wed May 29, 2019 8:16 am; edited 6 times in total

----------

## fbcyborg

Quindi ora sparisce la march core2 e la si può sostituire tranquillamente con corei7 se non ho capito male.

Questa modifica quando va fatta?

----------

## ago

Quando aggiorni il tuo gcc fai un controllo, e inserisci quello che fa per te.

----------

## djinnZ

march core2 non sparisce (almeno per il momento), solo che invece di -march=core2 -msse4 etc. (non ho voglia di andarmi a vedere quali sono le flag implicite) basterà scrivere solo -march=corei7.

Il risultato in linea di massima non cambia quindi non c'è da andare a ricompilare il sistema ma è meglio tenere i parametri aggiornati.

@ago: del bug di gcc -Q --help=target -march=native che non riporta le sse attivate (per dirne una) si sa qualcosa?

----------

## Cazzantonio

Non so come funziona per gcc-4.6 (che è hardmasked) ma per il 4.5 pare che valga ancora questa cosa:

http://en.gentoo-wiki.com/wiki/Hardware_CFLAGS

Ovvero che -mtune=generic funzioni meglio di -mtune=core2, e quindi anche di -march=native quando applicata ad un processore core2

Non penso che cambi il mondo eh... ma visto che passavo di qui per controllare cosa succedeva col gcc nuovo ho pensato di far notare come non sempre una brand new option in gcc si traduca sempre in un vantaggio  :Wink: 

----------

## ago

@djinnz

da me funzia =) gcc 4.4.5. Ti riferisci a bug in versioni maggiori o uguali di 4.5?

 *Cazzantonio wrote:*   

> Ovvero che -mtune=generic funzioni meglio di -mtune=core2, e quindi anche di -march=native quando applicata ad un processore core2Non penso che cambi il mondo eh... ma visto che passavo di qui per controllare cosa succedeva col gcc nuovo ho pensato di far notare come non sempre una brand new option in gcc si traduca sempre in un vantaggio 

 

Ci sono sul fatto che: "feature nuova" = non sempre beneficio e miglioramento, ma non capito in che modo è legato a questo caso/esempio

----------

## Cazzantonio

Mi riferisco a quella pagina dello wiki che ho linkato. Non ho fatto test estensivi, ma in alcune simulazioni numeriche della durata di qualche ora pare ci sia un leggero vantaggio nell'usare mtune=generic

----------

## table

Ho una CPU sandy bridge (core i5-2410).

Il gcc 4.52 me lo riconosce ancora come "core2" , devo aspettare il 4.6 ?   :Crying or Very sad: 

----------

## ago

 *table wrote:*   

> Ho una CPU sandy bridge (core i5-2410).
> 
> Il gcc 4.52 me lo riconosce ancora come "core2" , devo aspettare il 4.6 ?  

 

L'importante è usare il -march corretto. Ad ogni modo sta per essere stabilizzato gcc-4.5.3-r1

----------

## ChemMir

Ciao!

per ragioni computazionali dovrei provare ad usare gcc 4.6.1-r1 (l'ultimo uscito), su Opteron 6168.

Mi serve il compilatore gfortran. Pare infatti che le librerie ACML 5.0.0 si possano usare solo con gcc > 4.6

Ho due domande:

1) una volta modificati /etc/portage/package.keywords e /etc/portage/package.unmask basta fare 'emerge gcc'. Scusate l'ignoranza, ma come posso selezionare gcc 4.6 per i miei test dicompilazione e tornare al 4.5.3 per le normali operazioni? uso gcc-config?

2) quali opt sono meglio per Opteron 6168?

Per ora uso -march=native -msse4a

Grazie!

Edit: in effetti gli switch che uso con gcc 4.5.3 sono: -march=native -m64 -msse4a -O3 -mveclibabi=acml

----------

## djinnZ

 *ChemMir wrote:*   

> uso gcc-config?

 si, puoi anche pensare di creare un utente dedicato e lasciare il gcc di sistema com'è.

Se vuo mantenere il vecchio gcc senza rischiare che un depclean te lo pialli ricorda di dare un emerge -n =sys-devel/gcc-versione o sys-devel/gcc:slot (come si dovrebbe fare con i kernel)

 *ChemMir wrote:*   

> Per ora uso -march=native -msse4a

 ago ha postato un comando, vedi cosa riporta e vai a vedere sulla documentazione ufficiale di gcc cosa implica -march (ci sarebbe un altro metodo con --help= ma attualmente non funziona molto bene, potresti provare a vedere se hanno risolto) *ChemMir wrote:*   

> -march=native -m64 -msse4a -O3 -mveclibabi=acml

 tutte altamente sconsigliate in make.conf

----------

## Onip

proprio ieri è stata aggiornata la guida all'aggiornamento di gcc. Per gestirlo ti basta entrare in una shell di root e cambiare il profilo con gcc-config e riaggiornare l'environment (vedi comandi nella guida). Dopo basta entrare in una nuova shell di login e vedrai che gcc -v ti darà la nuova versione. Per degli esperimenti e delle compilazioni "private" di tuoi progetti probabilmente puoi evitarti la ricompilazione di libtool che è spiegata nella guida.

Per tornare indietro ti basta semplicemente ripetere gcc-config e env-update.

A quello che so non è, purtroppo, possibile impostare un gcc specifico per ogni utente (a meno di giocare con ~/.bashrc e le variabili d'ambiente credo) come è, invece, possibile fare con java-config.

----------

## djinnZ

gcc-config -E  :Rolling Eyes: 

----------

## ChemMir

Grazie per le risposte. Appena ho un attimo di tempo provo con la guida nella speranza di non piallare tutto sulla macchina che sta facendo calcoli...

 *djinnZ wrote:*   

>  *ChemMir wrote:*   -march=native -m64 -msse4a -O3 -mveclibabi=acml tutte altamente sconsigliate in make.conf

 

Non sono in make.conf, ma nel Makefile del pacchetto sorgente che devo compilare. Per quale motivo non vanno bene? Solo nel make.conf o in generale? A me serve la massima velocità di esecuzione per questo eseguibile, e mi serve poter sfruttare al max l'opteron (quindi con librerie vettoriali...).

Ho eseguito il comando 

```
gcc -march=native -E -v - </dev/null 2>&1 | sed -n 's/.* -v - //p'
```

ed ecco il risultato:

```
-D_FORTIFY_SOURCE=2 -march=amdfam10 -mcx16 -msahf -mpopcnt -mabm --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=amdfam10

```

Sembra che qui tutto quasi normale... o no?

----------

## djinnZ

dopo aver installato l'altro gcc (dopo) prova a vedere con quello native cosa implica. Potrebbe essere che con il 4.6 -march=native renda ridondante -msse4a per dirne una.

-m64 è sconsigliato come impostazione globale sui sistemi "multilib" per ovvie ragioni, -mveclibabi è da utilizzare solo per un singolo pacchetto, -O3 su gcc > 3.6 in genere è controproducente per le prestazioni se non dannoso su molti pacchetti e librerie di base (e mai compilare gcc libc e non ricordo quali altri con quella opzione).

Da evitare in make.conf non in una singola linea di comando od in un singolo pacchetto, se sai quel che stai facendo può essere utile.

Nota che appartengo alla scuola di quelli che non vogliono saperne di usare native se non per verifica una tantum.

----------

## ChemMir

Grazie ancora. Appena la macchina finisce di far calcoli (forse ci va l'intero week-end) provo a ricompilare (Quantum Espresso) e fare test di velocità. Per me è fondamentale sfruttare al max l'hardware (48 core) e far andare al max il software (OpenMP e/o OpenMPI). Bei tempi in cui programmavo in assembler 6502... ora non saprei da dove cominciare...

----------

## ago

@ChemMir

Anche se non sembra sei un pochino off-topic. Questo thread voleva informare gli utenti che i parametri cambiano con le nuove versioni di gcc. Se ti serve maggiore supporto apri un thread nuovo.

----------

## bandreabis

Con gcc-4.5.3-r1 posso già provare il comando?

Ho un Turio64 e per ora ho

```
CHOST="i686-pc-linux-gnu"

CFLAGS="-march=athlon-xp -msse3 -O2 -pipe -fomit-frame-pointer"

CXXFLAGS="${CFLAGS}"
```

Andrea

----------

## fbcyborg

Sì, funziona! Funzionava anche in qualche versione precedente.

----------

## bandreabis

 *bandreabis wrote:*   

> Con gcc-4.5.3-r1 posso già provare il comando?
> 
> Ho un Turio64 e per ora ho
> 
> ```
> ...

 

Ecco il responso: 

```
-D_FORTIFY_SOURCE=2 -march=k8-sse3 -msahf --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=1024 -mtune=k8

```

----------

## fbcyborg

OK, nel mio caso esce core2.

----------

## ago

 *bandreabis wrote:*   

> Ecco il responso: 
> 
> ```
> -D_FORTIFY_SOURCE=2 -march=k8-sse3 -msahf --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=1024 -mtune=k8
> 
> ...

 

Bene, cambia impostazioni =)

----------

## bandreabis

 *ago wrote:*   

>  *bandreabis wrote:*   Ecco il responso: 
> 
> ```
> -D_FORTIFY_SOURCE=2 -march=k8-sse3 -msahf --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=1024 -mtune=k8
> 
> ...

 

Quindi 

```
CFLAGS="-march=k8-sse3 -O2 -pipe -fomit-frame-pointer" 
```

  :Question: 

----------

## djinnZ

no

----------

## bandreabis

 *djinnZ wrote:*   

> no

 

Lo sapevo.

Come funziona allora?

----------

## djinnZ

 *bandreabis wrote:*   

> Come funziona allora?

 grr  :Twisted Evil: 

frettolosamente

...rifletti su questo 

```
model name      : AMD Phenom(tm) II X4 945 Processor

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt npt lbrv svm_lock nrip_save

TLB size        : 1024 4K pages

clflush size    : 64

cache_alignment : 64

power management: ts ttp tm stc 100mhzsteps hwpstate
```

```
-D_FORTIFY_SOURCE=2 -fno-strict-overflow -march=amdfam10 -fPIE -fstack-protector-all
```

```
-D_FORTIFY_SOURCE=2 -march=amdfam10 -mcx16 -msahf -mpopcnt -mabm --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=amdfam10 -fno-strict-overflow -fPIE -fstack-protector-all
```

 *manuale gcc wrote:*   

> amdfam10, barcelona
> 
>     AMD Family 10h core based CPUs with x86-64 instruction set support. (This supersets MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, enhanced 3DNow!, ABM and 64-bit instruction set extensions.)

 

--param influenza l'ottimizzazione ai fini delle pure prestazioni per quel che so, ovvio che -mtune è implicito etc. quindi 

```
CFLAGS="-march=amdfam10 -mcx16 -msahf -mpopcnt -mabm --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -fomit-frame-pointer -O2 -g0"
```

o, seguendo il manuale (e qui non capisco, sono refusi come per mtune?) 

```
CFLAGS="-march=amdfam10 -mcx16 --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512 -fomit-frame-pointer -O2 -g0"
```

Non ho ancora trovato un modo, per verificare quali sse vengono attivate da march, alternativo a --help=target; a me è sempre scassato (qualcuno può verificare se sul gcc "normale" funziona almeno? Non ho da installarmi una gentoo "normale" solo per aprire un bug). IMHO sugli amd più recenti (od è per gli intel ed hanno capito male?) sarebbe il caso di prevenire le ottimizzazioni per mmx e 3dnow (e mettere un bel - alle use corrispondenti in make.conf) perché pare (ho letto in giro ma non so se sono fesserie) che rallentino invece di rendersi utili.

Grazie a chi volesse fornire indicazioni utili in proposito... mica posso sempre fare tutto da solo ...

----------

## loxdegio

Domandone prima di infangarmi con uno switch (chiedo venia se per caso qualcuno abbia già chiesto). 

Ma ci sono reali miglioramenti in prestazioni passando chessò dal 4.7.3 al 4.8.* o 4.9?

Perché da qualche parte ho letto che le prime versioni del 4.8 portavano ad un codice "più pesante" e quindi "più lento" rispetto al 4.7. Non so, poi magari con i nuovi rilasci poi le cose sono cambiate  :Smile: 

Mi rimetto alla vostra sapienza  :Wink: 

----------

## submarcos

Salve a tutti.

Riesumo questo thread un pò "spento" con una domanda.

Ho compilato giusto oggi gcc-10.1.0-r1, quindi ora sul mio sistema sono presenti il 9.2, il 9.3, il 10.1.0 e, appunto, il 10.1.0-r1. Io sto col 9.3. E' il caso di switchare o è bene proseguire con il 9.3?

Che si dice a proposito del 10?

Grazie per qualsiasi chiarimento in proposito.  :Smile: 

----------

## fedeliallalinea

Molti pacchetti falliscono ancora a causa di una flag aggiunta di defualt nella versione 10 di gcc

----------

## submarcos

Grazie fedeliallalinea, gentilissimo come sempre.  :Very Happy: 

----------

## Massimog

io ho problemi solo con il pacchetto sys-apps/iproute2

----------

## ScardracS

Ciao a tutti, personalmente consiglierei di usare il comando

```
gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^\ ]+)//g'
```

Questo perché evita qualsiasi ripetizione già presente in -march.

Per spiegarmi meglio: -march attiva già delle funzionalità di per se, quindi con il comando sopra vengono attivate unicamente le funzionalità supportate dal proprio processore ma non dal comando -march[/code]

----------

