es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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:

    1. Carga el vector de 256 bits en un registro AVX utilizando la función _mm256_loadu_si256.
      “`c++
      __m256i vec = _mm256_loadu_si256((const __m256i*) &myVector);

    2. Compara el vector con todos ceros utilizando la función `_mm256_cmpeq_epi32`, lo cual resultará en otro vector de 256 bits que contiene 0xffffffff o 0x00000000 en cada carril dependiendo de si el carril original era cero o distinto de cero. ```c++ __m256i cmp = _mm256_cmpeq_epi32(vec, _mm256_setzero_si256());
    1. Utiliza la función _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);

    4. Finalmente, para obtener la máscara de salida deseada donde cada bit encendido representa un carril de enteros de 32 bits mayor a 0 (en lugar de simplemente distinto de cero), puedes utilizar la función `_pdep_u32` para permutar y depositar los bits de la máscara de la siguiente manera: ```c++ mask = _pdep_u32(0x00ff00ff, mask) | _pdep_u32(0xff00ff00, mask >> 16);

    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.

Comments are closed.