2010-03-14 12 views
7

Esiste un metodo per trovare automaticamente le migliori opzioni del compilatore (su una determinata macchina), che risultano nell'eseguibile più veloce possibile?Trova automaticamente le opzioni del compilatore per l'exe più veloce su una determinata macchina?

Naturalmente, io uso g++ -O3, ma ci sono altri flag che possono far funzionare il codice più velocemente, ad es. -ffast-math e altri, alcuni dei quali sono dipendenti dall'hardware.

Qualcuno conosce un codice che posso inserire nel mio file configure.ac (GNU autotools), in modo che i flag vengano aggiunti automaticamente al Makefile tramite il comando ./configure?

Oltre a determinare automaticamente i migliori flag, sarei interessato ad alcuni utili flag del compilatore che sono buoni da usare come default per i file eseguibili più ottimizzati.

Aggiornamento: La maggior parte delle persone suggerisce di provare solo bandiere diverse e selezionare le migliori in modo empirico. Per quel metodo, avrei una domanda successiva: Esiste un'utilità che elenca tutti i flag del compilatore che sono possibili per il computer su cui sto lavorando (ad esempio, test se le istruzioni SSE sono disponibili, ecc.)?

+5

Le opzioni di ottimizzazione "migliori" dipendono da ciò che effettivamente fa il codice. Solo tu lo sai. –

+1

E per farlo 'andare alle undici' dovresti profilarlo. Ci sono pochi pranzi gratuiti a sinistra in termini di commutatori del compilatore. –

+1

Ok, per adattarlo davvero al mio codice dovrei selezionare manualmente le opzioni e profilarle. Ma non può fare male aggiungere l'appropriato '-march = cpu-type' su quella macchina? E ci dovrebbero essere alcune categorie di programmi che traggono profitto da alcune altre bandiere di compilazione (dipendenti dall'hardware)? Ad esempio, il mio programma rientra nella categoria "usa molte operazioni in virgola mobile". – Frank

risposta

1

Esiste un metodo per trovare automaticamente le migliori opzioni del compilatore (su una determinata macchina), che risultano nell'eseguibile più veloce possibile?

No.

Si potrebbe compilare il programma con un vasto assortimento di opzioni di compilazione, quindi punto di riferimento ogni versione, quindi selezionare quello che è "più veloce", ma non è certo affidabile e probabilmente non utile per il tuo programma.

+1

Il che, BTW, è precisamente ciò che acovea (citato da @ergosys) non: compilare e punto di riferimento le centinaia programma, anche migliaia di volte (che è il motivo per cui il programma deve essere semplice e benchmark corto) con diverse combinazioni di flag di ottimizzazione GCC e "evolvere" un buon set di bandiere usando un algoritmo genetico. –

2

alcuni compilatori offrono l'opzione "veloce" per selezionare automaticamente l'ottimizzazione più aggressiva per un determinato host di compilazione. http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler

Sfortunatamente, g ++ non fornisce bandiere simili.

come follow-up alla domanda successiva, per g ++ è possibile utilizzare l'opzione -mtune insieme a -O3 che fornirà valori predefiniti ragionevolmente veloci. La sfida è quindi trovare il tipo di processore dell'host di compilazione. potresti voler controllare l'archivio delle macro di autoconf, per vedere qualcuno ha scritto i test necessari. altrimenti, assumendo linux, devi analizzare /proc/cpuinfo per ottenere il tipo di processore

4

Non penso che tu possa farlo al momento della configurazione, ma c'è almeno un programma che tenta di ottimizzare i flag di opzioni gcc dato un particolare eseguibile e macchina. Vedere http://www.coyotegulch.com/products/acovea/ per esempio.

Potrebbe essere possibile utilizzare questo con una certa conoscenza dei computer di destinazione per trovare un buon set di opzioni per il codice.

+0

Idem per ATLAS (software per algebra lineare a regolazione automatica), un'implementazione di BLAS/LAPACK. Vedi http://math-atlas.sourceforge.net/ – celion

+0

Il collegamento ad acovea è rotto. Ecco l'alternativa: http: //stderr.org/doc/acovea/html/acoveaga.html – OutputLogic

2

Dopo aver cercato su google, ho trovato questo script: gcccpuopt.

Su una delle mie macchine (32bit), emette:

-march=pentium4 -mfpmath=sse 

su un'altra macchina (a 64 bit) emette:

$ ./gcccpuopt 
Warning: The optimum *32 bit* architecture is reported 
-m32 -march=core2 -mfpmath=sse 

Quindi, non è perfetto, ma potrebbe essere utile.

2

Vedi anche -mcpu=native/-mtune=native opzioni gcc.

+0

Cool, ci proverò. Questo è nuovo in GCC 4.2, quindi dovrò aggiornare ... – Frank

0

questa è una soluzione che funziona per me, ma ci vuole un po 'di tempo per impostare. In "Python Scripting for Computational Science" di Hans Petter Langtangen (un eccellente libro secondo me), un esempio è dato dall'uso di un breve script python per fare esperimenti numerici per determinare le migliori opzioni del compilatore per il tuo C/Fortran/... programma. Questo è descritto nel Capitolo 1.1.11 su "Strutture dati eterogenee annidate".

Il codice sorgente per gli esempi tratti dal libro è disponibile gratuitamente allo http://folk.uio.no/hpl/scripting/index.html (non sono sicuro della licenza, quindi non riprodurrò alcun codice qui), e in in TCSE3-3rd-examples.tar.gz nel file src/app/wavesim2D/F77/compile.py, che puoi usare come base per scrivere uno script appropriato per un particolare sistema/linguaggio (C++ nel tuo caso).

-2

Ottimizzare la vostra applicazione è principalmente il tuo lavoro, non il compilatore.

Here's an example of what I'm talking about.

Una volta fatto questo, se la vostra applicazione è compute-bound, con hotspot nel codice (non nel codice della libreria), l'ottimizzazioni del compilatore per la velocità farà qualche differenza, in modo da poter provare diverse combinazioni di bandiere.

Problemi correlati