上週五 (June 19),Matt 跟我分享 Android 之上 Power Management 的背景概念、實做,以及可改進的方向,而論及 Android 的系統架構設計時,不免得先談談 Linux PM,期待這份簡報對進行系統移植與客製化的同好有助益:
簡報: Power Management from Linux Kernel to Android
升級 Android 內建 GNU Toolchain 到 gcc 4.4
GNU GCC 4.4 已於 Apr 21, 2009 正式釋出,伴隨眾多改進、修正,與硬體平台改善,詳情可見"GCC 4.4 Release Series Changes, New Features, and Fixes",不過 Android repository 裡頭的 prebuilt GNU Toolchain 仍停留在 gcc-4.2.1 (Release date: Jul 18, 2007),總是有些遺憾,且讓我們動手改變。
EMBINUX™ Lab 提供一份 prebuilt GNU Toolchain for Android,參考其 git 的更動,可建立一套基於 gcc-4.4 與 binutils-2.19.1 的 toolchain,筆者準備打包好的套件: toolchain-arm-eabi-4_4_0.tar.bz2。另外,因為 gcc-4.4 對於 C/C++ 語意更加嚴格,像是應用程式對 va_list 的使用就需要調整,筆者將這些小修改整理為 migrate-gcc44.patch。以下是簡要的升級方式:
重新編譯與建構 Android 即可。需要更動的部份,列出作參考:# cd mydroid
# cd prebuilt/linux-x86/toolchain
# tar jxvf toolchain-arm-eabi-4_4_0.tar.bz2
# cd ../../..
# patch -p1 < migrate-gcc44.patch
read on# diffstat migrate-gcc44.patch
core/combo/linux-arm.mk | 2 +-
dist/sqlite3.h | 2 +-
envsetup.sh | 2 +-
pdk/ndk/samples/sample/Makefile.lib | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
改善 Android 中 memcpy 效能
在 Android 內部實做中,有許多細節涉及大量的 memcpy() 操作,比方說將一塊使用者定義的繪圖區域傳遞給 SurfaceFlinger 管理的過程,由於得先轉換成 texture,再對應為 Surface,之間至少需要三次 memcpy。由於 BeagleBoard (TI OMAP3) 透過 HDMI 輸出 (max: 1280x1024),居中涉及大量的繪圖操作,意味著 memcpy() 頻繁被呼叫著,對整體效能有顯著的影響,於是筆者花了一些時間分析。
Android 的 libc 實做 -- bionic -- 已包含針對 ARMv5 優化過的 memcpy(),詳情可參考 libc/arch-arm/bionic/memcpy.S,而 GNU Toolchain (glibc) 中,其實也有一份針對 ARMv5 優化過的 memcpy() 實做,也利用到 ARMv5 的 data prefetch 指令。既然我們採用 ARMv7 架構的 BeagleBoard,何不使用其引入的 NEON SIMD 加速指令集呢?以下就是在 BeagleBoard 所作的 benchmark:
數據如下:
- glibc-armv5 : 181884276 B/s
- bionic-armv5 : 225881095 B/s
- armv7 : 269294302 B/s
- .fpu neon
- .text
- .global memcpy_neon
- .func memcpy_neon
- memcpy_neon:
- push {r4-r11}
- mov r3, r0
- 1: subs r2, r2, #128
- pld [r1, #64]
- pld [r1, #256]
- pld [r1, #320]
- ldm r1!, {r4-r11}
- vld1.64 {d0-d3}, [r1,:128]!
- vld1.64 {d4-d7}, [r1,:128]!
- vld1.64 {d16-d19}, [r1,:128]!
- stm r3!, {r4-r11}
- vst1.64 {d0-d3}, [r3,:128]!
- vst1.64 {d4-d7}, [r3,:128]!
- vst1.64 {d16-d19}, [r3,:128]!
- bgt 1b
- pop {r4-r11}
- bx lr
- .endfunc