AVX2中的按位非/补码[重复]

Posted

技术标签:

【中文标题】AVX2中的按位非/补码[重复]【英文标题】:Bitwise NOT/complement in AVX2 [duplicate] 【发布时间】:2017-09-18 05:44:56 【问题描述】:

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

【问题讨论】:

C++ 是什么? 你的意思不是按位吗?因为逻辑非是通过 cmp 指令实现的 @LưuVĩnhPhúc,如果更清楚的话,我已将措辞更改为“按位”。尽管英特尔的手册将这组内在函数称为“逻辑”:software.intel.com/sites/landingpage/IntrinsicsGuide/… @Yunnosch,问题是关于 C/C++ 内在函数的。 【参考方案1】:

是的,在 MMX、SSE* 和 AVX1/2 中,唯一的 SIMD 按位非是 PXOR/XORPS 与全一。

AVX512F 可以避免使用 vpternlogd same,same,same 和直接的 0x55 对单独向量常量的需要。 (有关它与vpxord:Is NOT missing from SSE, AVX? 的更多详细信息,请参阅我对副本的回答)


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

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

【讨论】:

是的,我最终需要NOT,因为_mm256_cmpgt_epi64() 没有对称内在,然后我需要OR 结果,所以AND_NOT 没有办法 @SergeRogatch:有时您可以在比较之前重新排列以否定输入,但是如果== 情况特殊,您不能只反转操作数。 在副本上发布了有关 AVX512F vpternlogd 的更多信息:***.com/questions/42613821/…。我会删除它,但我不能,因为它是公认的答案。

以上是关于AVX2中的按位非/补码[重复]的主要内容,如果未能解决你的问题,请参考以下文章

位运算符按位与按位或按位非左移右移原码反码补码

按位非运算符

Delphi中的按位补码。 (翻译C#〜运算符)

原码 反码 补码

python-opencv-图像的按位运算

0022和022之间的Umask区别[关闭]