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

How to achieve the effect of vpmovmskb on ZMM registers?

可追溯到 SSE 的古怪指令 (v)pmovmskb 获取 mm、xmm 或 ymm 寄存器中字节的最高有效位,并将它们移动到通用寄存器中。这对于对向量元素进行分类或执行 SWAR operations on individual bits. Specifically, I have used this instruction in a 计算位置人口计数非常有用。

不幸的是,该指令尚未扩展到 ZMM 寄存器,并且令人惊讶地没有出现在 AVX-512 名册中。如何有效地模拟 ZMM 寄存器的效果?我有哪些 similar/other 选项?

在 AVX512BW 中一条指令,只是名称不同。 _mm512_movepi8_mask/ vpmovb2m k, zmm,适用于从字节到 qword 的所有元素大小。
(D 和 Q 版本为 AVX512DQ,B 和 W 版本为 AVX512BW)。

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


AVX512 当然也有各种 cmptest 进入掩码指令,因此使用 set1_epi8(1<<n) 向量,您可以将任何 bit-position 抓取到掩码寄存器中vptestmb k2{k1}, zmm2, zmm3/m512; _mm512_test_epi8_mask。请注意,与 vpmov2bm 不同,它支持将 zero-masking 有效地插入目标并免费使用另一个 k 掩码,因此即使您只想要高位也可能值得使用。

还有一个 NAND 版本 vptestnmb。这些的 D 和 Q 版本支持 broadcast-memory 源操作数,但 B 和 W 版本不支持。

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

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