如何在ZMM寄存器上实现vpmovmskb的效果?

fuz*_*fuz 5 x86 assembly bitmask avx512

古怪的指令 (v)pmovmskb 可追溯到 SSE,它获取 mm、xmm 或 ymm 寄存器中字节的最高有效位,并将它们移动到通用寄存器中。这对于对向量元素进行分类或对单个位执行SWAR操作非常有用。具体来说,我在之前的答案中使用了这条指令来计算位置人口计数。

不幸的是,这条指令还没有扩展到 ZMM 寄存器,并且出人意料地没有出现在 AVX-512 名册中。如何有效地模拟 ZMM 寄存器的效果?我有哪些类似/其他选择?

Pet*_*des 5

还有就是对于在AVX512BW的指令,只需用一个不同的名称。 _mm512_movepi8_mask/ vpmovb2m k, zmm,可用于从字节到 qword 的每个元素大小。
(AVX512DQ 适用于 D 和 Q 版本,AVX512BW 适用于 B 和 W 版本)。

还有 mask->vector inverse movemask,vpmovm2b(同样适用于所有元素大小)。


当然AVX512还具有各种cmp和test成掩模指令,因此与set1_epi8(1<<n)矢量,你可以抓住任何比特位置与一个屏蔽寄存器vptestmb k2{k1}, zmm2, zmm3/m512; _mm512_test_epi8_mask. 请注意,与 不同vpmov2bm,它支持对目标进行零掩码以有效地与另一个k掩码免费进行AND运算,因此即使您只想要高位,也可能值得使用。

还有一个 NAND 版本vptestnmb。这些 D 和 Q 版本支持广播内存源操作数,但 B 和 W 版本不支持。

使用 8 个不同的掩码常量,您可以在展开的循环中提取不同的位,而无需花费任何移位指令。或者您可以从不同的元素中提取不同的位。

这些都是 AVX512BW,在 Skylake-AVX512 之后的 AVX512 CPU 上可用,但不是 Xeon Phi (KNL / KNM)。