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

时间:2013-05-31 10:47:24

标签: c arm neon

浮点运算和整数运算都是相同的速度?如果不是这样,整数版本会快多少?

3 个答案:

答案 0 :(得分:6)

您可以找到有关Cortex-A8的Instruction-specific scheduling for Advanced SIMD instructions的信息(由于时间业务变得非常复杂,因此他们不会将其发布给新的核心。)

请参阅Advanced SIMD integer ALU instructionsAdvanced SIMD floating-point instructions

您可能需要阅读how to read those tables的解释。

为了给出完整的答案,通常浮点指令需要两个周期,而在ALU上执行指令需要一个周期。另一方面,long long(8字节整数)的乘法是四个周期(forum same source),而double的乘法是两个周期。

一般情况下,您似乎不应该关心浮点数与整数,但仔细选择数据类型(浮点数对双数,整数对长长数)更为重要。

答案 1 :(得分:4)

这取决于您拥有的型号,但趋势是整数有更多机会使用128位宽的数据路径。在较新的CPU上不再适用。

当然,整数运算也使您有机会通过使用16位或8位运算来增加并行性。

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

答案 2 :(得分:2)

我会参考auselen的回答来获得所有参考文献的链接,然而,我发现实际的循环计数有点误导。确实,它可以“根据您需要的精度”“走两条路”,但是假设您在例程中有一些并行性,并且可以一次有效地操作两个单词(SP float)。让我们假设你需要精确的浮点数可能是一个好主意... 24位。

特别是在分析NEON性能时,请记住存在回写延迟(流水线延迟),因此如果需要将结果作为另一条指令的输入,则必须等待结果准备就绪。

对于固定点,您需要32位整数来表示至少24位精度:

  • 将2×2的32位数相乘,得到64位结果。这需要两个周期,并需要一个额外的寄存器来存储广泛的结果。
  • 将64位数字移回所需精度的32位数字。这需要一个周期,你必须等待乘法的回写(5-6周期)延迟。

对于浮点数:

  • 将两个二比特的32位浮点数相乘。这需要一个周期。

因此,对于这种情况,你无法选择整数优于浮点数。

如果您正在处理16位数据,那么权衡更接近,尽管您可能仍需要额外的指令来将乘法结果移回所需的精度。为了在使用Q15时获得良好的性能,您可以在VQDMULH数据上使用s16指令,并使用比SP浮点更少的寄存器来实现更高的性能。

此外,正如auselen所提到的,新的核心具有不同的微架构,而且事情总是在变化。我们很幸运,ARM实际上公开了他们的信息。对于像Apple,高通和三星(可能是其他人......)那样修改微体系结构的供应商,唯一知道的方法就是尝试它,如果你正在编写程序集,这可能会有很多工作。不过,我认为官方ARM指令计时网站可能非常有用。我确实认为他们发布了numbers for A9,这些大多数都是相同的。