首页 >后端开发 >C++ >AVX2和BMI2指令如何基于掩码优化左包装?

AVX2和BMI2指令如何基于掩码优化左包装?

Barbara Streisand
Barbara Streisand原创
2024-12-30 13:45:13451浏览

How Can AVX2 and BMI2 Instructions Optimize Left Packing Based on a Mask?

使用 AVX2 和 BMI2 基于掩码进行高效左打包

在 AVX2 中,我们可以利用 vpermps (_mm256_permutevar8x32_ps) 指令来执行车道交叉可变洗牌。此外,BMI2 为我们提供了 pext(并行位提取),使我们能够执行对我们的问题至关重要的按位提取操作。

算法:

  1. 开始保存压缩 3 位索引的常量 ([7 6 5 4 3 2 1 0])。
  2. 使用 pext 将所需索引提取到连续序列中。
  3. 生成一个掩码,其中每一位对应一个索引字节(每个字节解包一个索引)。
  4. 复制掩码中的每个位以填充其相应的字节。
  5. 使用以下方法从身份洗牌中提取所需的索引pext。
  6. 将索引字节转换为 32 位整数。
  7. 使用 vpermps 基于 32 位索引向量执行 shuffle。

代码实现:

#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);
}

优点:

  • 使用立即常量并避免内存负载。
  • 简单和

缺点:

  • 由于 pdep/pext 性能较慢,在 Zen 3 之前的 AMD CPU 上可能会较慢。

以上是AVX2和BMI2指令如何基于掩码优化左包装?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn