1

我听说 iPhone 4 和 iPad 有一个称为 VFP 的 fpu,它在某种程度上优化了浮点运算,甚至允许 SIMD(尽管 GCC 是否利用这一点值得怀疑)。但是,我读到对于某些 Android 设备,使用定点而不是浮点的加速可以导致性能提高 20 倍。

在这些设备中使用定点算术而不是浮点实现我的代码的浮点密集型部分有什么优势。

4

2 回答 2

6

iPhone 3G armv6 CPU 有一个 VFP 流水线浮点单元,其吞吐量比以整数执行相同计算要高。GCC 确实支持生成调度用于流水线的 VFP 指令。iPhone 3GS 和 iPhone 4 armv7 CPU 没有流水线 VFP 单元,因此在某些浮点序列上实际上比 iPhone 3G 稍慢;但是 armv7 处理器在可向量化短浮点上更快,因为它具有 NEON 并行向量单元。一些 Android 设备 CPU 根本没有任何硬件浮点单元,因此操作系统对 FP 使用软件仿真,这可能比整数或定点慢一个数量级以上。

一般的经验法则可能是,如果您的算法只能处理 24 位尾数精度,并且不要在浮点数和整数之间进行大量转换,请在 iOS 上使用短浮点数。它几乎总是更快。

但是,如果您想用您的 C 代码(使用 NDK)支持较旧的 Android 设备,请使用缩放整数。

如果您的应用程序没有进行大量的数字运算,那么对于一个低于 0.1% 的典型应用程序来说,上述任何一项都不会产生明显的差异。

于 2011-04-01T05:57:40.820 回答
1

正如hotpaw2所说,iPhone 4 和 iPad 2 都具有硬件浮点,因此您不会看到在缺少此类硬件的平台上获得的数量级加速。

也就是说,NEON 向量单元确实支持整数运算和浮点运算,并且可以通过将某些运算转换为定点问题来加速某些运算。 但是,除非您真正了解自己在做什么,并准备编写关键例程的汇编实现,否则您不会看到任何好处。

如果它适合您的问题,请坚持使用浮点。如果您需要提高性能,我保证跟踪您的应用程序的执行将提供更多更好的调优机会。

于 2011-04-02T04:16:39.703 回答