我对组装不是很陌生,尽管 ARM 信息中心通常对您有所帮助,但有时这些说明可能会使新手感到困惑。基本上,我需要做的是在一个四字寄存器中求和4个浮点值,并将结果存储在单个精度寄存器中。我认为VPADD指令可以满足我的需求,但我不太确定。

最佳答案

似乎您想要获得一定长度数组的总和,而不仅仅是四个浮点值。

在这种情况下,您的代码可以运行,但远未优化:

  • 许多许多管道互锁
  • 每次迭代无需添加32位

  • 假设数组的长度是8的倍数,并且至少是16:
      vldmia {q0-q1}, [pSrc]!
      sub count, count, #8
    loop:
      pld [pSrc, #32]
      vldmia {q3-q4}, [pSrc]!
      subs count, count, #8
      vadd.f32 q0, q0, q3
      vadd.f32 q1, q1, q4
      bgt loop
    
      vadd.f32 q0, q0, q1
      vpadd.f32 d0, d0, d1
      vadd.f32 s0, s0, s1
    
  • pld-尽管是ARM指令而非NEON指令,但对性能至关重要。它大大提高了缓存命中率。

  • 我希望上面的其余代码可以自我解释。

    您会注意到此版本比最初的版本快许多倍。

    关于math - 使用NEON对ARM汇编中的四字向量中的所有元素求和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6931217/

    10-09 13:33