如何在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 当然也有各种 cmp
和 test
进入掩码指令,因此使用 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)。
可追溯到 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 当然也有各种 cmp
和 test
进入掩码指令,因此使用 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)。