我想获取 256 位向量之间的 8 位垂直 SIMD 比较的结果,并将这些位打包到每个 32 位元素的最低字节中,以便查找vpshufb最低字节。这对于 AVX-512 来说并不是非常困难(&如果使用 512 位向量,则用屏蔽移动替换 ):
__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}\nRun 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 左右。不错,但我想知道是否有更好的东西。