首页 >后端开发 >C++ >如何使用 AVX2 和 BMI2 进行基于动态掩模的高效左包装?

如何使用 AVX2 和 BMI2 进行基于动态掩模的高效左包装?

Patricia Arquette
Patricia Arquette原创
2024-12-20 01:49:10749浏览

How Can AVX2 and BMI2 Be Used for Efficient Left Packing Based on a Dynamic Mask?

基于 AVX2 和 BMI2 的掩码有效打包左元素

在 AVX2 中,实现高效的左打包需要利用特定的指令和技术。一种方法是利用 AVX2 的 vpermps (_mm256_permutevar8x32_ps) 进行车道交叉变量改组,并利用 BMI2 的 pext(并行位提取)进行按位运算。

利用 BMI2 进行掩码生成

BMI2 的 pext 指令使能从位掩码中提取特定位,提供一种即时动态生成车道交叉洗牌控制数据的机制。这消除了对大型预先计算的查找表 (LUT) 的需要。

算法

算法涉及:

  1. 提取压缩索引:使用pext,生成压缩位掩码,在整数寄存器的低位中包含所需的通道索引。
  2. 解压缩压缩索引:为了解压缩压缩索引,使用了一系列移位和乘法。此步骤有效地复制每个位以填充其相应的字节,从而创建每字节索引掩码。
  3. 生成随机播放掩码: 使用每字节索引掩码计算随机播放掩码。然后使用此掩码来使用 vpermps 控制车道交叉变量洗牌操作。

性能注意事项

这种方法的优点在于它能够动态生成车道交叉洗牌掩码,避免创建和存储大型 LUT。这种方法在掩码输入是动态的情况下可能是有利的。然而,值得注意的是,在 Zen 3 之前的 AMD CPU 上,pdep/pext 操作可能相对较慢,因此 128 位向量或基于 LUT 的方法等替代方法可能更适合此类架构。

以上是如何使用 AVX2 和 BMI2 进行基于动态掩模的高效左包装?的详细内容。更多信息请关注PHP中文网其他相关文章!

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