2009-11-14 22 views
26

Non sono sicuro se dovrei pubblicare questa domanda qui, perché questo sembra essere un sito web orientato alla programmazione.Qualcuno qui ha un benchmark con Intel C++ e GCC?

In ogni caso, penso che qui ci siano alcuni guru che lo sanno.

Ora ho un server AMD Opteron con CentOS 5. Voglio avere un compilatore per un programma C++ Boost abbastanza grande. Quale compilatore dovrei scegliere?

+0

finché il compilatore viene eseguito con/switch veloce e gira su una CPU intel (il compilatore deve essere eseguito su una CPU Intel, non necessariamente sul programma compilato), si ottiene un codice più efficiente in generale. –

risposta

18

Spero che questo aiuta più di ferite :)

ho fatto una piccola sparatoria compilatore a volte più di un anno fa, e sto andando fuori di memoria.

  1. GCC 4.2 (Apple)
  2. Intel 10
  3. GCC 4.2 (Apple) + LLVM

ho provato più programmi di elaborazione di modelli pesanti segnale audio che avevo scritto.

Tempi di compilazione: il compilatore Intel era di gran lunga il compilatore più lento, più di "2x volte più lento" di un altro pubblicato.

GCC ha gestito modelli profondi molto bene rispetto a Intel.

Il compilatore Intel ha generato file di oggetti enormi.

GCC + LLVM ha restituito il binario più piccolo.

Il codice generato potrebbe presentare una variazione significativa a causa della costruzione del programma e in cui è possibile utilizzare SIMD.

Per il modo in cui scrivo, ho scoperto che GCC + LLVM ha generato il codice migliore. Per i programmi che avevo scritto prima ho preso sul serio l'ottimizzazione (come ho scritto), Intel era generalmente migliore.

I risultati di Intel varia; ha gestito alcuni programmi molto meglio, e alcuni programmi molto peggio. Ha gestito molto bene l'elaborazione non elaborata, ma conferisco a GCC + LLVM la torta perché quando inserita nel contesto di un programma più grande (normale) ... ha funzionato meglio.

Intel ha vinto per la prima volta, il numero di crunch su enormi set di dati.

GCC da solo ha generato il codice più lento, sebbene possa essere altrettanto veloce con le misurazioni e le nano-ottimizzazioni. Preferisco evitare quelli perché il vento potrebbe cambiare direzione con la prossima versione del compilatore, per così dire.

Non ho mai misurato programmi scritti male in questo test (cioè i risultati hanno sovraperformato le distribuzioni delle librerie di prestazioni più diffuse).

Infine, i programmi sono stati scritti su diversi anni, utilizzando GCC come compilatore primario in quel momento.

Aggiornamento: stavo attivando anche ottimizzazioni/estensioni per Core2Duo. I programmi erano abbastanza puliti da consentire un rigoroso aliasing.

+0

Potresti approfondire cosa intendi per 'per come scrivi'? – int3

+3

@ int3 In breve, per programmi ottimizzati, scrivo: incredibilmente rigorosamente/piccolo, costringo il compilatore a valutare il programma, fornire specializzazioni/sovraccarichi, fare di tutto per ottenere il polimorfismo del tempo di compilazione (rispetto al runtime), fornire molto visibilità al compilatore, uso di molte funzionalità linguistiche come previsto, correttezza costante, forzare l'inlining, avere una lista di avvertimenti incredibilmente lunga. Misuro e punto di riferimento, non in linea asm.Specifico per i tiri del compilatore; Mi fermo prima di riscrivere i programmi per sfruttare gli insin di vettorizzazione/SIMD, (un'area in cui il compilatore di Intel era eccellente). Spero che aiuti. – justin

24

C'è un interessante PDF here che confronta un numero di compilatori.

+2

Psssstttttt .... Stavo per pubblicarlo. In realtà si parla solo di micro-ottimizzazione, e sembra implicare che gcc sia migliore di icc nella maggior parte dei casi. – dmckee

+3

Sì, è un documento interessante su questo fronte. Vorrei poter ottenere l'integrazione di Visual astudio per GCC. Sarebbe il mutt's nuts ... – Goz

1

Ero abituato a lavorare su un sistema di elaborazione del segnale abbastanza grande che girava su un grande cluster. Prima eravamo soliti fare calcoli matematici pesanti, il compilatore Intel ci ha fornito circa il 10% in meno di carico della CPU rispetto a GCC. È molto poco scientifico, ma è stata la nostra esperienza (circa 18 mesi fa).

Che cosa sarebbe stato interessante se avessimo potuto usare anche le librerie matematiche di Intel che usano il loro chipset in modo più efficiente.

14

Il team MySQL ha pubblicato una volta che icc ha dato loro un aumento di prestazioni del 10% rispetto a gcc. Proverò a trovare il link.

In generale ho trovato che i compilatori 'indigene' prestazioni migliori rispetto gcc sulle rispettive piattaforme

edit: ero un po 'fuori. I guadagni tipici erano del 20-30% non del 10%. Alcuni casi limitati hanno raddoppiato le prestazioni. http://www.mysqlperformanceblog.com/files/presentations/LinuxWorld2004-Intel.pdf

