AVX2 中的按位 NOT/complement

Bitwise NOT/complement in AVX2

在 AVX2 中似乎没有按位 NOT/complement 的内在函数。我错过了吗,还是我们应该做类似 _mm256_xor_si256(a, _mm256_set1_epi64x(-1LL)) 的事情?如果是后者,它是最优的吗?汇编里也没有vector NOT指令吗?

是的,在 MMX、SSE* 和 AVX1/2.

中,唯一的 SIMD 按位非是 PXOR/XORPS 和全一

AVX512F 可以使用 vpternlogd same,same,same, with the immediate 0x55. (See my answer on the duplicate for more details about it vs. vpxord: )

避免需要单独的向量常量

理想情况下,您可以安排您的算法以避免实际上不需要某些东西。例如,使用 PANDN 而不是 PAND。或者稍后作为其他内容的一部分进行反转。但是,如果您最终确实需要反转,那就是这样。

全1常量可以用vpcmpeqd same,same,same生成。使用内在函数,让编译器通过编写 _mm256_set1_epi32(-1) 为您完成此操作。 (元素大小显然与 set1(-1) 无关,请使用对您的算法具有语义意义的任何内容。)