Ho un'espressione booleana che sono riuscito a implementare in SSE2. Ora mi sarebbe piaciuto provare a implementarlo in AVX sfruttando un fattore aggiuntivo 2 nell'aumento del parallelismo (da 128 bit tipo SIMD a 256). Tuttavia, AVX non supporta l'operazione integer (che funziona con AVX2, ma sto lavorando su un processore Sandy Bridge quindi non è attualmente un'opzione). Tuttavia, poiché ci sono AVX intrinsics for bitwise operations. Ho pensato che potevo provare semplicemente convertendo i miei tipi interi in tipi mobili e vedere se funziona.Esiste un modo per simulare operazioni bit a bit su interi per _m256 tipi su AVX?
primo test è stato un successo:
__m256 ones = _mm256_set_ps(1,1,1,1,1,1,1,1);
__m256 twos = _mm256_set_ps(2,2,2,2,2,2,2,2);
__m256 result = _mm256_and_ps(ones, twos);
sto Guetting tutti i 0 di come dovrei. Simularly AND'ing i due a due invece che ottenere un risultato di 2. Ma quando si cerca 11 XOR 4 conseguenza:
__m256 elevens = _mm256_set_ps(11,11,11,11,11,11,11,11);
__m256 fours = _mm256_set_ps(4,4,4,4,4,4,4,4);
__m256 result2 = _mm256_xor_ps(elevens, fours);
Il risultato è 6.46e-46 (cioè vicino a 0) e non 15. Simularly fare 11 OR 4 mi dà un valore di 22 e non 15 come dovrebbe essere. Non capisco perché sia così. È un bug o una configurazione che mi manca?
In realtà mi aspettavo la mia ipotesi di lavorare con float come se fossero interi per non funzionare poiché il numero intero inizializzato su un valore float potrebbe non essere effettivamente il valore preciso ma una stretta approssimazione. Ma anche allora, sono sorpreso dal risultato che ottengo.
Qualcuno ha una soluzione a questo problema o devo aggiornare la mia CPU per ottenere supporto AVX2 abilitare questo?
Sembra che tu stia stampando un numero intero come float per ottenere 6.46e-46. Sei sicuro che i tuoi specificatori di formattazione 'printf()' sono corretti? –
Non stavo stampando. Ho appena controllato il valore nel debugger di Visual Studio. – Toby999