5

Usiamo il compilatore Intel sul nostro prodotto (DB2), su Linux e Windows IA32/AMD64, e su OS X (vale a dire tutti i nostri porti piattaforma Intel tranne SunAMD).

non so i numeri, ma le prestazioni sono abbastanza buono che abbiamo:

  • paga per il compilatore, che mi hanno detto è molto costoso.
  • convivono con tempi di costruzione 2 volte più lenti (principalmente a causa del tempo che impiega ad acquisire le licenze prima di consentirne l'esecuzione).
6

Suppongo che varia a seconda del codice, ma con la base di codice cui sto lavorando ora, ICC 11,035 dà un miglioramento quasi 2x sopra gcc 4.4.0 su un Xeon 5504.

opzioni ICC: -O2 -fno-alias
opzioni gcc: -O3 -msse3 -mfpmath=sse -fargument-noalias-global

le opzioni sono specifiche per solo il file che contiene il codice di calcolo intensivo, dove so che non c'è aliasing. Codice a thread singolo con un ciclo nidificato a 5 livelli.

Anche se autovettorizazione è abilitato, né i compilatori generano codice vettorizzati (non una colpa dei compilatori)


Aggiornamento (2015/02/27): Mentre l'ottimizzazione del codice di geofisica (Q2, 2013) a eseguito su Sandy Bridge-E Xeons, ho avuto l'opportunità di confrontare le prestazioni di ICC 11.1 con GCC 4.8.0 e GCC stava ora generando codice più veloce di ICC. Il codice utilizzato per gli intrinsechi AVX utilizzava istruzioni vettoriali a 8 vie (nieither il compilatore ha automatizzato il codice correttamente a causa di determinati requisiti di layout dei dati).Inoltre, l'implementazione LTO di GCC (con il core IR incorporato nei file .o) era molto più facile da gestire rispetto a quella in ICC. GCC con LTO era in esecuzione circa 3 volte più veloce di ICC senza LTO. Non sono in grado di trovare i numeri in questo momento per GCC senza LTO, ma ricordo che era ancora più veloce di ICC. Non è affatto una dichiarazione generale sulle prestazioni di ICC, ma i risultati sono stati sufficienti per consentirci di procedere con GCC 4.8. *.

In attesa di GCC 5.0 (http://www.phoronix.com/scan.php?page=article&item=gcc-50-broadwell)!

+0

Scusa, avrebbe dovuto essere -fargument-noalias-global per gcc, not -fno-alias –

+1

Grazie per aver postato questo. Dopo aver letto il tuo articolo, ho provato le tue opzioni gcc. Avevo provato il mio programma con '-O3' senza notare molti miglioramenti, ma' -O3 -msse3' ha fatto un * enorme * miglioramento del mio programma! Le cose che sto facendo (audio DSP) sono abbastanza vettorializzabili, ma non ho ancora visto il codice generato. Ma il mio programma supera la sua suite di test, e lo fa in meno di 2/3 del tempo che ha fatto prima! – steveha

+0

@steveha Cool! Inoltre, prova a utilizzare -fargument-noalias-global se sai che non c'è aliasing nel codice, o che limita selettivamente i tuoi puntatori usando la parola chiave restrict. Ciò conferisce al compilatore molta più flessibilità nel riordino delle istruzioni. Ha dato un enorme incremento di prestazioni quando stavo ottimizzando alcuni codici video per un DSP TI –

1

ho usato UnixBench (v 5.1.3.) su un openSUSE 12.2 (kernel x86_64 3.4.33-2.24-default), e compilato prima con GCC, e quindi con il compilatore di Intel.

Con 1 copia parallela, UnixBench compilato con Intel è circa il 20% più veloce rispetto alla versione compilata con GCC. Tuttavia questo nasconde enormi differenze. Dhrystone è circa il 25% più lento con il compilatore Intel, mentre Whetstone viene eseguito 2x più velocemente.

Con 4 copie di UnixBench in esecuzione in parallelo, il miglioramento del compilatore Intel su GCC è solo del 7%. Ancora una volta Intel è molto più brava a Whetstone (> 200%), e più lenta a Dhrystone (circa il 20%).

0

Molte ottimizzazioni eseguite dal compilatore Intel richiedono di routine una sintassi sorgente specifica e l'uso di -O3 -ffast-math per gcc. Sfortunatamente, il componente -funsafe-math-optimization di -ffast-math -O3 -march = nativo si è rivelato incompatibile con -fopenmp, quindi devo dividere i miei file sorgente in gruppi chiamati con le diverse opzioni in Makefile. Oggi mi sono imbattuto in un errore in cui una build di g ++ con -O3 -ffast-math -fopenmp -march = native era in grado di scrivere sullo schermo ma non di reindirizzare su un file. Una delle differenze più eclatanti a mio parere è l'ottimizzazione di icpc solo di std :: max e min dove gcc/g ++ vuole che fmax | min [f] con -ffast-math per cambiare il loro significato lontano dallo standard.