【问题标题】:Bitwise NOT/complement in AVX2 [duplicate]AVX2中的按位非/补码[重复]
【发布时间】: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++ 内在函数的。

标签: c++ bit-manipulation vectorization x86-64 avx2


【解决方案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 的更多信息:stackoverflow.com/questions/42613821/…。我会删除它,但我不能,因为它是公认的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多