【问题标题】:Testing NEON SIMD registers for equality over all lanes测试 NEON SIMD 寄存器在所有通道上是否相等
【发布时间】: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 个周期。我想说的是前 Skylake ptest 至少具有竞争力。
  • @EOF:分支预测+推测执行意味着JCC不在关键路径上。如果标志是循环携带的数据依赖项的一部分,这将很重要,但如果少一个融合域 uop 的吞吐量增益有用,则检测分支错误预测的额外循环不太重要。

标签: arm simd intrinsics neon


【解决方案1】:

如果您只想知道两个向量是否相等,请尝试以下代码:

result = vceqq_u32(a, b);
if (vminvq_u32(result ) != 0xffffffff) {
     // not equal
} else {
     // equal
}

参见 ARM 手册:CMEQUMINV

【讨论】:

    【解决方案2】:

    试试这个:

    uint16x4_t t = vqmovn_u32(veorq_u32(a, b));
    vget_lane_u64(vreinterpret_u64_u16(t), 0) == 0
    

    我希望编译器在实现该测试时找到特定于目标的优化。


    我刚刚意识到一些方便的东西......

    如果您想测试所有通道是否小于 2 的某个幂,您可以通过将 vqmovn_u32() 替换为 vqshrn_n_u32() 来做到这一点;我相信这可以扩展到使用vqrshrn_n_s32() 的带符号类型的+/- 2 的幂(包括下限,不包括上限)。例如,您应该能够在使用 vqrshrn_n_s32(x, 1) 的单个测试中同时接受 -1 和 0。

    【讨论】:

    • @Notlikethat 这就是vqmovn 中的q 的用途。如果原始值超出范围,则饱和到 0xffff。
    • 啊,对,完全被我忽略了。 Flippin' NEON 内在函数与他们的 flippin' qs 无处不在,你已经习惯于将它们过滤掉......
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2011-02-17
    • 2018-01-14
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多