玩轉pandaboard之linaro對於Android的編譯上的一些優化

之前看ELC2011的video輪播, 其中有Linaro發表的關於android platform的section, 其中說到了linaro對於android做了一些優化,尤其是編譯上的. 這裏就總結下其中提到的內容及相關概念.

首先,來看一下Linaro對AOSP的具體做了哪些優化:

  1. 使用O3代替了O2

  2. 關閉了默認的-fno-strict-aliasing, 新增-fmodulo-sched, -fmodulo-shed-allow-regmores, -Wl -hash-style=gnu -Werror=strict-aliasing

  3. O3時默認開啓一下高級選項: -finline-functions, -funcswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-rectorize, -fipa-cp-clone

  4. 對一些模塊開啓了-ffast-math

  5. 爲Cotex-A8/A9的SoC做了特殊優化

  6. 對於採用Graphite的優化: -fgraphite-identity, -floop-block, -floop-interchange, -floop-strip-mine, -ftree-loop-distribution, -ftree-loop-linear

  7. 對multi-core SoC的OpenMP優化: -ftree-parallelize-loops

  8. 對binutils: -Bsymbolic-functions, -flto, -fwhile-program

  9. 對gcc的優化: -fvisibility-inlines-hidden(優化啓動時間), 增加對gcc 4.7的支持

接下來, 再看看各個優化措施的內涵:

  1. 初識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), 從而提高並行性, 提高效率

  2. -fmodulo-sched, -fmodulo-shed-allow-regmoves
    是打開SMS之後,與之相對的兩個優化. 主要針對一些循環內部的寄存器使用優化及reorder

  3. -Wl -hash-style=gnu
    使用新的GNU Linker優化, 代替老的sysv. 參見http://lwn.net/Articles/192624/. 同時我整理的<拜讀大牛Ulrich Drepper大作之How To Write Shared Libraries>就有相關描述.
    提高了動態庫的加載速度

  4. -Werror=strict-aliasing
    優化導致的strict-aliasing警告,會作爲error報告.

  5. 一些O3默認打開的優化選項
    -finline-functions, 編譯器判斷是否有些函數可以編譯爲inline
    -funswitch-loops, 把loop中有的branch通過拆分成多個loop而提煉出來
    -fpredictive-commoning, 優化循環的迭代
    -fgcse-after-reload, 優化reload的次數
    -ftree-vectorize, 優化loop的並行性
    -fipa-cp-clone, 正對有些函數的參數會是constant而做的優化
    ...

  6. -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目錄下的代碼

  7. 開啓了對於graphite的相關優化
    關於graphite, 參見http://gcc.gnu.org/wiki/Graphite
    它是gcc的一種內部表示,用以更好表示一些中間信息

  8. 額外的一些針對動態鏈接的優化
    -Bsymbolic-functions, 通過影響對應的symbolic的visible屬性優化gnu ld的動作. 參考http://stackoverflow.com/questions/7216973/is-there-a-downside-to-using-bsymbolic-functionshttp://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

  9. 正對多核的優化
    -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

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章