froyo dalvikvm jit

Post on 20-May-2015

5.275 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Japanese translation of Google I/O Dalvik JIT session

TRANSCRIPT

Froyo の DalvikVM の JIT

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

Tetsuyuki Kobayashi

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

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

4

Dalvik インタプリタ

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

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

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

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

5

どんな JIT?

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

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

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

6

どんな JIT?

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

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

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

ムーズな遷移

7

メソッド単位の JIT

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

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

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

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

までのディレイが大きい

8

トレース単位の JIT

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

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

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

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

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

有することが難しい。

9

10

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

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

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

めてしまうかも。

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

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

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

11

Dalvik Trace JIT Flow

12

Dalvik JIT v1.0 Overview

インタプリタとの密接な統合 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

14

ベンチマーク結果

15

次の方向性

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

16

ケーススタディ

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

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

17

Code Cache の中を覗いてみると

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

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

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

18

まとめ

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

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

19

感想

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

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

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

20

Thank you

Thank you for listening!

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

top related