2012-05-11 27 views
63

Ho provato a scrub la pagina man di GCC per questo, ma ancora non capisco, davvero.GCC: com'è diversa la marcia da mtune?

Qual è la differenza tra -march e -mtune?

Quando si utilizza solo -march, con entrambi? È mai possibile solo -mtune?

risposta

80

Se si utilizza -march GCC sarà libero di generare istruzioni che funzionano sulla CPU specificata, ma non su (in genere) precedenti CPU della famiglia di architetture. Se si utilizza -mtune, il compilatore genererà il codice che funziona su ognuno di essi, ma favorirà sequenze di istruzioni più veloci sulla specifica CPU indicata.

+8

Non risponde se ha senso utilizzare entrambi o se mtune è ridondante quando impostato sullo stesso valore. –

+7

@ PavelŠimerda Intuitivamente la risposta è implicita nella definizione delle 2 caratteristiche. Inoltre, la documentazione afferma esplicitamente che 'march' implica' mtune'. Quindi, le risposte alle tue obiezioni sono no e sì rispettivamente. –

+0

Grazie per aver spiegato questo in modo così elegante! Lo rendi facile da capire. –

35

questo è quello che Googled up:

L'opzione -march=X prende un nome di CPU X e permette GCC per generare il codice che utilizza tutte le funzionalità del X. Il manuale GCC spiega esattamente quali nomi di CPU significano quali famiglie e caratteristiche della CPU.

Perché funzioni di solito sono aggiunti, ma non rimosso, un binario compilato con -march=X verrà eseguito su CPU X, ha una buona possibilità di correre su CPU più recente rispetto X, ma sarà quasi certamente non funzionare su qualsiasi cosa più grande di X. Alcuni set di istruzioni (3DNow !, suppongo?) Possono essere specifici per un particolare fornitore di CPU, facendo uso di questi probabilmente otterrete binari che non funzionano su CPU concorrenti, più recenti o meno.

L'opzione -mtune=Y sintonizza il codice generato per essere eseguito più rapidamente su Y rispetto alle altre CPU su cui potrebbe essere eseguito. -march=X implica -mtune=X. -mtune=Y non si ignorare -march=X, così, per esempio, probabilmente non ha senso -march=core2 e -mtune=i686 - il codice non verrà eseguito su qualsiasi cosa più grande di core2 in ogni caso, a causa di -march=core2, quindi perché sulla Terra si vorrebbe ottimizzare per qualcosa di più antico (meno caratteristico) rispetto a core2? -march=core2 -mtune=haswell ha più senso: non utilizzare alcuna funzione oltre a quanto fornito da core2 (che è ancora molto di più di quello fornito da -march=i686!), Ma ottimizzare il codice per CPU più recenti haswell, non per core2.

C'è anche -mtune=generic. generic fa sì che GCC produca il codice più adatto alle attuali CPU (ovvero le variazioni da generic da una versione di GCC a un'altra). Ci sono voci sui forum di Gentoo che -march=X -mtune=generic produce codice che viene eseguito più rapidamente su X rispetto al codice prodotto da -march=X -mtune=X (o solo -march=X, come -mtune=X è implicito). Non ho idea se sia vero o no.

In genere, se non sai esattamente quello che ti serve, sembra che la cosa migliore è quello di specificare -march=<oldest CPU you want to run on> e -mtune=generic (-mtune=generic è qui per contrastare l'implicita -mtune=<oldest CPU you want to run on>, perché probabilmente non si vuole ottimizzare per la CPU più vecchia) . O solo -march=native, se mai andrai a correre solo sulla stessa macchina su cui hai costruito.

Problemi correlati