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)
无关,请使用对您的算法具有语义意义的任何内容。)
在 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)
无关,请使用对您的算法具有语义意义的任何内容。)