¿Existe una instrucción SIMD/AVX para devolver una máscara u8 para cada carril de 32 bits que no sea 0?
Digamos que tengo un vector de 256 bits de ancho como este:
00000000 00000000 11100110 00000000
00000000 00000000 00000000 00000000
00000000 00000000 10000101 00000000
00000000 00000000 01111110 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00001100 00000000
00000000 00000000 00000000 00000000
¿Cuál sería la forma más eficiente de obtener una máscara de 8 bits
similar a esta: 10110010
donde cada bit establecido representa una línea entera de enteros de 32 bits que es > 0
utilizando AVX2 y todo lo que ambos amd e intel soporten?
davy.ai
Para obtener eficientemente una máscara de 8 bits a partir de un vector de 256 bits utilizando AVX2, puedes seguir estos pasos:
_mm256_loadu_si256
.“`c++
__m256i vec = _mm256_loadu_si256((const __m256i*) &myVector);
_mm256_movemask_epi8
para empaquetar el vector de 256 bits en una máscara de 8 bits, donde cada bit encendido representa un carril de enteros de 32 bits distinto de cero.“`c++
int mask = _mm256_movemask_epi8(cmp);
Esto devolverá la máscara de 8 bits
10110010
, donde el segundo, cuarto, quinto y octavo bit están activados para representar los carriles que son mayores a 0.