froyo dalvikvm jit

20

Click here to load reader

Upload: tetsuyuki-kobayashi

Post on 20-May-2015

5.275 views

Category:

Technology


2 download

DESCRIPTION

Japanese translation of Google I/O Dalvik JIT session

TRANSCRIPT

Page 1: Froyo DalvikVM JIT

Froyo の DalvikVM の JIT

Google I/O のセッションの解説

Tetsuyuki Kobayashi

Page 2: Froyo DalvikVM JIT

2

Who am I?

20+ years involved in embedded systems 10 years in real time OS, such as iTRON 10 years in embedded Java Virtual Machine Now Gcc, Linux, QEMU, Android, …

Blogs http://d.hatena.ne.jp/embedded/ (Personal) http://blog.kmckk.com/ (Corporate)

Twitter @tetsu_koba

Page 3: Froyo DalvikVM JIT

3

Today's topic

Google I/O での DalvikVM の JIT のセッションを読み解こう

”A JIT Compiler for Android's Dalvik VM” Ben Cheng, Bill Buzbee このセッション資料をわかるところだけ訳出し

てみました。

http://code.google.com/intl/ja/events/io/2010/sessions/jit-compiler-androids-dalvik-vm.html

Page 4: Froyo DalvikVM JIT

4

Dalvik インタプリタ

普通は 1/3 の時間しかインタプリタで消費されていない。

OS や性能に効くところはネイティブコードで書かれているから。

通常のアプリケーションには充分。 それでも CPU 喰いのアプリには

NDK でネイティブ化 JIT コンパイラ

Page 5: Froyo DalvikVM JIT

5

どんな JIT?

いつコンパイルするか インストール時、起動時、メソッド呼び出し時、命

令フェッチ時 何をコンパイルするか

プログラム全体、共有ライブラリ、ページ、メソッド、トレース、命令

Page 6: Froyo DalvikVM JIT

6

どんな JIT?

それぞれの組み合わせに利点と欠点がある Android で重視する点

最小限の追加メモリ DalvikVM のコンテナベースのセキュリティモデ

ル 起動してすぐに加速する インタプリタとコンパイル済みコードの間のス

ムーズな遷移

Page 7: Froyo DalvikVM JIT

7

メソッド単位の JIT

ほとんどのサーバ用 Java の JIT はこのタイプ ホットなメソッドをみつけてメソッド単位でコンパイル

とオプティマイズを行う 利点

より大きな最適化のウィンドウ メソッド呼び出しのところで仮想マシンの状態を同期

欠点 ホットメソッドの中のコールドコードもコンパイルされる コンパイル中にずっと大きなメモリが必要 メソッドがホットになってからコンパイルして実行される

までのディレイが大きい

Page 8: Froyo DalvikVM JIT

8

トレース単位の JIT

ホットな実行経路をさがしながらインタープリタが実行される。

コンパイルしたコードの断片はトランスレーションキャッシュの中につながれる

利点 ホットコードしかコンパイルされないのでメモリ消費が最

小限。 ホットなコードのコンパイル、実行までが素早い。

欠点 最適化の範囲が狭いので、ピーク性能が制限される。 インタープリタとの状態の同期の回数がずっと多い。 プロセスをまたがってトランスレーションキャッシュを共

有することが難しい。

Page 9: Froyo DalvikVM JIT

9

Page 10: Froyo DalvikVM JIT

10

決断:トレース JIT から始めることにした

使用メモリを最小限にすることがモバイルデバイスでは最重要。

素早く性能向上があることが重要。 JIT のために長時間かかるとその間にユーザはあきら

めてしまうかも。

メソッド単位の JIT と補完する可能性を残す 両者は共存可能。 モバイルデバイスも電源につながっている時はサーバ

のように見える。 いいとこ取り

バッテリ駆動時はトレース JIT 充電中はバックグランドでメソッド JIT

Page 11: Froyo DalvikVM JIT

11

Dalvik Trace JIT Flow

Page 12: Froyo DalvikVM JIT

12

Dalvik JIT v1.0 Overview

インタプリタとの密接な統合 JIT をインタプリタの拡張と考えると便利

インタプリタはプロファイルを行ってホットなコードをみつけたらモードを切り替える

トレース要求はインタープリット中に処理される 実際の実行中の値にアクセスできる トレースには少なくとも一回以上は実行できたところだ

けが含まれることが保証されている。 (ある種の最適化で便利)

トレース要求はコンパイラスレッドに渡され、そこでネイティブコードにコンパイルされる。

コンパイルしたコードはトランスレーションキャッシュにつながれる。

Page 13: Froyo DalvikVM JIT

13

Dalvik JIT v1.0 Features

プロセスごとのトランスレーションキャッシュ。(セキュリティサンドボックスの中でのみ共有。)

シンプルなトレース。一般的にひとつかふたつのベーシックブロックの分だけ。

Local optimizations Register promotion

Load/store elimination

Redundant null-check elimination

Heuristic scheduling

Loop optimizations Simple loop detection

Invariant code motion

Induction variable optimization

Page 14: Froyo DalvikVM JIT

14

ベンチマーク結果

Page 15: Froyo DalvikVM JIT

15

次の方向性

メソッドのインライン化 Trace extension Persistent profile information Off-line trace coalescing Off-line method translation チューニング、チューニング、もっとチューニング!

Page 16: Froyo DalvikVM JIT

16

ケーススタディ

Robo Defenceというアクション系のゲーム 75%の時間は skia描画ライブラリ DalvikVMではわずか 4% JIT で向上する部分は DalvikVMでの部分だけなので、このゲームでは JITの効果はわずか

Checkerというパズルゲーム 大半の時間を DalvikVMの実行が占める。 このケースは JITの効果が高い。 5.4倍の向上。 これに JITを適用した結果 94%の時間は JITのコードキャッシュの中。

Page 17: Froyo DalvikVM JIT

17

Code Cache の中を覗いてみると

起動から 20 分間で  9898回コンパイル 合計796264バイト (1 回あたり 80 バイト)

生成したネイティブコードサイズは元の Dexコードの約7.7倍。

コンパイルの合計時間は 6秒 (1 回の平均は0.6msec)

Page 18: Froyo DalvikVM JIT

18

まとめ

リソースを喰わない Dalvik JIT compiler 追加のメモリ要求量はわずか 100KB

バイトコード実行速度で 2~ 5倍の向上 さらなるチューニングの予定

Page 19: Froyo DalvikVM JIT

19

感想

普通の JIT の弱点 コンパイルによるもたつき、起動時間増加 メモリ消費増大 → GC頻発 → もたつき

Dalvik の JIT はこれらの弱点を上手におさえこんでいるところが素晴らしい!

ソースが公開が楽しみ 何かわかったらまたどこかで話します。

Page 20: Froyo DalvikVM JIT

20

Thank you

Thank you for listening!

Special thanks to @yoshi_rr and @kojira, who USTREAMed this session to us.