首页 >后端开发 >C++ >如何最有效地使用 AVX2 进行带有面罩的左包装?

如何最有效地使用 AVX2 进行带有面罩的左包装?

Patricia Arquette
Patricia Arquette原创
2024-12-22 16:39:10725浏览

How Can AVX2 Be Used Most Efficiently for Left Packing with a Mask?

左包装问题

考虑有一个输入数组和一个输出数组,但只需要满足某些条件的元素的情况写入输出数组。使用 AVX2 实现此目的最有效的方法是什么?

SSE 方法

SSE 方法涉及使用 _mm_movemask_ps 从输入掩码中提取 4 位掩码,然后使用此掩码通过 _mm_load_si128 生成随机播放控制数据。最后,使用 _mm_shuffle_epi8 来排列值以对齐 SIMD 寄存器前面的有效元素。此方法适用于具有 16 项查找表 (LUT) 的 4 宽 SSE 向量。

AVX 限制

但是,对于 8 宽 AVX向量,LUT 将需要大量的条目 (256),每个条目有 32 字节,从而导致 8k 的内存使用量。令人惊讶的是,AVX 没有提供简化此过程的说明,例如带包装的蒙面商店。

AVX2 解决方案

尽管缺乏专门的说明,可以使用以下组合在 AVX2 中实现高效的左打包技巧:

  • 使用 vpermps 进行变量洗牌: _mm256_permutevar8x32_ps 可用于执行跨车道变量洗牌,允许根据掩码打包数据。
  • 动态生成蒙版: BMI2 提供了 pext(并行位提取)指令,可用于从输入掩码中提取位并生成随机控制数据。
  • 在 AMD CPU 上避免使用 pdep/pext: AMD Zen 3 之前的 CPU 的 pdep 和 pext 延迟明显更高,因此可能需要替代方法才能实现最佳效果

算法

AVX2 中的左打包算法涉及以下步骤:

  1. 从输入中提取索引使用 pext 进行掩码。
  2. 解压索引以生成随机播放mask。
  3. 使用 vpermps 根据 shuffle mask 对输入数据进行 shuffle。

结论

这种方法提供了一种高效的解决方案用于 AVX2 中的左包装。通过利用 vpermps、pext 和其他 BMI2 指令,可以以最小的开销和延迟基于掩码打包数据。

以上是如何最有效地使用 AVX2 进行带有面罩的左包装?的详细内容。更多信息请关注PHP中文网其他相关文章!

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