2014-06-17 13 views
7

Sto scrivendo un programma utilizzando Intel intrinsics. Voglio usare _mm_permute_pd intrinsico, che è disponibile solo su CPU con AVX. Per le CPU senza AVX posso usare _mm_shuffle_pd ma secondo le specifiche è molto più lento di _mm_permute_pd. Fare i file di intestazione per intrinseche Intel definiscono le costanti che mi permettono di distinguere se AVX è supportato in modo che io possa scrivere sth come questo:Come verificare con Intel intrinsica se le estensioni AVX sono supportate dalla CPU?

#ifdef __IS_AVX_SUPPORTED__ // is there sth like this defined? 
// use _mm_permute_pd 
# else 
// use _mm_shuffle_pd 
#endif 

? Ho trovato this tutorial, che mostra come eseguire un controllo di runtime, ma ho bisogno di fare un controllo statico, in fase di compilazione per la macchina corrente.

+0

'_mm_permute_pd' (' vpermilpd') non è più veloce di 'shufpd dest, same, same', a meno che non permetta a un operando di una sorgente di memoria di piegarsi nell'istruzione. Vedi http://agner.org/optimize/ per le tabelle di istruzioni, ecc. –

risposta

5

Presumo che si stia utilizzando il compilatore Intel C++. In questo caso, sì, esistono tali macro: Intel C++ Compiler Reference Guide: __AVX__, __AVX2__.

P.S. Si tenga presente che se si compila l'applicazione con il set di istruzioni AVX attivato, la CPU non funzionerà su CPU che non supportano AVX. Se avete intenzione di distribuire il vostro software come pacchetto del codice sorgente e compilarlo sul computer di destinazione, questa potrebbe essere una soluzione valida. Altrimenti dovresti controllare l'AVX in modo dinamico.

P.P.S. Ci sono diverse opzioni per ICC. Dai uno sguardo allo following compiler options e anche i riferimenti da esso ad altri.

+0

GCC supporta '-mtune = native' per regolare il set di istruzioni a seconda della CPU corrente, forse c'è qualcosa di simile per ICC? – peppe

+0

Sì, c'è '-xHost' per MacOS e Linux e'/QxHost' per Windows. Ci sono anche varie opzioni come '-march',' -arch' ecc. – Romeo

5

GCC, ICC, MSVC e Clang definiscono una macro __AVX__ che è possibile controllare. In effetti è l'unica costante SIMD definita da tutti quei compilatori (MSVC is the one that breaks the mold). Questo ti dice solo se il tuo codice è stato compilato con supporto AVX (ad esempio -mavx con GCC o/arch: AVX con MSVC) non ti dice se la tua CPU supporta AVX. Se vuoi sapere se la CPU supporta AVX devi controllare CPUID. Qui, asm-in-c-error, è un esempio per leggere CPUID da tutti quei compilatori.

Per fare ciò correttamente, suggerisco di creare un CPU dispatcher.

Edit: Nel caso in cui qualcuno vuole sapere come utilizzare i valori da CPUID per scoprire se AVX è disponibile vedere https://github.com/Mysticial/FeatureDetector

0

Mi sembra che l'unico modo è quello di compilare ed eseguire un programma che identifica se AVX è disponibile. Quindi compila manualmente o automaticamente un codice separato con o senza funzioni AVX. Per VS 2013, avrei utilizzato il mio codice nella cartella commomAVX nel seguente modo per identificare hasAVX (o meno) e usarlo per eseguire uno dei due diversi file BAT per compilare e collegare il programma appropriato.

http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip

La mia domanda era quello di aiutare ad identificare una soluzione per quanto riguarda l'utilizzo di opportune opzioni di compilazione, come/arch: AVX.

Problemi correlati