首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为多个架构生成优化的NDK代码?

为多个架构生成优化的NDK代码?
EN

Stack Overflow用户
提问于 2011-02-23 18:41:57
回答 2查看 25K关注 0票数 53

我有一些Android的C代码,可以做很多低级的数字运算。我想知道我应该使用什么设置(例如我的Android.mk和Application.mk)文件,以便生成的代码可以在所有当前的安卓设备上运行,同时还可以利用针对特定芯片组的优化。我正在寻找好的默认Android.mk和Application.mk设置来使用,并且我希望避免在我的C代码中使用#ifdef分支。

例如,我知道ARMv7有浮点指令,一些ARMv7芯片支持霓虹灯指令,而默认的ARM既不支持这两种指令。是否可以设置标志,以便我可以构建带有霓虹灯的ARMv7、没有霓虹灯的ARMv7和默认的ARM构建?我知道怎么做后两个,但不是全部三个。我对我使用的设置很谨慎,因为我假设当前的默认设置是最安全的设置,以及其他选项有什么风险。

对于特定于GCC的优化,我使用以下标志:

代码语言:javascript
复制
LOCAL_CFLAGS=-ffast-math -O3 -funroll-loops

我已经检查了所有这3个加速我的代码。还有没有其他常见的我可以补充的?

我的另一个技巧是将"LOCAL_ARM_MODE := arm“添加到Android.mk中,以便在较新的arm芯片上实现加速(尽管我对这到底是做什么以及在较旧的芯片上发生了什么感到困惑)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-23 23:39:18

ARM处理器支持两个通用指令集:"ARM“和"Thumb”。虽然两者都有不同的风格,但ARM指令和Thumb指令各为32位和Thumb指令。两者之间的主要区别是,ARM指令可以在一条指令中做比Thumb更多的事情。例如,单个ARM指令可以将一个寄存器添加到另一个寄存器,同时对第二个寄存器执行左移。在Thumb中,一条指令必须进行移位,然后第二条指令将进行加法。

ARM指令不是两倍好,但在某些情况下,它们可以更快。这在手摇臂装配中尤其如此,它可以以新颖的方式进行调整,以最大限度地利用“免费换班”。Thumb指令有其自身的优势和大小:它们消耗的电池更少。

无论如何,这就是LOCAL_ARM_MODE所做的--它意味着你将你的代码编译成ARM指令而不是Thumb指令。编译为Thumb是NDK中的默认设置,因为它倾向于创建较小的二进制文件,并且速度差异对于大多数代码来说并不明显。编译器不能总是利用ARM提供的额外的“魅力”,所以你最终还是需要或多或少相同数量的指令。

从编译到ARM或Thumb的C/C++代码中看到的结果将是相同的(除了compiler bugs)。

这本身就兼容了当今所有Android手机的新旧ARM处理器。这是因为默认情况下,NDK编译为支持ARMv5TE指令集的基于ARM的CPU的“应用程序二进制接口”。这个ABI被称为"armeabi“,可以通过APP_ABI := armeabi在Application.mk中显式设置。

较新的处理器还支持安卓专用的ABI,称为armeabi-v7a,它扩展了armeabi以添加Thumb-2 instruction set和名为VFPv3-D16的硬件浮点指令集。兼容armeabi-v7a的CPU还可以选择性地支持霓虹灯指令集,您必须在运行时检查该指令集,并提供代码路径以确定何时可用,何时不可用。NDK/samples目录中有一个执行此操作的示例(hello-neon)。在引擎盖下,Thumb-2更像“手臂”,因为它的指令可以在一条指令中做更多的事情,同时仍然具有占用更少空间的优势。

为了编译同时包含armeabi和armeabi-v7a库的“胖二进制文件”,您需要在Application.mk中添加以下代码:

代码语言:javascript
复制
APP_ABI := armeabi armeabi-v7a

安装.apk文件后,Android包管理器会为设备安装最好的库。因此,在较旧的平台上,它将安装armeabi库,而在较新的设备上,将安装armeabi-v7a库。

如果您想在运行时测试CPU特性,那么可以使用NDK函数uint64_t android_getCpuFeatures()来获取处理器支持的特性。这将在v7a处理器上返回位标志ANDROID_CPU_ARM_FEATURE_ARMv7,如果支持硬件浮点,则返回ANDROID_CPU_ARM_FEATURE_VFPv3;如果支持高级单指令多路指令,则返回ANDROID_CPU_ARM_FEATURE_NEON。ARM没有VFPv3就不能有霓虹灯。

总结:默认情况下,您的程序是最兼容的。由于使用了ARM指令,使用LOCAL_ARM_MODE可能会以电池寿命为代价略微加快速度,而且它与默认设置一样兼容。通过添加APP_ABI := armeabi armeabi-v7a行,您将在较新的设备上提高性能,保持与较旧的设备兼容,但您的.apk文件将更大(由于有两个库)。为了使用霓虹灯指令,您需要编写在运行时检测CPU能力的特殊代码,这只适用于可以运行armeabi-v7a的较新设备。

票数 112
EN

Stack Overflow用户

发布于 2012-02-26 03:42:51

很好的答案,就像添加你应该使用的

代码语言:javascript
复制
APP_ABI := all

这将编译4个二进制文件: armv5、armv7、x86和mips

您可能需要新版本的ndk

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5089783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档