【发布时间】:2017-04-21 16:15:41
【问题描述】:
我正在使用带有 clang 的 Neon Instrinics。
我想测试两个uint32x4_t SIMD 值在所有通道上是否相等。
所以不是 4 个测试结果,而是一个结果告诉我 A 和 B 是否在所有车道上都相等。
在英特尔 AVX 上,我会使用类似的东西:
_mm256_testz_si256( _mm256_xor_si256( A, B ), _mm256_set1_epi64x( -1 ) )
对 NEON SIMD 执行全通道相等性测试的好方法是什么?
我假设我需要跨通道操作的内在函数。 ARM Neon 有这些功能吗?
【问题讨论】:
-
与this problem相关,一般都归结为this one。另请注意,如果您根据结果所做的事情可以表示为(或转换为)向量条件选择,那么生活会变得容易得多。
-
请注意,即使您的 AVX 版本也不是最佳的。考虑一下 DeMorgan,然后再试一次。
-
@EOF:由于 PTEST 在 Intel 上是 2 uops,并且不能与分支进行宏融合,所以这至少同样好,有时更好:
0xFFFFFFFFU == _mm256_movemask_epi8( _mm256_cmpeq_epi8(A,B))。 (PCMPEQB/PMOVMSKB/cmp eax, imm8/je= 3 微指令在其上分支),与替代方案相比(即使正确实施,因此它不需要任何额外的常量:__m256i diff = xor(A,B);_mm256_testz_si256(diff,diff)(PXOR / PTEST / JE= 4 微指令在其上分支。 ) 在 AMD 上,PMOVMSKB 和 PTEST 都是 2 uops,但我认为你仍然收支平衡,因为 cmp/jcc 仍然可以融合。 -
@PeterCordes:根据 Agner Fog 的表格,
pmovmskb在 Haswell/Broadwell 上有 3 个周期延迟,在 Skylake 上有 2-3 个周期(不清楚在什么情况下是 2 个周期)。ptest在 Haswell/Broadwell 上是 2 个周期,在 Skylake 上是 3 个周期。我想说的是前 Skylakeptest至少具有竞争力。 -
@EOF:分支预测+推测执行意味着JCC不在关键路径上。如果标志是循环携带的数据依赖项的一部分,这将很重要,但如果少一个融合域 uop 的吞吐量增益有用,则检测分支错误预测的额外循环不太重要。
标签: arm simd intrinsics neon