【问题标题】:Compare operation using NEON Instructions使用 NEON 指令比较操作
【发布时间】:2014-09-11 18:44:52
【问题描述】:

我有以下代码

if ( i < 0 ) {
  i = i + 1
}

使用 NEON 矢量化指令我需要执行上述操作。如何将 NEON 寄存器值与 0 进行比较并执行上述计算?

【问题讨论】:

    标签: arm simd neon


    【解决方案1】:

    您可以只进行比较然后减去结果,因为true 比较结果相当于 -1:

    const int32x4_t vk0 = { 0 };
    
    uint32x4_t vcmp = vcltq_s32(va, vk0);  // a < 0 ? 
    va = vsubq_s32(va, (int32x4_t)vcmp);   // subtract -1 (i.e. add 1) for
                                           // each element where a < 0
    

    如果您想在汇编级别执行此操作,则只需使用以下说明:

    【讨论】:

    • 谢谢保罗!我同意以上是执行所需的方法。有没有其他方法使用 NEON 汇编指令来做同样的事情?例如,是否可以在 NEON 中使用条件指令?
    • 当然 - 我现在更新了问题,列出了您需要的两条说明。
    • 谢谢保罗!!这行得通.. 只是一个小的修正 vcltq_s32 == VCLT.S32。
    【解决方案2】:

    您不需要太多说明。一条 vsra 指令就可以了(向量右移累加):

    vsra.u32 q0, q0, #31 // i += ((unsigned int) i) >> 31;
    

    请注意,这是有意使用的u32,而不是s32

    NEON 易于学习,但很难掌握,因为您需要了解许多与 bit-hacking 相关的技术,才能编写比传统 if-else 方法快很多倍的高效代码。

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 2016-11-04
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 2012-02-22
      • 2015-06-26
      • 1970-01-01
      • 2020-07-01
      相关资源
      最近更新 更多