2011年12月05日

Android 4.0で利用されているLLVM

Android4.0(Ice Cream Sandwich)のソースコードを見て、RenderScriptLLVMの技術が使われているのがわかりました。(正確には3.xからですが、ソースが公開されていなかったので詳細を確認できませんでした。)

技術的な興味で少し調べたのでここにメモを残します。



Android RenderScript on LLVM

この資料から図を拝借して。

ホスト側で

renderscript1

.rsファイルから.bc(bitcode: LLVMの中間言語フォーマット)にコンパイルするとともに、関数の呼び出しのためのラッパーメソッドや変数のgetter/setterメソッドのJavaソースコードが自動生成される。このためJavaとRenderscript間でのやりとりは簡単。JNIは不要。

ターゲット側で

renderscript2

(図中では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の方の発表資料がわかりやすいです。

Android RenderScript on LLVM

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対応の状況

2011 European User Group Meetingでの発表資料。

EuroLLVM2011-LLVMplusARM.pdf

関連するページ

KMCブログのLLVM関連記事

ソースコードのリンクにはOESFの http://tools.oesf.biz/android-4.0.1_r1.0/xref/ を利用させていただきました。



トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード