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:
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:
"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
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
Certo sembra strano. Non escluderei immediatamente un bug nel visualizzatore; questo è molto più complesso dell'intrinseca mappatura degli assiemi. – MSalters