使用 NEON 对 ARM 汇编中的四字向量中的所有元素求和
我对组装相当陌生,尽管手臂信息中心通常很有帮助,但有时这些说明可能会让新手感到有点困惑。基本上我需要做的就是对四字寄存器中的 4 个浮点值求和,并将结果存储在单个精度寄存器中。我认为 VPADD 指令可以满足我的需要,但我不太确定。
Im rather new to assembly and although the arm information center is often helpful sometimes the instructions can be a little confusing to a newbie. Basically what I need to do is sum 4 float values in a quadword register and store the result in a single precision register. I think the instruction VPADD can do what I need but I'm not quite sure.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以尝试这个(它不在 ASM 中,但您应该能够轻松转换它):
在 ASM 中,它可能只有 VADD 和 VPADD。
我不确定这是否只是执行此操作的一种方法(也是最佳方法),但我还没有想到/找到更好的方法...
PS。我也是 NEON 新手
You might try this (it's not in ASM, but you should be able to convert it easily):
In ASM it would be probably only VADD and VPADD.
I'm not sure if this is only one method to do this (and most optimal), but I haven't figured/found better one...
PS. I'm new to NEON too
看来您想要获得一定长度的数组的总和,而不仅仅是四个浮点值。
在这种情况下,您的代码可以工作,但远未优化:
许多管道互锁
每次迭代不必要的32位添加
假设长度数组的大小是 8 的倍数且至少为 16:
我希望上面的其余代码是不言自明的。
您会注意到这个版本比您最初的版本快很多倍。
It seems that you want to get the sum of a certain length of array, and not only four float values.
In that case, your code will work, but is far from optimized :
many many pipeline interlocks
unnecessary 32bit addition per iteration
Assuming the length of the array is a multiple of 8 and at least 16 :
I hope the rest of the code above is self explanatory.
You will notice that this version is many times faster than your initial one.
这是 ASM 中的代码:
我可能忘记提及,在 C 中,代码看起来像这样:
我省略了这段 asm 代码中的乘法。
Here is the code in ASM:
I may have forgotten to mention that in C the code would look like this:
I have omitted the multiplication from this little piece asm of code.