我对使用GCC和EABI的ARM-CPU目标的特殊C编程技术的任何建议感兴趣。我的应用程序包含对大型数据阵列的浮点密集型计算。主要目标是获得最快的可执行文件。大多数情况下,我使用codesourcery和android-ndk的arm-eabi-gcc版本。我也不想使用neon-intrinsics或对C代码进行任何更改,这些更改与其他体系结构的其他编译器(如IA32的Intel编译器)不兼容。
答案 0 :(得分:4)
由于大多数ARM目标没有FPU,如果您想要“最快的可执行文件”,则应考虑使用定点库。这篇Dr. Dobb的文章:Optimizing Math-Intensive Applications with Fixed-Point Arithmetic对CORDIC算法有很好的解释,并为本文讨论的库提供了完整的源代码。本文正是关于在没有FPU的ARM设备上加速数学密集型代码。报告的结果通常是浮点实现的4倍加速度,这使得不使用矢量化的VFP(编译器除了通过库代码之外不太可能支持)提供5倍的加速度,这对于软件实现来说非常有用。 / p>
注意:我使用过此库并在log()函数中发现错误。通过在log_two_power_n_reversed []数组初始化器的末尾添加0x0LL来纠正此问题。我已经与作者确认了这一更正。文章中代码的链接已损坏,请在以下位置找到:ftp://ftp.drdobbs.com/sourcecode/ddj/2008/0804.zip
[编辑] 糟糕,抱歉文章和代码讨论了C ++实现,使用运算符和函数重载进行广泛的使用,以尽可能透明地使用fixed
类型。也许是使用C ++编译的一个很好的理由,但不是你要求的。
答案 1 :(得分:3)
如果你想保持可移植性,我的建议是“不要使用浮点数”。大多数ARM芯片没有FPU,必须用软件模拟操作。
一般来说,基准,变更和基准再次。没有在性能测量之前/之后进行彻底的性能优化是徒劳的。
答案 2 :(得分:0)
为了在没有FPU的CPU上最大化性能,还应该选择“软浮点”而不是“硬浮点”。这样,您的可执行文件将链接到浮点库,而不是依赖于内核捕获非法指令并在内核中模拟它们(由于涉及上下文切换,这需要更多时间)。
当然,如果你的CPU有硬件浮点单元,你应该使用硬浮点来使用它。
幸运的是,EABI允许两种类型的可执行文件和库和平共存。
答案 3 :(得分:0)
唉,对于当前用于智能手机的所有ARM处理器的最佳数字运算性能,最好的方法可能是为每个ARM体系结构做一些完全不同的事情:缩放整数运算或更慢的软浮动,用于无fpu芯片,具有流水线VFP硬件的芯片的可重叠浮点,以及用于支持NEON的芯片的并行非便携式NEON内在函数。您可能必须对所有这些进行编码,并在检测到CPU架构后使用运行时计算例程选择。