小编Ovi*_*eal的帖子

x86 SIMD – 将 8 位比较结果打包到 32 位条目中

我想获取 256 位向量之间的 8 位垂直 SIMD 比较的结果,并将这些位打包到每个 32 位元素的最低字节中,以便查找vpshufb最低字节。这对于 AVX-512 来说并不是非常困难(&如果使用 512 位向量,则用屏蔽移动替换 ):

\n
__m256i cmp_8_into_32(__m256i a, __m256i b) {\n    return _mm256_popcnt_epi32(_mm256_cmpeq_epi8(a, b)\n        & _mm256_set1_epi32(0xff0f0301 /* can be any order */));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是 3 个 uops,假设完美调度,根据 uops.info\xe2\x80\x94,吞吐量为 1 还不错。可惜,vpopcntdAVX2 中没有。在那里进行此操作的最佳方法是什么?我能想到的最好的方法是屏蔽索引 7,8 和 15,16 处的位对,然后执行两个常量vpsrld和一个vpor. 所以这是 6 uops,吞吐量为 2.5 左右。不错,但我想知道是否有更好的东西。

\n

c x86 avx2 avx512

5
推荐指数
2
解决办法
407
查看次数

标签 统计

avx2 ×1

avx512 ×1

c ×1

x86 ×1