左包装问题
考虑有一个输入数组和一个输出数组,但只需要满足某些条件的元素的情况写入输出数组。使用 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 中实现高效的左打包技巧:
算法
AVX2 中的左打包算法涉及以下步骤:
结论
这种方法提供了一种高效的解决方案用于 AVX2 中的左包装。通过利用 vpermps、pext 和其他 BMI2 指令,可以以最小的开销和延迟基于掩码打包数据。
以上是如何最有效地使用 AVX2 进行带有面罩的左包装?的详细内容。更多信息请关注PHP中文网其他相关文章!