2016-06-07 15 views
5

Come è possibile creare una libreria che cambierà in modo dinamico tra i percorsi di codice SSE, AVX e AVX2 in base al processore host/sistema operativo? Sto usando VCL (Vector Class Library) di Agner Fog e sto compilando con GCC per Linux.Compilare codice multiarchitettura utilizzando la libreria di classi vettoriali di Agner

+0

Suona come una soluzione makefile per me. Conosci il processore/sistema operativo host quando costruisci. Non c'è bisogno di farlo in fase di esecuzione. – duffymo

+0

Per coloro che leggono questa domanda, ma non sono limitati a VCL e GCC, esiste una famiglia di flag di compilazione "-axcode" per Intel Compilers, che consentono di generare diversi percorsi di codice indirizzati a più architetture di set di istruzioni (ad esempio per SSE , AVX e AVX-512) nella stessa libreria/eseguibile e per la spedizione automatica (invisibile) tra di loro in runtime. Guarda in fondo a questa pagina: https://software.intel.com/en-us/blogs/2016/01/13/compiling-for-the-intel-xeon-phi-processor-x200-and-the- intel-avx-512-isa – zam

risposta

3

Le istruzioni di montaggio cpuid possono fornire queste informazioni in fase di esecuzione. Qualcuno ha creato una libreria basata su questo a solo what you need.

È possibile creare una tabella di distribuzione delle funzioni e completarla con le funzioni del percorso del codice corrette in base ai risultati dell'interrogazione utilizzando questo codice.

UPDATE: (risposta alla domanda nei commenti)

Per creare i diversi percorsi di codice, in primo luogo, è necessario compilare i diversi percorsi di codice separatamente, e poi collegarli tra loro. Per ognuno, si specifica l'architettura necessaria utilizzando vari valori dello switch -march nella riga di compilazione.

+0

Il problema è che non riesco (facilmente?) a creare percorsi di codice diversi, poiché VCL utilizza intrinseca (non assembly inline) che il compilatore converte in qualsiasi set di istruzioni specificato negli argomenti del compilatore. Supponevo che avrei dovuto dire che sto usando GCC. –

+0

Vedere risposta aggiornata – Smeeheey

+0

Come posso manipolare i nomi delle funzioni per ogni chiamata del compilatore? –

3

Vedere la sezione "Set di istruzioni e dispacciamento della CPU" in the manual to the Vector Class Library. In tale sezione Agner scrive

Il file dispatch_example.cpp mostra un esempio di come fare una CPU dispatcher che seleziona la versione del codice appropriato.

Leggi the source code a distpatch_example.cpp. All'inizio del file dovresti vedere il commento

# Compile dispatch_example.cpp five times for different instruction sets: 
| g++ -O3 -msse2 -c dispatch_example.cpp -od2.o 
| g++ -O3 -msse4.1 -c dispatch_example.cpp -od5.o 
| g++ -O3 -mavx  -c dispatch_example.cpp -od7.o 
| g++ -O3 -mavx2 -c dispatch_example.cpp -od8.o 
| g++ -O3 -mavx512f -c dispatch_example.cpp -od9.o 
| g++ -O3 -msse2 -otest instrset_detect.cpp d2.o d5.o d7.o d8.o d9.o 
| ./test 

Il file instrset_detect.cpp. Dovresti leggere anche il codice sorgente. Questo è ciò che chiama CPUID.

Here è un riepilogo di alcune, ma non tutte, le mie domande e risposte sui dispatcher della CPU.

+0

'dispatch_example.cpp' chiama' instrset_detect' che è dichiarato in 'instrset.h' e definito in' instrset_detect.cpp'. –

+0

mi dispiace, non importa –

Problemi correlati