ARM NEON汇编和浮点舍入

时间:2013-08-01 15:26:32

标签: optimization assembly arm neon

我正在使用NEON进行ARM处理器的代码优化。但是我有一个问题:我的算法包含以下浮点计算:

round(x*b - y*a)

结果既可以是积极的,也可以是消极的。

实际上我正在使用2个VMUL和1个VSUB进行并行计算(使用Q寄存器和32位浮点数的每个操作4个值)。

有一种方法可以解决这个问题吗?如果结果都是相同的符号我知道我可以简单地加或减0.5

2 个答案:

答案 0 :(得分:2)

我对汇编没有任何了解,但是在C中使用NEON内在函数(我提到它们的汇编等价物可以帮助你浏览文档,即使我自己也无法使用它们),算法为{{1功能可以是:

round

我想你能将它转换为汇编(我不是,无论如何)

请注意,我不知道这是否比标准代码,非SIMD代码更有效!

答案 1 :(得分:1)

首先,NEON遭受长延迟,特别是在浮点乘法之后。 与vfp编程相比,由于这两个vmuls和一个vsub,你不会获得很多收益。

因此,您的代码应如下所示:

vmul.f32 result, x, b
vmls.f32 result, y, a

这些乘法累加/减法指令与前一个乘法指令背靠背发出,没有任何延迟。 (在这种情况下保存了9个周期)

不幸的是,我不明白你的实际问题。为什么有人想要舍入浮动值?显然你打算提取四舍五入的整数部分,有几种方法可以做到这一点,我不能告诉你任何更多因为你的问题总是太模糊。

我已经在这个论坛上关注了你的问题很长一段时间了,我根本无法摆脱你缺乏一些非常基本的东西的感觉。

我建议你先从ARM阅读汇编参考指南pdf。