使用 AVX2 和 BMI2 基于掩码进行高效左打包
在 AVX2 中,我们可以利用 vpermps (_mm256_permutevar8x32_ps) 指令来执行车道交叉可变洗牌。此外,BMI2 为我们提供了 pext(并行位提取),使我们能够执行对我们的问题至关重要的按位提取操作。
算法:
代码实现:
#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); }
优点:
缺点:
以上是AVX2和BMI2指令如何基于掩码优化左包装?的详细内容。更多信息请关注PHP中文网其他相关文章!