我想对两个包含 8 位元素的 512 位向量进行 AND 运算。
查看 Intel Intrinsics Guide,我可以看到一些 512 位 AND 运算:
__m512i _mm512_and_epi32 (__m512i a, __m512i b)
__m512i _mm512_and_epi64 (__m512i a, __m512i b)
但对于 epi8(或 epi16)没有任何影响。
使用epi64安全吗?我唯一犹豫的是为什么他们同时提供了epi32和epi64,想必两者都可以使用epi32。性能原因?
两者都只是简单的按位与;您可以对任何数据使用其中任何一个。
或者更好的是,使用具有所需语义的
_mm512_and_si512
。
在 asm 中,
vpandd
和 vpandq
可以分别与 32 位或 64 位粒度的掩码一起使用。屏蔽是拥有单独操作码的唯一原因,这与 AVX2 及更早版本中只有 vpand
(_mm256_and_si256
和 _mm_and_si128
)不同。
如果没有掩码,元素宽度就没有意义。
_mm512_and_epi32
和 epi64
存在的唯一原因是为了与 _mm512_mask[z]_and_epi[32|64]
保持一致。
_mm512_and_si512
存在,并将编译为 vpandq
或 vpandd
。vpandq
,就像他们如何使用 vmovdqa64
来表示 _mm512_load_si512
AVX512BW 添加了 EVEX 版本的指令,例如
vpaddb
,其中元素宽度即使没有屏蔽也很重要。但没有为按位布尔值添加字节或字掩码宽度,仅添加 vmovdqu8
/ vmovdqu16
(和 vpblendmb
/vpblendmw
)用于单独加载、存储或 reg-reg 混合(合并-掩蔽)或零掩蔽。
有趣的事实:
vandps/pd
不是AVX512F(基础)的一部分,其中只有整数vpandd/q
。 FP 版本作为 AVX512DQ 的一部分添加。