或者浮点运算和整数运算速度相同?如果不是这样,整数版本要快多少?
3 回答
您可以找到有关Cortex-A8的高级 SIMD 指令的指令特定调度的信息(他们不会为较新的内核发布它,因为自那以后时序业务变得相当复杂)。
请参阅高级 SIMD 整数 ALU 指令与高级 SIMD 浮点指令:
您可能需要阅读有关如何阅读这些表格的说明。
为了给出完整的答案,通常浮点指令需要两个周期,而在 ALU 上执行的指令需要一个周期。另一方面,long long(8 字节整数)的乘法是四个周期(论坛相同的来源),而 double 的乘法是两个周期。
一般来说,您似乎不应该关心浮点数与整数,但仔细选择数据类型(浮点数与双精度数,整数与长整数)更为重要。
这取决于您使用的模型,但趋势是整数有更多机会使用 128 位宽数据路径。这在较新的 CPU 上不再适用。
当然,整数运算也使您有机会通过使用 16 位或 8 位运算来增加并行度。
与所有整数与浮点参数一样,这取决于具体问题以及您愿意在调优上投入多少时间,因为它们很少能运行完全相同的代码。
我会参考 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 的数字,而且这些数字大多相同。