5

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

4

3 回答 3

7

您可以找到有关Cortex-A8的高级 SIMD 指令的指令特定调度的信息(他们不会为较新的内核发布它,因为自那以后时序业务变得相当复杂)。

请参阅高级 SIMD 整数 ALU 指令高级 SIMD 浮点指令

您可能需要阅读有关如何阅读这些表格的说明。

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

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

于 2013-05-31T11:14:28.733 回答
4

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

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

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

于 2013-05-31T10:57:51.787 回答
3

我会参考 auselen 的答案以获得所有参考资料的重要链接,但是,我发现实际的周期计数有点误导。确实,它可以根据您需要的精度“任意选择”,但是假设您在例程中有一些并行性,并且可以一次有效地操作两个字(SP 浮点数)。让我们假设您需要浮点可能是个好主意的精度...... 24 位。

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

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

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

对于浮点数:

  • 将 2 乘 2 32 位浮点数相乘。这需要一个周期。

因此,对于这种情况,您绝对不可能选择整数而不是浮点数。

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

此外,正如 auselen 所提到的,较新的内核具有不同的微架构,并且事情总是在变化。我们很幸运 ARM 实际上公开了他们的信息。对于像 Apple、Qualcomm 和三星(可能还有其他......)这样修改微架构的供应商来说,唯一知道的方法就是尝试一下,如果您正在编写汇编,这可能需要大量工作。不过,我认为官方 ARM 指令计时网站可能非常有用。而且我确实认为他们发布了A9 的数字,而且这些数字大多相同。

于 2013-06-04T15:47:07.040 回答