2011年12月05日
Android 4.0で利用されているLLVM
Android4.0(Ice Cream Sandwich)のソースコードを見て、RenderScriptにLLVMの技術が使われているのがわかりました。(正確には3.xからですが、ソースが公開されていなかったので詳細を確認できませんでした。)
技術的な興味で少し調べたのでここにメモを残します。
Android RenderScript on LLVM
この資料から図を拝借して。
ホスト側で
.rsファイルから.bc(bitcode: LLVMの中間言語フォーマット)にコンパイルするとともに、関数の呼び出しのためのラッパーメソッドや変数のgetter/setterメソッドのJavaソースコードが自動生成される。このためJavaとRenderscript間でのやりとりは簡単。JNIは不要。
ターゲット側で
(図中ではJavaのソースコードがapkに入っているように書かれているが、実際にはそのソースからコンパイルされたDEXファイルが入っている。)
libbccは現在はARMとx86向けのコード生成をサポート。将来はGPUやDSPも。
ベクター演算をサポートしていて、NEONが使えるターゲットならばNEONのSIMD命令を生成する。
図中の"System Library .bc files" のうちのひとつはlibclcore.bcで、そのソースは以下のファイル。
frameworks/compile/libbcc/lib/ScriptCRT/rs_cl.c
frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c
LTO(Link Time Optimization)により、これらのSystem Libraryの呼び出しはインライン展開の対象になると思われる。
ターゲット側でのコンパイルはJITとAOTの両方が可能であるが、最適化に時間がかかるので現在はJITを無効にしてAOTで使用している。コンパイルした結果はキャッシュファイルに保存される。
コンパイラのランタイムライブラリにはcompiler-rtが使用されている。libgcc互換だそうだ。
ICSのLiveWallPaperは新しいRenderscriptを利用して書き直されてる。それらのソースコードはpackages/wallpapers/Basic
例えば
packages/wallpapers/Basic/src/com/android/wallpaper/nexus/nexus.rs
画面をタップしたときには、JavaからmScript.invoke_addTap(x, y);を呼べば、nexus.rsのvoid addTap(int x, int y)が呼ばれる。
参考資料
RenderScriptの概要
developer.android.comのRenderScriptのページ
RenderScriptのしくみ
collaboration summit 2011でのGoogleの方の発表資料がわかりやすいです。
collaboration summit 2011では4つのLLVMのセッションがあり、どれも興味深いです。
ソースコードの中にある説明
frameworks/compile/libbcc/README.rst
frameworks/compile/slang/README.rst
速度を実測した方がいました
Android 3.x RenderScript (7) RenderScript Compute の速度
残念ながらこのときにはNEONがつかえるAndroid3.x機がなかったようです。NEONの効果を見てみたいです。この方のRenderScript (1) - (6)のエントリも興味深い。
LLVMのARM対応の状況
関連するページ
ソースコードのリンクにはOESFの http://tools.oesf.biz/android-4.0.1_r1.0/xref/ を利用させていただきました。