Utilisation d'AVX2 et BMI2 pour un emballage efficace à gauche basé sur un masque
Dans AVX2, nous pouvons exploiter l'instruction vpermps (_mm256_permutevar8x32_ps) pour effectuer mélanges variables de croisement de voies. De plus, BMI2 nous fournit du pext (Parallel Bits Extract), nous permettant d'effectuer des opérations d'extraction au niveau du bit cruciales pour notre problème.
Algorithme :
Code Implémentation :
#include <stdint.h> #include <immintrin.h> __m256 compress256(__m256 src, unsigned int mask) { uint64_t expanded_mask = _pdep_u64(mask, 0x0101010101010101); expanded_mask *= 0xFF; const uint64_t identity_indices = 0x0706050403020100; uint64_t wanted_indices = _pext_u64(identity_indices, expanded_mask); __m128i bytevec = _mm_cvtsi64_si128(wanted_indices); __m256i shufmask = _mm256_cvtepu8_epi32(bytevec); return _mm256_permutevar8x32_ps(src, shufmask); }
Avantages :
Inconvénients :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!