近期正在往Android平台移植算法。确切地说,是针对ARM A8 A9 平台进行优化。发现不同芯片的浮点能力差别颇大。A9系列明显强于A8系列,大约有3倍多的提升,应该就是VFP管线化的优势。不过即使相同核心,不同厂家的芯片也会有不少差别。起初用本人手机,ATRIX,Tegra2处理器,A9双核。测算了一下,跑浮点算法速度是我台式机的三分之一。折算为相同频率的话,已经相差无几了。PC的算法直接编译就可以使用,速度直接达标,DSP时期的什么浮点转定点,直接就Pass掉,啥优化不用,真是惊叹。不过拿上其他A8板子,惊喜立马就飞走了,优化还是得做的,活省不了。主要可用的就是NEON了。

优化NEON时,挑了几个典型函数,比如向量内积、比例求和、互相干系数,让人去尝试看看。一开始按照TI DSP的惯用招数,将运算用一系列NEON内联函数去整,发现速度仅提升了10%,搞不下去。我分析了汇编代码,发现编出来的有很多栈操作,比如关键的运算语句就一条,但前后 vstd 和 vldr 有十来条,不慢才怪。网上搜搜,也有类似情况,似乎编译器对NEON内联的优化较弱,没法把运算串起来。使出最后一招:嵌入式汇编手工优化,看了半天指令集,挑了最简单的比例求和函数,其实汇编的话,也就对应三条运算语句,就是算上加载和保存,也就十来句,比起编译器出来的几十条省了很多。运行一下,速度提升了5倍。这下有搞头了,让工程师把其他几个也整了,最高有20倍提升。就是编起来有点费劲,半天一个小函数,只能用于优化核心费时的部分。

有两个比较不错的参考资料:

http://hilbert-space.de/?p=22 RGB转灰度的优化实例,里面展现了函数对应的汇编指令,以及手工汇编的结果,主要是对加载、保存进行了优化。

http://blogs.arm.com/software-enablement/241-coding-for-neon-part-3-matrix-multiplication/ 官方实例,矩阵乘法的NEON移植分析与实现。

另外 OpenMAX库也可以看看。

更多相关文章

  1. Android(安卓)& Linux的suspent和resume执行流程
  2. 【凯子哥带你学Android】Andriod性能优化之列表卡顿——以“简书
  3. Android(安卓)性能监测工具,优化内存、卡顿、耗电、APK的方法
  4. android 浏览器 app层,framework层,webkit层消息的交互
  5. Android直播开发之旅(16):使用FFmpeg保存网络流到本地文件
  6. Android中的信息输出:System.out和Log的源码分析与对比(Log篇)
  7. Android(安卓)layout之优化:使用include和merge 标签
  8. android垃圾回收机制及程序优化System.gc
  9. Android(安卓)优化OTA包大小和开机启动时间

随机推荐

  1. [干货] Android(安卓)深入浅出 Activity
  2. android 的 service远程运用
  3. Android(安卓)源码中编译Android(安卓)st
  4. 读取android手机流量信息
  5. Android(安卓)SDK 安装中组件的离线安装
  6. Android学习笔记:androidmanifest.xml 高
  7. android 中的 Bitmap 相关
  8. Android剪切板(ClipboardManager)复制文
  9. 面向忙碌开发者的 Android(安卓)知识点收
  10. Smalidea+IntelliJ IDEA/Android(安卓)St