Compilatore Intel Fortran: suggerimenti sull'ottimizzazione durante la compilazione


21

Inizierò con la mia esperienza personale nel nostro laboratorio. Negli ifort 9 e 10 giorni, eravamo piuttosto aggressivi con le ottimizzazioni, compilando con -O3 e flag specifici del processore (-xW -xSSE4.2 per esempio). Ma a partire da ifort 11, abbiamo iniziato a notare:
1. alcune incongruenze nei risultati (perché la semantica non è stata preservata)
2. guadagni minori rispetto a -O2.

Quindi al momento, di solito compiliamo semplicemente con -O2 e -xhost. Hai suggerimenti migliori con ifort 11? Questo cambierà ancora una volta mentre passiamo a ifort 12? Grazie in anticipo.


7
Le ottimizzazioni non avvantaggiano tutti i codici in modo uniforme. Quindi, penso che una domanda migliore sarebbe "Come potrei profilare il mio codice per dire quali ottimizzazioni del compilatore sono efficaci?"
Matt Knepley,

1
Perché la semantica non è stata preservata o perché qualcosa è stato riordinato? Questo potrebbe vagare un po 'dall'argomento, ma sarebbe bello vedere uno snippet di codice che riproduce il problema. È possibile che qualcosa sia stato riordinato in un modo che non ti piace, ma che il compilatore pensa che dovrebbe andare bene. La mia esperienza è che Intel 12 svolge un lavoro di vettorializzazione migliore rispetto a qualsiasi dei suoi predecessori, quindi mi aspetto che vengano apportati più cambiamenti quando si passa all'ultimo.
Bill Barth,

Pensavo che la semantica non fosse preservata era equivalente all'ordinamento non conservato. Ad ogni modo, mi rendo conto che la mia domanda è (troppo?) Generica e non volevo soffermarmi sui dettagli. Abbiamo avuto diversi problemi con Intel 10, alcuni erano bug del compilatore e alcuni sono stati lasciati inspiegabili. Quindi, con 11, lo abbiamo suonato in modo sicuro e siamo stati contenti dell'esibizione. Ma forse stiamo giocando in modo troppo sicuro e volevo sapere se la community avesse qualche consiglio.
FrenchKheldar,

Risposte:


16

Consigliamo vivamente a tutti i nostri utenti di iniziare -O3 -xHost -iposia con ifort 11 che con ifort 12. Se ci sono particolari trasformazioni in virgola mobile abilitate da O3 che influiscono sulla precisione di alcuni dei tuoi calcoli, puoi disattivarle in modo specifico con -fp-model precise -fp-model except(o, più drasticamente, -fp-model strict) pur mantenendo le altre ottimizzazioni abilitate da O3, come il blocco dei loop per cache, fusione e srotolamento dei loop e ottimizzazioni dell'accesso alla memoria.

Consiglio di provare le cose del modello in virgola mobile su singoli file e scoprire dove fa la differenza, piuttosto che spegnerlo a livello globale; può essere un aumento di velocità del 15% circa e vuoi essere in grado di mantenerlo dove non influisce sui tuoi calcoli. Se non sei sicuro di dove sia influenzata la precisione, puoi giocare con l'attivazione e la disattivazione delle bandiere del modello a virgola mobile per quei file o con le modalità di arrotondamento .

Di recente abbiamo tenuto un breve discorso ai nostri utenti sui flag di ottimizzazione, concentrandoci sui compilatori gnu e Intel per x86; puoi vedere le diapositive di quel discorso qui .

Per inciso, mentre stiamo parlando di scegliere flag di ottimizzazione per il tuo codice, ogni tanto vale anche la pena guardare l'output di -vec-report per vedere dove il compilatore ha tentato di vettorializzare un loop e non ci è riuscito; a volte ci sono piccole modifiche che puoi apportare al tuo loop che possono comportare la possibilità di vettorializzare (che può essere un 4x speedup). Allo stesso modo per il più generale -opt-report .


Mi piace la tua risposta ma l'ho riprovata con una delle nostre testcase e ho -O3 -xhost -fp-model precise -fp-model exceptprovocato un rallentamento del 30% . -vec-report
Guarderò di

2
Oltre -O2 -xhost? Interessante; è molto insolito ma può succedere. In casi come questo, l'ottimizzatore sta facendo qualcosa che ha buone ragioni per pensare che migliorerà la velocità, ma si scopre che peggiora le cose. Di solito per il codice scientifico, che ha una struttura abbastanza semplice, ciò non accade. In casi come questo, l'ottimizzazione guidata del profilo - software.intel.com/sites/products/documentation/hpc/compilerpro/… - può spesso aiutare.

5

Lavoro per un'azienda che produce grandi applicazioni altamente tecniche a Fortran con IFort: le applicazioni sono molto importanti per le prestazioni, poiché la velocità (pur mantenendo l'accuratezza) è il principale punto di forza.

Compiliamo sempre con -O3 e, per quanto ne so, le cose principali che fanno -O3 sono lo svolgimento e il prefetching in loop. Sospetto che la maggior parte delle applicazioni informatiche scientifiche tragga grandi benefici da questi, in particolare dalle ottimizzazioni del ciclo. Non vediamo errori del compilatore da un po 'di tempo (anche se abbiamo visto alcuni errori del linker quando si utilizza Ifort su un Mac). Usiamo l'11.1.095.

Spero che aiuti.


4

Mi rendo conto che questa risposta è probabilmente molto, troppo tardi, ma per l'ottimizzazione aggressiva, l'opzione "-veloce" sembra la soluzione più semplice. Estratti dalla pagina man:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.