ARM的NEON对于整数比浮点数更快吗?

5

浮点运算和整数运算的速度相同吗?如果不是,整数版本有多快?

3个回答

7
您可以找到关于Cortex-A8的Advanced SIMD指令的特定调度信息(他们不再发布更新版本的相关信息,因为定时业务变得非常复杂)。参见Advanced SIMD整数ALU指令Advanced SIMD浮点指令的区别。您可能需要阅读有关如何阅读这些表格的说明。总的来说,浮点指令需要两个周期,而在ALU上执行的指令则只需要一个周期。另一方面,长长的乘法(8字节整数)需要四个周期(同样的来源),而double的乘法只需要两个周期。总的来说,您似乎不应该关注浮点数与整数,但是仔细选择数据类型(float vs double,int vs long long)更为重要。

4

这取决于您使用的模型,但倾向于整数具有更多使用128位宽数据路径的机会。但在新的CPU上已经不再是这样了。

当然,整数算术还可以通过使用16位或8位操作来增加并行性。

与所有整数与浮点数之间的争论一样,这取决于具体问题以及您愿意投入多少时间进行调优,因为它们很少能完全运行相同的代码。


3
我会参考auselen的答案,提供所有相关链接的参考资料,但我发现实际的周期计数有些误导。确实,这取决于您所需的精度,但假设您的例程中有一些并行性,并且可以有效地同时处理两个字(SP浮点数)。假设您需要浮点数可能是一个好主意的精度... 24位。
特别是在分析NEON性能时,请记住存在写回延迟(流水线延迟),因此如果需要将结果作为另一个指令的输入,则必须等待结果准备就绪。
对于定点,您将需要32位整数来表示至少24位的精度:
- 将两个32位数字相乘,得到64位结果。这需要两个周期,并需要额外的寄存器来存储宽结果。 - 将64位数字移回所需精度的32位数字。这需要一个周期,并且您必须等待来自乘法的写回(5-6个周期)延迟。
对于浮点数:
- 将两个32位浮点数相乘。这需要一个周期。

因此,在这种情况下,你肯定不会选择整数而不是浮点数。

如果你正在处理16位数据,则权衡要更接近,尽管你可能仍需要额外的指令将乘法的结果移回所需的精度。如果你使用Q15并希望实现良好的性能,则可以在s16数据上使用VQDMULH指令,并且使用较少的寄存器就可以实现更高的性能,而不是使用SP float。

另外,正如auselen所提到的,新型芯片有不同的微架构,事情总是在变化中。我们很幸运,ARM实际上公开了他们的信息。对于像苹果、高通和三星(可能还有其他厂商...)这样修改微体系结构的厂商来说,唯一的办法就是去尝试,如果你在写汇编代码,这可能是很多工作。不过,我认为官方的ARM指令计时网站可能非常有用。我确实认为他们发布了A9的数字,而且这些数字基本相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接