使用NEON对ARM程序集中四字向量中的所有元素求和

A P*_*son 6 math assembly arm neon

我对装配很新,虽然手臂信息中心经常有用,但有时说明对新手来说有点混乱.基本上我需要做的是在四字寄存器中求和4个浮点值并将结果存储在单个精度寄存器中.我认为指令VPADD可以做我需要的但我不太确定.

Jak*_*LEE 2

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

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

  1. 许多管道联锁

  2. 每次迭代不必要的 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
Run Code Online (Sandbox Code Playgroud)
  • pld - 虽然是 ARM 指令而不是 NEON - 对性能至关重要。它极大地提高了缓存命中率。

我希望上面的其余代码是不言自明的。

您会注意到这个版本比您最初的版本快很多倍。