Io lavoro con due computer. Uno senza supporto AVX e uno con AVX. Sarebbe utile che il mio codice trovi il set di istruzioni supportato dalla mia CPU in fase di esecuzione e scelga il percorso del codice appropriato. Ho seguito i suggerimenti di Agner Fog per creare un dispatcher della CPU (http://www.agner.org/optimize/#vectorclass). Tuttavia, sul mio maching senza la compilazione AVX e il collegamento con Visual Studio, il codice con AVX attivato causa il crash del codice durante l'esecuzione.Cpu dispatcher per Visual Studio per AVX e SSE
Voglio dire ad esempio che ho due file sorgente uno con il set di istruzioni SSE2 definito con alcune istruzioni SSE2 e un altro con il set di istruzioni AVX definito e con alcune istruzioni AVX. Nella mia funzione principale, se faccio riferimento solo alle funzioni SSE2, il codice si blocca ancora in virtù dell'utilizzo di qualsiasi codice sorgente con AVX abilitato e con le istruzioni AVX. Qualche indizio su come posso risolvere questo problema?
Modifica: Ok, penso di aver isolato il problema. Sto utilizzando classe Vector di Agner Fog e ho definito tre file di origine come:
//file sse2.cpp - compiled with /arch:SSE2
#include "vectorclass.h"
float func_sse2(const float* a) {
Vec8f v1 = Vec8f().load(a);
float sum = horizontal_add(v1);
return sum;
}
//file avx.cpp - compiled with /arch:AVX
#include "vectorclass.h"
float func_avx(const float* a) {
Vec8f v1 = Vec8f().load(a);
float sum = horizontal_add(v1);
return sum;
}
//file foo.cpp - compiled with /arch:SSE2
#include <stdio.h>
extern float func_sse2(const float* a);
extern float func_avx(const float* a);
int main() {
float (*fp)(const float*a);
float a[] = {1,2,3,4,5,6,7,8};
int iset = 6;
if(iset>=7) {
fp = func_avx;
}
else {
fp = func_sse2;
}
float sum = (*fp)(a);
printf("sum %f\n", sum);
}
Questo si blocca. Se invece utilizzo Vec4f in func_SSE2 non si blocca. Non lo capisco Posso usare Vec8f con SSE2 da solo fino a quando non ho un altro file sorgente con AVX. manuale dell'utilizzatore Agner nebbia dice
"Non v'è alcun vantaggio in base alle classi 256 bit virgola mobile vettoriali (Vec8f, Vec4d) a meno che sia specificato il set di istruzioni AVX, ma può essere conveniente utilizzare queste classi comunque se la lo stesso codice sorgente viene utilizzato con e senza AVX. Ogni vettore a 256 bit verrà semplicemente diviso in due vettori a 128 bit durante la compilazione di senza AVX. "
Tuttavia, quando ho due file sorgente con Vec8f uno compilato con SSE2 e uno compilato con AVX, si verifica un arresto anomalo.
Edit2: posso farlo funzionare da linea di comando
>cl -c sse2.cpp
>cl -c /arch:AVX avx.cpp
>cl foo.cpp sse2.obj avx.obj
>foo.exe
Edit3: Questo, tuttavia, si blocca
>cl -c sse2.cpp
>cl -c /arch:AVX avx.cpp
>cl foo.cpp avx.obj sse2.obj
>foo.exe
Un altro indizio. Apparentemente, l'ordine di collegamento conta. Crolla se avx.obj è prima di sse2.obj ma se sse2.obj è prima di avx.obj non si blocca. Non sono sicuro che scelga il percorso corretto del codice (non ho accesso al mio sistema AVX in questo momento) ma almeno non si blocca.
Quali sono i dettagli dello schianto? Hai identificato l'istruzione fallita in un debugger? –
Bene il debugger mostra che func_SSE sta provando ad usare le istruzioni AVX. Non so perché. Ma sono riuscito a far funzionare il codice senza crash utilizzando la riga di comando. Ho aggiunto i comandi sopra. Ancora non so come farlo con l'IDE. Il lato positivo è stato compilato dalla riga di comando per la prima volta in Windows! È l'unico modo che compilo su Linux. –
Hai utilizzato la generazione del codice link-time dall'IDE? –