玩转pandaboard之linaro对于Android的编译上的一些优化
来源:互联网 发布:linux的用处 编辑:程序博客网 时间:2024/05/19 14:36
之前看ELC2011的video轮播, 其中有Linaro发表的关于android platform的section, 其中说到了linaro对于android做了一些优化,尤其是编译上的. 这里就总结下其中提到的内容及相关概念.
首先,来看一下Linaro对AOSP的具体做了哪些优化:
- 使用O3代替了O2
- 关闭了默认的-fno-strict-aliasing, 新增-fmodulo-sched, -fmodulo-shed-allow-regmores, -Wl -hash-style=gnu -Werror=strict-aliasing
- O3时默认开启一下高级选项: -finline-functions, -funcswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-rectorize, -fipa-cp-clone
- 对一些模块开启了-ffast-math
- 为Cotex-A8/A9的SoC做了特殊优化
- 对于采用Graphite的优化: -fgraphite-identity, -floop-block, -floop-interchange, -floop-strip-mine, -ftree-loop-distribution, -ftree-loop-linear
- 对multi-core SoC的OpenMP优化: -ftree-parallelize-loops
- 对binutils: -Bsymbolic-functions, -flto, -fwhile-program
- 对gcc的优化: -fvisibility-inlines-hidden(优化启动时间), 增加对gcc 4.7的支持
接下来, 再看看各个优化措施的内涵:
- 初识O1, O2, O3
生成的代码performance: O3 > O2 > O1, 但是O3有可能引入一些性能退化. 同时, O3以效率为先, 可能导致生成的代码规模扩大并耗费更多的编译时间
对于O3, 开启了vectorizer, NEON unit, Swing Modulo Scheduling (SMS)
GCC vectoriser: 通过分析代码, 从写可以提高并行性的代码, 并把它们转换为可供NEON执行的格式(embedded GPU编程 ).
SMS: 识别可能会有高延迟的代码(如,会有一些IO操作, 或者寄存器的交叉引用), 重写为三步曲(pre, median, post), 从而提高并行性, 提高效率- -fmodulo-sched, -fmodulo-shed-allow-regmoves
是打开SMS之后,与之相对的两个优化. 主要针对一些循环内部的寄存器使用优化及reorder- -Wl -hash-style=gnu
使用新的GNU Linker优化, 代替老的sysv. 参见http://lwn.net/Articles/192624/. 同时我整理的<拜读大牛Ulrich Drepper大作之How To Write Shared Libraries>就有相关描述.
提高了动态库的加载速度- -Werror=strict-aliasing
优化导致的strict-aliasing警告,会作为error报告.- 一些O3默认打开的优化选项
-finline-functions, 编译器判断是否有些函数可以编译为inline
-funswitch-loops, 把loop中有的branch通过拆分成多个loop而提炼出来
-fpredictive-commoning, 优化循环的迭代
-fgcse-after-reload, 优化reload的次数
-ftree-vectorize, 优化loop的并行性
-fipa-cp-clone, 正对有些函数的参数会是constant而做的优化
...- -ffast-math
打开了‘-fno-math-errno’, ‘-funsafe-math-optimizations’, ‘-ffinite-math-only’,‘-fno-rounding-math’, ‘-fno-signaling-nans’ and ‘-fcx-limited-range’.
在一些不需要符合IEEE or ISO的数学函数时,会生成更快的代码
在linaro的实现中(截至4.0.3),以下模块打开了-ffast-math的编译选项
主要是2d/3d处理的相关library: opengl, libpng, x264等external目录下的代码- 开启了对于graphite的相关优化
关于graphite, 参见http://gcc.gnu.org/wiki/Graphite
它是gcc的一种内部表示,用以更好表示一些中间信息- 额外的一些针对动态链接的优化
-Bsymbolic-functions, 通过影响对应的symbolic的visible属性优化gnu ld的动作. 参考http://stackoverflow.com/questions/7216973/is-there-a-downside-to-using-bsymbolic-functions及http://sourceware.org/binutils/docs/ld/Options.html#index-g_t_002dBsymbolic-148
-fwhile-program, -flto, 参见http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html中的相关描述
-fvisibility-inlines-hidden, 同样是通过影响动态库中的导出表的大小来影响加载的速度. 参见http://gcc.gnu.org/wiki/Visibility- 正对多核的优化
-ftree-parallelize-loops=n, 使得一些需要CPU过的参与的循环能够在多个CPU中执行.
其它关于android optimization的资料:
http://www.linaro.org/linaro-blog/2011/10/10/compiling-with-gcc-o3/
http://www.linaro.org/linaro-blog/2011/10/25/compiler-flags-used-to-speed-up-linaro-android-2011-10-and-future-optimizations/
http://free-electrons.com/pub/video/2011/elce/elce-2011-pfeffer-linaro-android-platform-450p.webm, 从19分钟开始
http://elinux.org/images/0/02/Android_Platform_Optimizations_SNPS_20111027.pdf
http://elinux.org/images/d/de/ELCE_2011_-_BZ_-_Embedded_Linux_Optimization_Techniques_-_How_Not_to_Be_Slow.pdf
关于GNU 优化的资料:
Ulrich Drepper, Optimizing Applications with gcc & glibc; Application Optimization on Linux Tutorial Material
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
- 玩转pandaboard之linaro对于Android的编译上的一些优化
- 玩转pandaboard之linaro对于Android的编译上的一些优化
- linaro pandaboard android 编译kernel
- 玩转pandaboard之u-boot的编译及代码结构
- 编译linaro android for pandaboard隅到错误
- systemtap在android、pandaboard上的移植
- 编译Linaro的Android内核有感
- Pandaboard OMAP4460用linaro android源码启动
- 玩转pandaboard之初体验
- 玩转pandaboard之初体验
- 玩转pandaboard之rootfs制作及启动
- 玩转pandaboard之rootfs制作及启动
- 虚拟机上编译调试android的framework玩
- 对于文章页面优化的一些看法
- 对于于若何优化好上网站外部的一些履历
- PandaBoard 驱动编译 两种方式的makefile
- android4.0.3在pandaboard上的成功移植
- 玩转Android之Drawable的使用
- GStreamer获取摄像头
- 分层Pane结构与Swing组件高级特性的实现
- 黑莓物流解决方案BlackBerry Logistics solution
- memcmp和strcmp函数
- Ubuntu12.04安装Flash(Firefox和Chrome)
- 玩转pandaboard之linaro对于Android的编译上的一些优化
- 沁园春.下班路
- asp.net导出csv文件
- IOCTL命令号
- mapper.c 小工具
- eclipse 神技救我一命
- Ubuntu12.04下安装Eclipse
- ORGE构建
- 如何混排Swing和AWT组件