【问题标题】:ARM NEON: comparing 128 bit valuesARM NEON:比较 128 位值
【发布时间】:2012-02-22 13:08:19
【问题描述】:

我有兴趣找到比较存储在 Cortex-A9 内核(允许 VFP 指令)上 NEON 寄存器(例如 Q0 和 Q3)中的值的最快方法(最少循环计数)。

到目前为止,我有以下内容:

(1)使用VFP浮点比较:

vcmp.f64        d0, d6
vmrs            APSR_nzcv, fpscr
vcmpeq.f64      d1, d7
vmrseq          APSR_nzcv, fpscr

如果 64 位“浮点数”等价于 NaN,则此版本将不起作用。

(2) 使用 NEON 缩小和 VFP 比较(这次只使用一次,并且以 NaN 安全的方式):

vceq.i32        q15, q0, q3
vmovn.i32       d31, q15
vshl.s16        d31, d31, #8
vcmp.f64        d31, d29
vmrs            APSR_nzcv, fpscr

D29 寄存器之前预加载了正确的 16 位模式:

vmov.i16        d29, #65280     ; 0xff00

我的问题是:还有比这更好的吗?我是否正在监督一些明显的方法来做到这一点?

【问题讨论】:

    标签: arm vectorization simd neon


    【解决方案1】:

    我相信你可以通过一条指令来减少它。通过使用左移和插入 (VLSI),您可以将 Q15 的 4 个 32 位值组合成 D31 中的 4 个 16 位值。然后您可以与 0 进行比较并获取浮点标志。

    vceq.i32  q15, q0, q3
    vlsi.32   d31, d30, #16
    vcmp.f64  d31, #0
    vmrs      APSR_nzcv, fpscr
    

    【讨论】:

    • 第一个指令“覆盖”了整个 Q15(即 D30 和 D31),而第二个指令只有 D31 作为 destination,因此会丢失一些信息,比较会并不总是产生正确的结果。
    • 当您使用 vceq.i32 时,它会将所有 1 或所有 0 放入 4 个 32 位通道中的每个通道中。第一条指令将 D30 和 D31 中的有用信息组合到 D31 中(所有 4 个比较的低 16 位)。第二条指令比较具有所有有用信息的低 64 位。
    • 第一条指令(即 vceq.i32)没有“组合”任何东西。此外,第二个不使用 D31 作为输入...
    • 见本页(第二张图)blogs.arm.com/software-enablement/…
    • 好的,你是对的,抱歉争吵。但是代码仍然存在与我的第一个实现相同的 NaN 问题:如果 Q0 和 Q3 相等,则 D31 最终将设置所有位(因此为 NaN)=> VCMP 将不起作用。
    猜你喜欢
    • 2012-06-30
    • 2015-06-26
    • 2016-04-28
    • 2016-11-04
    • 1970-01-01
    • 2011-05-30
    • 2018-03-16
    • 2021-12-19
    • 2011-11-02
    相关资源
    最近更新 更多