Articles of avx2

Emular cambios en 32 bytes con AVX

Estoy migrando un código vectorizado escrito utilizando intrínsecamente SSE2 a AVX2 intrinsics. Para mi decepción, descubrí que las instrucciones de cambio _mm256_slli_si256 y _mm256_srli_si256 operan solo en las dos mitades de los registros AVX por separado y los ceros se introducen en el medio. (Esto es por contraste con _mm_slli_si128 y _mm_srli_si128 que manejan registros […]

¿Hay una instrucción inversa a la instrucción movemask en Intel avx2?

Las instrucciones movemask toman un __m256i y devuelven un int32 donde cada bit (el primero 4, 8 o los 32 bits dependiendo del tipo de elemento vector de entrada) es el bit más significativo del elemento vector correspondiente. Me gustaría hacer lo contrario: tomar un 32 (donde solo los 4, 8 o 32 bits menos […]

Implementación eficiente de log2 (__ m256d) en AVX2

El archivo __m256d _mm256_log2_pd (__m256d a) no está disponible en otros comstackdores distintos a Intel, y dicen que su rendimiento se ve perjudicado en los procesadores AMD. Hay algunas implementaciones en Internet que se mencionan en los intrínsecos de registro de AVX (_mm256_log_ps) que faltan en g ++ – 4.8? y bibliotecas matemáticas SIMD para […]

¿Cómo realizar el inverso de _mm256_movemask_epi8 (VPMOVMSKB)?

Lo intrínseco int mask = _mm256_movemask_epi8(__m256i s1) crea una máscara, con sus 32 bits correspondientes al bit más significativo de cada byte de s1 . Después de manipular la máscara usando operaciones de bits ( BMI2 por ejemplo) me gustaría realizar el inverso de _mm256_movemask_epi8 , es decir, crear un vector __m256i con el bit […]

AVX2 ¿cuál es la forma más eficiente de empacar a la izquierda según una máscara?

Si tiene una matriz de entrada y una matriz de salida, pero solo desea escribir aquellos elementos que pasan una determinada condición, ¿cuál sería la forma más eficiente de hacerlo en AVX2? Lo he visto en SSE donde se hizo así: (De: https://deplinenoise.files.wordpress.com/2015/03/gdc2015_afredriksson_simd.pdf ) __m128i LeftPack_SSSE3(__m128 mask, __m128 val) { // Move 4 sign bits […]