首页 > 解决方案 > 如何实现 vpmovmskb 对 ZMM 寄存器的影响?

问题描述

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

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

标签: assemblyx86bitmaskavx512

解决方案


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)向量,您可以使用 ; 将任何位位置抓取到掩码寄存器中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)。


推荐阅读