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中的按位非/补码[重复]的主要内容,如果未能解决你的问题,请参考以下文章