Come faccio a sapere se il mio codice viene vettorializzato dal compilatore?


9

Come esemplificato dalla risposta di Jed Brown ai costi delle ricerche rispetto ai calcoli , l'utilizzo di operazioni in virgola mobile vettorializzate o non vettorizzate comporta un codice molto più veloce. Molti compilatori moderni affermano di poter eseguire la vettorializzazione automatica. Come faccio a quali parti del mio codice vengono vettorializzate correttamente?

Risposte:


10

Con il compilatore Intel di qualsiasi epoca moderna, -O3 -vec-report3. Il livello di ottimizzazione tre garantisce che sta cercando di vettorializzare e il rapporto sui vettori ti dirà cosa sta facendo.

La pagina GNU sulla vettorializzazione dice che è attiva per impostazione predefinita al livello di ottimizzazione 3, ma non riesco a trovare l'equivalente di vec-report.


Grazie per la risposta rapida. Non sapevo di -vec-report3. Hai una preferenza di compilatore quando si tratta di questo tipo di cose (vettorializzazione automatica)?
Matthew Emmett,

I compilatori Intel sono davvero buoni, ma solo per i chip Intel. Devi solo aggiungere tutti i pragmi giusti (#pragma ivdep è il più semplice) GCC 4.7 è migliorato molto ma guardando un po 'di codice con un collega ha ancora dei bug (come nessuna vettorizzazione all'interno di pragmi openmp).
aterrel,

1
Consiglierei di controllare due volte come fa il compilatore Intel con la vettorializzazione su chip AMD. Non sono sicuro al 100% che i problemi del passato esistano ancora.
Bill Barth,

2
@BillBarth Sì, ancora un problema. Vedere l'avviso di ottimizzazione (in molti punti, ad esempio software.intel.com/sites/products/collateral/hpc/compilers/… ). AMD ha vinto la battaglia giudiziaria chiedendo a Intel di rivelare che sono anticoncorrenziali, non di farli smettere di esserlo. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Nebbia su soluzioni alternative: agner.org/optimize/blog/read.php?i=49
Jed Brown

@JedBrown, certo che SSE è ancora strano, ma qual è la storia di AVX? Questi collegamenti indicano che le cose dovrebbero andare bene (dal momento che entrambe le società implementano AVX), ma non l'ho testato su una macchina Bulldozer.
Bill Barth,

8

All'interno della raccolta di compilatori GNU, hai l'opzione in -ftree-vectorizer-verbose=ncui nè un numero compreso tra 0 e 6 che stamperà informazioni simili a icc/ ifort.


5

Con i compilatori GNU, l'aggiunta -Wa,-ahl=asm.sscaricherà il codice assembly generato in asm.s.

Con i compilatori Intel, l'aggiunta -fcode-asm -Faasm.sscaricherà il codice generato in asm.s.

È quindi possibile ispezionare il codice dell'assieme e cercare operazioni in virgola mobile vettoriali.


Concordo pienamente sul fatto che l'ispezione dell'output dell'assieme sia l'unico modo affidabile per determinare se il codice è effettivamente vettorializzato. Non c'è nulla che richieda ai compilatori di essere onesti sulle loro affermazioni di vettorializzare il codice.
Jeff,
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.