2016-05-29 36 views
7

Sto riscontrando un bug davvero strano con Intel Intrinsics su una funzione AVX2, che vorrei condividere qui. O sono io a fare qualcosa di sbagliato (non riesco davvero a vedere cosa succede a questo punto), o un bug nella libreria.Errore potenziale nel compilatore Visual Studio C o nella funzione "AVX2" _mm256_set_epi64x di Intel Intrinsics "

ho questo semplice codice dentro il mio main.c:

__int64 test = 0xFFFF'FFFF'FFFF'FFFF; 
__m256i ymm = _mm256_set_epi64x(0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           test); 

Il valore che viene assegnato a ymm variabile è per qualche strano motivo:

ymm.m256i_i64[0] = 0xffff'ffff'ffff'ffff 
ymm.m256i_i64[1] = 0x0000'0000'0000'0000 
ymm.m256i_i64[2] = 0x0000'ffff'0000'0000 
ymm.m256i_i64[3] = 0x0000'0000'0000'0000 

ho debug per ore a questo punto, ma non vedo perché ymm.m256i_i64[2] ottiene questo valore errato. Per favore aiuto!

Fun/fatto strano: Se scrivo questo codice C:

__m256i ymm = _mm256_set_epi64x(0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           0x0000'0000'0000'0000, 
           0xFFFF'FFFF'FFFF'FFFF); 

Poi i valori vengono correttamente impostati:

ymm.m256i_i64[0] = 0xffff'ffff'ffff'ffff 
ymm.m256i_i64[1] = 0x0000'0000'0000'0000 
ymm.m256i_i64[2] = 0x0000'0000'0000'0000 
ymm.m256i_i64[3] = 0x0000'0000'0000'0000 

Nota: Sto usando Visual Studio; sia la loro compilatore e le loro strumenti di debug, come di seguito esempio immagine mostra: enter image description here

Il printf seguendo il codice stampato: ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ff ff 00 ff ff 00 00 ff 00 00 00 ff 00 00 00.

Sembra che le modifiche canaglia delle altre variabili nella struttura possano cambiare, poiché non sono le stesse dopo aver aggiunto il ciclo, come erano prima ... (non so se il ciclo è stato creato appositamente il cambiamento).

Modifica: Non sono falco al montaggio .... Niente affatto. Ho aggiunto la catena di montaggio codice generato anche se nella foto qui sotto, nel caso che può aiutare chiunque di aiutarmi a capire cosa sta succedendo, e se si tratta di un bug non causato da me: enter image description here

+1

"Bug in library" è piuttosto improbabile per un intrinseco che è solo un involucro sottile. Come controllate il risultato? (Bug potrebbe essere lì). Qual è l'assemblea generata? – MSalters

+0

Sì, certo. Aggiungo un breakpoint subito dopo l'assegnazione e controllo il valore assegnato alla struttura __m256i, che appare errata. Ho aggiunto una foto al post originale per chiarezza in un secondo. – oPolo

+1

Certo sembra strano. Non escluderei immediatamente un bug nel visualizzatore; questo è molto più complesso dell'intrinseca mappatura degli assiemi. – MSalters

risposta

4

MSVC until recently did not support any of the epi64x intrinsics in 32-bit mode. In biblioteca di Agner Fog VCL scrive

//#if defined (_MSC_VER) && _MSC_VER < 1900 && ! defined (__x86_64__) && ! defined(__INTEL_COMPILER) 
// MS compiler cannot use _mm256_set1_epi64x in 32 bit mode, and 
// cannot put 64-bit values into xmm register without using 
// mmx registers, and it makes no emms 

Per risolvere questo in modalità a 32 bit con MSVC si può fare questo:

union { 
    int64_t q[4]; 
    int32_t r[8]; 
} u; 
u.q[0] = a; u.q[1] = b; u.q[2] = c; u.q[3] = d; 
_mm256_setr_epi32(u.r[0], u.r[1], u.r[2], u.r[3], u.r[4], u.r[5], u.r[6], u.r[7]); 

Oppure utilizzare la modalità a 64 bit.

+1

Risposta tardiva, scusa ... Sono stati mesi stressanti. Stavo scrivendo la mia tesi, che fortunatamente è finita bene. Indipendentemente dal ritardo della mia risposta, il tuo post mi ha aiutato a individuare quello che pensavo fosse un bug che mi avrebbe costato ore (se non un giorno o due) di risoluzione dei problemi durante la mia tesi. Questo è degno di un grande ringraziamento: grazie mille per il tuo aiuto !! – oPolo