SlideShare a Scribd company logo
1 of 74
Download to read offline
IBM Research, Tokyo Research Laboratory

Java Just-In-Time コンパイラ
Just In
Time...

石崎 一明 Kazuaki Ishizaki
日本アイ・ビー・エム 東京基礎研究所

PPL Summer School 2004 | 9/14/2004 |

© 2002 IBM Corporation
IBM Research, Tokyo Research Laboratory

要旨
 以下の内容について、コンパイラの初心者が理解しやす
い内容としながら、コンパイラの知識がある研究者にも
興味が持てるチュートリアルに。
– Java Just-In-Timeコンパイラの構成
– 従来から知られている最適化
– Java言語特有の最適化
– 実行時情報を利用した最適化

 最初に
– 幅広く最適化を紹介したいので、個々の最適化のアルゴリズムは省きます。
– 時間が足りなかったら or 深い理解は、後ろの文献で勉強して下さい。
2

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

目次
 Java処理系の構成
 従来から知られている最適化
 Java言語特有の最適化
 実行時情報を利用した最適化
 文献リスト
– 自習用のおまけ

3

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java処理系の構成
 Java処理系の構成
– Java仮想機械の構成
– Java Just-In-Time(JIT)コンパイラの構成

 従来から知られている最適化
 Java言語特有の最適化
 実行時情報を利用した最適化

4

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java仮想機械(Java Virtual Machine)の構成
 現在のJVMではJITコンパイラは選択的に呼び出される
Java仮想機械
Java
Program

Just-In-Time
Compiler

javac

Java
Bytecode

.classファイル
5

Memory System
(Garbage Collection)

Bytecode
Verifier

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

Native
Code

Bytecode
Interpreter
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java Just-In-Timeコンパイラの構成
 中間表現変換
 最適化
 コード生成
Java
Bytecode

中間表現

中間表現変換

中間表現

最適化

6

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

中間表現

コード生成

Native
Code

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

従来から知られている最適化
 Java処理系の構成
 従来から知られている最適化
– 最適化とは?
– 最適化の方法

 Java言語特有の最適化
 実行時情報を利用した最適化
 文献リスト

7

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

最適化(Optimization)とは?
 目的
– 実行時間を短縮する
 このチュートリアルでは実行時間の最適化について

– メモリ使用量を小さくする

 大前提
– 最適化前と最適化後のコードで、プログラムの意味を変え
ないこと
 メソッド外部から観測可能な値を変えない
rは観測可能、a・bは観測不能

 例外の発生順序を変えない
割り算も、余りも例外を発生する可能性がある

8

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

int foo(int i, int j) {
int a, b, r;
a = i / j;
b = j % i;
r = a + b;
return r;
}
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

最適化の方法
 どこを?
– 基本ブロック内
 基本ブロック(Basic Block, BB)=制御の分岐も合流もない命令列

– 基本ブロック間
 データフロー解析(Dataflow Analysis)を使う

 どうやって?
– 命令の実行回数を減らす
– 速い命令を使う

9

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

命令の実行回数を減らす (1)
 コンパイル時に前もって計算
– 定数の畳み込み
– 定数伝搬

 冗長な命令の除去
– 不要命令除去
– 複写伝搬

 計算結果の再利用
– 共通部分式の削除
– 部分冗長性の削除

10

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

命令の実行回数を減らす (2)
 メソッドの変形
– コード上昇

 プログラムの特殊化・専用化
– メソッド展開
– 末尾複製

11

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

定数の畳み込み(constant folding)
 定数計算をコンパイル時に行う。
– Javaでは浮動小数点の精度や例外条件(-32768/-1の答え
は?)に考慮することが必要
…

…

x = 2 * 3;

x = 6;

…

…

12

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

定数伝搬(constant propagation)
 定数値を、メソッド中に伝搬させる。
x = 6;

x = 6;
// この間にxの定義がない

…

y = x * 3;
BB

…
y = 18;

BB

x=6

x=6

BB

y=x*3
13

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

不要命令除去(dead code elimination)
 メソッド中で使われない値を計算する命令を削除する。
 実行されない文を削除する。
…

…

x = a + b;

// xはこの後使われない

x = a + b;

…

…

if (false) {

if (false) {

y = 1;

y = 1;

}
14

}
Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

複写伝搬(copy propagation)
 単純な代入命令を、右辺のオペランドに伝搬させる。
x = a; // xの定義はここだけ
…

// この間にaの定義がない

y = x + b;

x = a;
…
y = a + b;

BB

x=a
BB

BB

y=x+b
15

z=x+c

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

共通部分式の削除(common subexpression elimination)
 一度計算された式の値を再利用する
x = a*b;

x = a*b;
// この間にx,a,bの定義がない

…

y = a*b + c;
BB

…
y = x + c;

BB

x = a*b

x = a*b

BB

y = a*b + c
16

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

部分冗長性の削除(partial redundancy elimination)
 一度計算された式の値を再利用するために、式が存在
しなかった実行経路へ、式を実行順で前へ移動する。
– Javaでは、例外を伴う式(割り算、余り、その他)の移動に注意
BB

BB

x = a*b

BB

...

BB

x = a*b
t=x

t = a*b

BB

y = a*b

17

BB

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

y=t

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

ループ内不変値移動(loop invariant code motion)
 ループ内で定数の値をループ外へ移動する。
– Javaでは、例外を伴う式の移動に注意
BB

BB

i=0
x = a*b + i
i=i+1

x=t+i
i=i+1

i < 10

18

i=0
t = a*b

i < 10

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

コード上昇(code hoisting)
 式を実行順で前へ移動する。
– 片方の経路でしか実行されない式でも移動可能
– Javaでは、例外を伴う式の移動に注意
BB

BB

…
BB

BB

x = a*b

19

t = a*b

y = a*b

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

BB

x=t

BB

y=t

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

メソッド展開(method inlining)
 メソッド呼び出しの場所に、メソッド本体を展開する。
– 最適化の適用範囲が大きくなる。
– 引数の受け渡しや、レジスタ待避・回復処理を削除出来る。
…
x = foo(a)
…

int foo(int i) {
return i *i;
}
20

…
x = (a * a);
…

int foo(int i) {
return i *i;
}

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

末尾複製(tail duplication, splitting)
 制御の合流部分以降を複製して、専用コードを作る。
– 変数の性質が一意に決定する。

int x = …
BB

BB

BB

x=0

x = foo(x)

BB

x=0
BB

BB

if (x == 0)

21

int x = …

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

if (x == 0)

x = foo(x)
BB

if (x == 0)

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

速い命令を使う
 命令強度軽減
 スカラ置き換え
 レジスタ割付

22

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

命令強度軽減(strength reduction)
 同じ演算を、CPUが持つ速い命令で置き換える。
– 例えば、多くのCPUでは、乗算・除算よりシフト命令の方が高
速である。
…

…

x = a * 8; // 2のべき乗による乗算

x = a << 3;

…

…

23

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

スカラ置き換え(scalar replacement)
 メモリアクセス命令を、単純変数を使った命令に置き換
える。
– 後のレジスタ割付で、単純変数がレジスタに割り付けられるこ
とを期待
class A {
int f;
int g;
}

class A {
int f;
int g;
}

A a = new A();
a.f = 1;
a.f = a.f * 2;

A a = new A();
t = 1;
t = t * 2;
a.f = t;

24

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

レジスタ割付(register allocation)
 メソッド中の単純変数を、プロセッサが持つレジスタ資源
にできるだけ割り付ける。
– メソッド全体を見て Graph coloring register allocator
– メソッドの前から順に Linear scan register allocator
…

…

a = 1;

R1 = 1;

レジスタは2個

b = 2;

aとcに割り当てる

// a: R1

[mem_b] = 2; // b: mem

c = a + 3;

R2 = R1 + 3; // c: R2

a=b

R1 = [mem_b]

…

…

25

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java言語特有の最適化
 Java処理系の構成
 従来から知られている最適化
 Java言語特有の最適化
– Java言語特有の性能上の問題
– Java言語特有の最適化

 実行時情報を利用した最適化
 文献リスト

26

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java言語特有の性能上の問題
 プログラムの安全性を保証するための例外検査
 プログラムの安全性を保証するための型検査
 多様性(polymorphism)の導入による、仮想メソッド呼
び出し
 カプセル化(encapsulation)による、オブジェクト内の
フィールドへの参照
 言語が提供する同期操作

27

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java言語特有の最適化 (1)
 例外検査の削除
– 単純に冗長な例外検査削除
– 部分的に冗長な例外検査削除
– 逆最適化
– ループバージョニング

 型検査・型変換の削除
– 形解析

28

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java言語特有の最適化 (2)
 仮想メソッド(virtual method)呼び出しの高速化
– Guarded devirtualization
– Direct devirtualization

 オブジェクト参照の高速化
– 脱出解析によるスタック割付
– スカラ置き換え

 同期の高速化
– 同期操作の高速化
– 脱出解析による同期操作除去

29

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

例外検査の削除
 プログラムの安全性を保証する
– nullcheck – オブジェクトがnullでない
– bndcheck – 配列のインデックスが配列の範囲内である
– その他、0での割り算チェックなど

 例外検査に依存する後続の命令は、例外検査より前
に移動出来ない
 例外検査の削除
– 例外検査のための、比較命令、分岐命令の削除
– 命令の移動機会を増やす
30

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

単純に冗長な例外検査削除
 同じ変数に対する、同一の例外検査を削除する。
nullcheck a
x = a.f;

nullcheck a
x = a.f;

…
// この間にaの定義がない
nullcheck a
y = a.g;

…
nullcheck a
y = a.g;

BB

BB

nullcheck a nullcheck a
x = a.f
z = a.h
BB

31

nullcheck a
y = a.g

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

BB

BB

nullcheck a nullcheck a
x = a.f
z = a.h
BB

nullcheck a
y = a.g
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

部分的に冗長な例外検査削除
 部分冗長削除の応用。
– メソッド外部から観測可能な状態を変更する(副作用を持
つ)命令(例外検査命令・メソッド呼び出し命令など)越えて、
例外検査命令を移動出来ない。
– 複数回適用することで、命令移動を伴う他の最適化を適用
する機会を広げる。
BB

BB

nullcheck a
x = a.f*b
BB

32

nullcheck a
x = a.f*b

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

BB

BB

nullcheck a nullcheck a
x = a.f*b
BB

nullcheck a
x = a.f*b
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

部分的に冗長な例外検査削除+逆最適化
 例外依存関係を無視して、部分冗長削除で例外検査
命令を移動する。

BB

BB

nullcheck a
x = a.f*b
BB

33

y = b / c // c=0なら例外が発生
nullcheck a
x = a.f*b

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

BB

BB

nullcheck a nullcheck a
x = a.f*b
BB

y=b/c
nullcheck a
x = a.f*b
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

部分的に冗長な例外検査削除+逆最適化
 例外依存関係を無視して、部分冗長削除で例外検査
命令を移動する。
 移動した例外検査命令で、実際に例外を検出したとき
には、移動前の位置で例外を発生させる。
aがnullの時
BB

例外検出、しかし
ここでは例外を発
生させない
BB

nullcheck a nullcheck a
x = a.f*b
BB
命令を書き換えて
例外検査を復活し
ここで例外を発生
34

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

y=b/c
nullcheck a
x = a.f*b
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

ループバージョニング
 ループ内でアクセスされる添え字の範囲が配列の長さの
範囲内にあるか検査をループ実行直前に投機的に行い、
– 検査が成功した場合は例外検査が除去されたループを実行
– 検査が成功しない場合は例外検査があるループを実行
for (i = s; i < e; i++) {
a[i] = i; // require
nullcheck and
bndcheck
}

35

if ((a != null) && (0<= s) && (e <= a.length)) {
// optimized loop without exception checks
for (i = s; i < e; i++) {
a[i] = i;
}
} else {
// original loop with exception checks
for (i = s; i <e; i++) {
nullcheck a;
bndcheck i, a.length;
a[i] = i;
}
}

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

型検査・型変換の削除
 型解析

36

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

型解析(type analysis)
 オブジェクト参照を行うオペランドの型を計算して、肩検
査や型変換のクラスもしくはサブクラスである場合には、
型検査・型変換を削除可能。
– new, instanceof, checkcast, 引数、戻り値、等を型の種にする
if (x instanceof A) {

if (x instanceof A) {

A y = (A) x;
}

A y = (A) x;
}

上のif文内のinstanceofで、
xはAもしくはAのサブクラ
スであることが保証される。
37

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

仮想メソッド呼び出しの高速化
 Guarded devirtualization
– Class test
– Method test
– Polymorphic Inline Cache

 Direct devirtualization
– 型解析
– On stack replacement
– Code patching
– Preexistence

 インタフェースメソッド呼び出しの高速化
– Interface Method Table
38

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

仮想メソッド呼び出し
 仮想メソッド呼び出し(invokevirtual, invokeinterface)が
多用される。
– 呼び出し先が決定出来ないメソッド呼び出しによって、最適化
が妨げられる。

 カプセル化により、1つのメソッドの大きさが比較的小さ
い。
– 最適化の範囲が狭まる

メソッド呼び出し先を決定する最適化(devirtualization)
が必要。
39

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Class test and Method test
 直接メソッド呼び出しもしくはメソッド展開されている
コードを呼び出してよいか、比較を行う(guard)。
foo(A x) {
...
x.m();
}

Javaでの仮想メソッド呼び出しのコード例
r0 = <receiver object>
load r1, offset_class_in_object(r0)
load r2, offset_method_in_class(r1)
load r3, offset_code_in_method(r2)
call r3

object

class
(method table)
method

Class test
r0 = <receiver object>
load r1, offset_class_in_object(r0)
if (r1 == #address_of_paticular_class) {
call paticular_method or inlined code
} else {
load r2, offset_method_in_class(r1)
load r3, offset_code_in_method(r2)
call r3
}
40

Method test
r0 = <receiver object>
load r1, offset_class_in_object(r0)
load r2, offset_method_in_class(r1)
if (r2 == #address_of_paticular_method) {
call paticular_method or inlined code
} else {
load r3, offset_code_in_method(r2)
call r3
}

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Class test and Method test
 Method testのほうがロードが1つ多いが、精度が高い。
– 下記のような場合、xにBのインスタンスが渡されると、
 Class test(Aでguardされていると仮定)では、A != Bということで、仮
想メソッド呼び出しが実行される。
 Method testでは、&A.m() == &B.m()ということで、直接メソッド呼び出
しが実行される。

foo(A x) {
...
x.m();
}
41

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

Class A
m()

Class B

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Polymorphic Inline Cache
 複数の呼び出し先を持つcallの高速化のために、複数
のguardが存在する。
– 複数のメソッドがオーバライドしているvirtual呼び出し
– 複数のクラスがimplementしているinterface呼び出し
r0 = <receiver object>
load r1, offset_class_in_object(r0)
if (r1 == #address_of_paticular1_class) {
call paticular1_method or inlined code
} else if (r1 == #address_of_paticular2_class) {
call paticular2_method or inlined code
} else if (r1 == #address_of_paticular3_class) {
call paticular3_method or inlined code
} else {
load r2, offset_method_in_class(r1)
load r3, offset_code_in_method(r2)
call r3
}
42

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

A.m()を、複数のメソッド
がオーバライドしている例
Class A
m()

Class B
m()

Class C
m()
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Directed devirtualization
 Javaでは、guarded devirtualizationによるメソッド呼び
出しに関するコスト(guard)は、仮想メソッド呼び出しの
コストと比べて、あまり差がない。
– Guard無しのdevirtualizationによる高速化の要求

 クラス階層解析を必要としない方式
– 型解析

 クラス階層解析を必要とする方式
– Code patching
– On stack replacement
– Preexistence
43

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

型解析(type analysis)
 メソッド呼び出しのレシーバーの型を計算して、一意に決
まる場合には、仮想メソッド呼び出しを直接メソッド呼び
出しに変換、もしくはメソッド展開、が可能。
– new, instanceof, checkcast, 引数、戻り値、等を型の種にする
A x = new A();
...
x.m();

x.m()に到達する
型は、Aだけである。

r0 = <receiver object>
call A.m() // 直接メソッド呼び出し

A x;
if (…) { x = new A();}
else { x = new B();} // BはAのサブクラス。
x.m(); x.m()に到達する型はAとBで、一意に決定しないので、変換不可能。
44

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

クラス階層解析(class hierarchy analysis)
 プログラム全体のクラス階層においてどのメソッドが定義
されているかを調べる。
 Javaの場合、実行中にクラスロードが発生するので、常
にメンテナンスする必要がある。

取り得るメソッド集合
Class A
m()

取り得るメソッド集合
Class A
m()

A : {A.m()}

A : {A.m(), C.m()}
B : {A.m()}

Class B

45

B : {A.m()}

Class B

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

Class C
m()

C : {C.m()}
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Code patching
 コンパイル時に呼び出し先メソッドがオーバライドされて
いなかったら、直接メソッド呼び出しと間接メソッド呼び出
しの両方を用意し、直接メソッド呼び出しを実行する。

A x;
…
x.m(); // オーバライドされていない
…
Class A
m()

46

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

call A.m // 直接メソッド呼び出し
after_call:
…
dynamic_call
load r1, offset_class_in_object(r0)
load r2, offset_method_in_class(r1)
load r3, offset_code_in_method(r2)
call r3 // 間接メソッド呼び出し
jmp after_call
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Code patching
 動的クラスローディングによってメソッドがオーバライドさ
れた時は、コードを書き換えて間接メソッド呼び出しを実
行する。

A x;
…
x.m(); // オーバライドされた
…
Class A
m()

Class C
m()
47

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

jmp dynamic_call
after_call:
…
dynamic_call
load r1, offset_class_in_object(r0)
load r2, offset_method_in_class(r1)
load r3, offset_code_in_method(r2)
call r3 // 間接メソッド呼び出し
jmp after_call
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

On stack replacement
 メソッドオーバライドが起きたら、メソッドの実行中に、実
行中のコードを変更するともに、スタックの状態を置き換
え、変更後のコードの途中から実行を継続する。
オーバライドが起き
たら、<check point>
で実行中のコードと foo () {
直接呼び出しへfoo () {
foo () {
frameを変更し、実 A x = …;
A x =…;
A x = …; 置き換え
行を再開する。
…
…
…
<check point>
<check point>
x.m();
x.m(); // 間接呼び出し
A.m(); // 直接呼び出し
}
}
}
m() { m1(); }
m1(){ … }

48

foo()’s
stack and reg.

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

Scope descriptor (foo)

new foo()’s
stack and reg.
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

On stack replacement
 メソッド展開が適用された場合は、1つに統合されたス
タックのイメージから、インライン展開前のイメージを戻す
必要があり、実装が複雑。
foo () {
A x = …;
…
x.m();
}

m()とm1()の
呼び出しに
インライン
展開を適用

foo () {
オーバライドが起きた A x = …;
ら、<check point>で
…
実行中のコードと
x.m();
frameを変更し、実行
}
を再開する。

foo () {
A x =…;
…
<check point>
<inlined code m() and m1()>
}

m() { m1(); }

m1() { … }

m1() { … }
Scope descriptor (m1)

foo()’s
stack and reg.

Scope descriptor (m)
Scope descriptor (foo)

49

m() { m1(); }

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

new m1()’s
stack and reg.
new m()’s
stack and reg.
new foo()’s
stack and reg.
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Preexistence
 メソッド呼び出しのレシーバーが、呼び出し側のメソッドを
実行する前に決定したオブジェクトのまま変わらないこと
が保証出来れば、仮想メソッド呼び出しを直接メソッド呼
び出しに変換、もしくはメソッド展開、が可能。

foo(A x) {
...
x.m();
}

50

r0 = <receiver object>
<inlined code of A.m()>

Class A
m()

x.m()に到達するxの定
義は、(fooを実行する前
の値で変わらない)引数
だけである。
Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Preexistence
 メソッドのオーバライドが起きたときは、次回のメソッド呼
び出し時までに、変換を取り消せばよい。

foo(A x) {
...
x.m();

Class A
m()

}
Class C
m()
51

load r1, offset_class_in_object(r0)
load r2, offset_method_in_class(r1)
load r3, offset_code_in_method(r2)
次のfoo()の呼 call r3 // 間接メソッド呼び出し
び出しまでに変
換すればよい

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

インタフェースメソッド呼び出しの高速化
 呼び出し時のインタフェースを実装するクラスのサーチを、
ハッシュテーブルを引くことで置き換え、高速化する。
– クラス毎に、ハッシュテーブル(Interface Method Table)を持ち、
インタフェースクラスを実装するメソッドを登録する。
– インタフェースメソッド呼び出しの際は、IMTを引いて、呼び出
し先メソッドを決定する。
– ハッシュが衝突した場合は、stubで実行時にサーチして解決。
IMT
r0

load r1, offset_class_in_object(r0)
load r2, offset_IMT_in_class(r1)
call r2
52

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

compiled code
Stub
一つのエントリに複数のコードが
ある場合は、順次比較する
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

オブジェクト参照の高速化
 脱出解析によるスタック割付
 スカラ置き換え

53

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

脱出解析によるスタック割付
 オブジェクトの生存区間が、あるメソッドで閉じているな
らば、そのオブジェクトはヒープではなくスタックに割り
付け可能。
Class A { int f;}
static int z;
int foo() {
A x = new A();
z = x.f; // xはインスタンス・クラス変数に
代入されない
bar(x.f); // xはメソッド呼び出しの
引数でない
return z; // xはメソッドの返値でない
}
54

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

オブジェクトxは、
スタックに割り付
け可能。

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

スカラ置き換え
 オブジェクトのヘッダが使われていなければ、スタック
に割り付けられたオブジェクトは単純変数に置き換え
可能。
– オブジェクトのヘッダを使う命令 - 仮想メソッド呼び出し、
型検査、同期
Class A { int f;}
Class A { int f;} オブジェクトxは、
スタックに割り付
static int z;
static int z;
け可能。
int foo() {
int foo() {
A x = new A();
t = 0;
z = t;
z = x.f;
bar(t);
bar(x.f);
return z;
return z;
}
}
55

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

同期の高速化
 同期操作の高速化
 脱出解析による同期操作除去

56

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

同期操作の高速化
 同期がスレッド間で衝突しない場合には、OSの同期で
はなく、CPUが持つ高速な同期命令(Compare and
swap)を利用する。
OtherThreadによるLock操作
(Lockの衝突)

MyThreadによるLock操作
CompareAndSwap(Lockword, 0, MyThread)
Object
Lockword

0

0

My Thread

MyThreadによるUnlock操作
Lockword = 0;

0

Monitor ID

同期管理構造体

1

OS Lock
…

57

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

脱出解析による同期操作除去
 オブジェクトが、あるメソッドから脱出していないならば、
そのオブジェクトに関する同期操作は除去可能。
– 新しいJavaのメモリモデルに関しては、JSR 133参照
Class A { int f;}
static int z;
int foo() {
A x = new A();
synchronized (x) {
z = x.f; // xはインスタンス・クラス変数に
代入されない
}
オブジェクトxに
bar(z); // xはメソッド呼び出しの
関する同期は
引数でない
return z; // xはメソッドの返値でない 除去可能。
}
58

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

Class A { int f;}
static int z;
int foo() {
A x = new A();
synchronized (x) {
z = x.f;
}

bar(z);
return z;
}
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Java言語特有の最適化
 Java処理系の構成
 従来から知られている最適化
 Java言語特有の最適化
 実行時情報を利用した最適化
– 実行時情報を利用するためのフレームワーク
– 実行時情報の取得方法
– 利用出来る実行時情報
– 最適化の方法

 文献リスト

59

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

実行時情報を利用するためのフレームワーク
 再コンパイルできるシステムであることが前提
実行時情報

実行コード

実行時情報
取得システム

必要とされる
実行時情報
60

コンパイ
ルされた
コード
コンパイラ

制御部

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

コンパイ
ル指令
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

実行時情報の取得方法
 Sampling – 頻繁に実行されるメソッド、コードの特定
– コンパイルされたコード内の適当な地点(メソッドの入り口、
ループの先頭へのjump等)を通過したときに、ログを取る。
– OSのタイマー割り込みを使って、割り込みハンドラの中で実
行されているアドレスを取得する。

 Instrumentation – 実行中の値の特定
– コンパイルされたコード内に値を記録するコードを生成する。

 Hardware Performance Monitor Counter – キャッシュミ
ス等の特定
– CPUが提供するパフォーマンス・モニタの値(キャッシュミス
等)を読み取る。
61

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

利用出来る実行時情報
 Sampling
– 実行頻度の高いメソッド
– 実行頻度の高いメソッド内の実行経路
– 例外発生頻度の高いコールスタック

 Instrumentation
– メソッドに渡される引数
– ループの実行回数

 Hardware Performance Monitor Counter
– キャッシュミスが起きるロード命令とミスが起きるアドレス

62

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

最適化の方法
 再コンパイル
 経路の頻度情報を使う
– メソッド展開
– コードの並べ直し

 特殊化
 プリフェッチ
 オブジェクトの再配置

63

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

再コンパイル
 頻繁に実行されるメソッドは、最適化のレベルを上げて
再コンパイルする。
– 時間がかかる最適化を適用する
– 頻繁に実行されるcall pathに沿って深く、メソッド展開する
– 例外が頻繁に起こるcall pathに沿って深く、メソッド展開する
 例外処理のオーバヘッドの削減

64

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

コードの並べ直し(code reordering)
 頻繁に実行されるBBのコードを、近い位置に並べる。
– キャッシュミスを減らす
– 分岐予測ミスを減らす
A
90

10

B

C
D

15

85

E

F
G

65

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

A
B
D
F
G
C
E
© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

特殊化(specialization, customization)
 Instrumentationで得られた定数を元に、専用コードを
生成する。
– 整数・実数
 定数伝搬
 不要命令除去

– オブジェクトの型
 型検査の除去
 レシーバの型特定による、より正確なクラス階層解析

– 配列の長さ
 配列インデックスチェックの除去
 ループ単純化・ループ展開

 (遅い)汎用コードも用意しておくことが必要
66

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

プリフェッチ(prefetch)
 データキャッシュ・TLB(Translation Look-aside Buffer:
論理アドレス->物理アドレス変換で用いられるバッ
ファ)ミスが起きるロード命令の前に、あらかじめデータ
をロードする命令を実行し、ミスをなくす。
TokenLoop:
for (int i = 0; i < tv.ptr; i++) {
Token tmp = tv.v[i];
tmpNext = spec_load (&tv.v[i+1]); // 次イタレーションのtmp
prefetch (tmpNext + offset(facts)); // factsのprefetch
prefetch (tmpNext + offset(facts) + c); // facts arrayのprefetch
for (int j = 0; j < t.size; j++)
if (!t.facts[j].equals (tmp.facts[j]))
continue TokenLoop;
return tmp;
}
Slide from [Inagaki03]
67

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

オブジェクトの再配置
 関連があるオブジェクトを、GCの際に近くに並べて、
キャッシュミスを減らす。
– アクセス順序によって、最適な配置が異なる
Class A {
B y;
C z;
B
C
A
String
}
Class B {
String s;
}
Class C {
A
B
String
C
String s;
}

String

String

Memory address
68

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Our research outcome
 JIT compiler
–
–
–
–
–
–
–
–
–

Please visit

http://www.research.ibm.com
/trl/projects/jit/pub_int.htm

Method invocation optimization[OOPSLA00][JVM02]
Exception optimization[ASPLOS00][OOPSLA01][PACT02]
Profiling based optimization[JG00][PLDI03][PACT03]
Float optimization[JVM02][ICS02]
64bit architecture optimization[PLDI02]
Register allocation[PLDI02]
Data prefetch[PLDI03]
Instruction Scheduling[CGO03]
Compiler overview[JG99][IBMSJ00][OOPSLA03][IBMSJ04]

 Runtime systems
– Fast lock[OOPSLA99][OOPSLA02][ECOOP04][PACT04]
– Fast interpreter[ASPLOS02]
69

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

Special thanks to
 中谷登志男
 小松秀昭
 小野寺民也
 菅沼俊夫
 河内谷清久仁
 小笠原武史
 川人基弘
 安江俊明
 緒方一則
 古関聰
 稲垣達氏
70

Java Just-In-Time コンパイラ | PPL Summer School 2004 |







郷田修
竹内幹雄
今野和浩
田端幹男
百瀬浩之

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

ありがとうございました

PPL Summer School 2004 | 9/14/2004 |

© 2002 IBM Corporation
IBM Research, Tokyo Research Laboratory

文献リスト


Java処理系の構成
–

IBM DK

–

 Suganuma et al. Overview of the IBM Java Just-In-Time Compiler, IBM Systems Journals, 39(1), 2000.
 Ishizaki et al. Effectiveness of Cross-Platform Optimizations for a Java Just-In-Time Compiler, OOPSLA, 2003.
 Suganuma et al. Evolution of a Java just-in-time compiler for IA-32 platforms, IBM Systems Journals, 48(5), 2004.
Sun HotSpot

–

 Paleczny et al. The Java HotSpot Server Compiler, JVM, 2001.
Jikes RVM



–

Alpern et al. The Jalapeno Virtual Machine, IBM Systems Journals, 39(1), 2000.
Fink et al. The Design and Implementation of the Jikes RVM Optimizing Compiler, 2002, available at http://www124.ibm.com/developerworks/oss/jikesrvm/info/course-info.shtml.
Intel ORP






A-Tabatabai et al. Fast, Effective Code Generation in a Just-In-Time Java Compiler, PLDI, 1998.
Cierniak et al. Practicing judo: Java under dynamic optimzations, PLDI, 2000.
A-Tabatabai et al. The StarJIT Compiler: A Dynamic Compiler for Managed Runtime Environments, Intel Technology Journal, 2003. available at
http://developer.intel.com/technology/itj/2003/volume07issue01/.

従来から知られている最適化

–

 Aho et al. Compilers: Principles, Techniques, and Tools, ISBN 0201101947.
 (和訳)コンパイラI・II, ISBN4-7819-0585-4, ISBN4-7819-0586-2.
 Muchnick. Advanced compiler design and implementation, ISBN 1-55860-320-4, 1997.
 中田. コンパイラの構成と最適化, ISBN 4-254-12139-3, 1999.
部分冗長性除去

–

 J. Knoop, O. Ruthing, and B. Steffen. Optimal code motion, TOPLAS, 1995.
メソッド展開

–

 Suganuma et al. An Empirical Study of Method Inlining for a Java Just-In-Time Compiler, JVM, 2002.
レジスタ割り付け



72

Chaitin. Register allocation and spilling via graph coloring, Compiler Construction, 1982.
Poletto et al. Linear scan register allocation, TOPLAS, 1999.

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

文献リスト


Java言語特有の最適化
–

例外検査の削除

–







型解析

–

 Palsberg et al. Object-Oriented Type Inference, OOPSLA, 1991.
 Gagnon et al. Efficient Inference of Static Types for Java Bytecode, SAS, 2000.
Guarded devirtualization

–

 Calder et al. Reducing Indirect Function Call Overhead In C++ Programs, POPL, 1994.
 Detlefs et al. Inlining of virtual methods, ECOOP, 1999.
 Arnold et al. Thin Guards: A Simple and Effective Technique for Reducing the Penalty of Dynamic Class Loading, ECOOP, 2002.
型解析

–

 Chambers et al. Interactive type analysis and extended message splitting; optimizing dynamically-typed object-oriented programs, PLDI, 1990.
クラス階層解析




Kawahito et al. Effective Null Pointer Check Elimination Utilizing Hardware Trap, ASPLOS, 2000.
大平他. 例外依存関係を越える部分冗長性除去, 情報処理学会・プログラミング研究会, 2004.
Midkiff et al. Optimizing array reference checking in Java programs. IBM Systems Journal, 37(3), 1998.
Gupta et al. Optimizing array bound checks using flow analysis, LOPLAS, 1993.
Kawahito et al. Eliminating Exception Checks and Partial Redundancies for Java Just-in-Time Compilers. IBM Research Report RT0350, 2000.
Bodik et al. ABCD: Eliminating Array-Bounds Checks on Demand, PLDI, 2000.

Dean et al. Optimization of object-oriented programs using static class hierarchy, ECOOP, 1995.
Bacon et al. Fast Static Analysis of C++ Virtual Function Calls, OOPSLA, 1996.
Sundaresan et al. Practical Virtual Method Call Resolution for Java, OOSPLA, 2000.

–

Code patching

–

 Ishizaki et al. A Study of Devirtualization Techniques for a Java Just-In-Time Compiler, OOPSLA, 2000.
On stack replacement

–

 Holzle et al. Debugging Optimized Code with Dynamic Deoptimization, PLDI, 1992.
 Fink et al. Design, Implementation and Evaluation of Adaptive Recompilation with On-Stack Replacement, CGO, 2003.
インタフェースメソッド呼び出し


73

Alpern et al. Efficient Implementation of Java Interfaces: Invokeinterface Considered Harmless, OOPSLA, 2001.

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation
IBM Research, Tokyo Research Laboratory

文献リスト


Java言語特有の最適化
–

同期操作の高速化

–

 Bacon et al. Thin Locks: Featherweight Synchronization for Java, PLDI, 1998.
 Onodera et al. A Study of Locking Objects with Bimodal Fields, OOPSLA 1999.
脱出解析

–

 Choi et al. Escape Analysis for Stack Allocation and Synchronization Elimination in Java, TOPLAS, 2003.
 Whaley et al. Compositional Pointer and Escape Analysis for Java Programs, OOPSLA 1999.
 Lea. The JSR-133 Cookbook for Compiler Writers, 2004, available at http://gee.cs.oswego.edu/dl/jmm/cookbook.html.
その他の最適化





Pechtchanski et al. Dynamic Optimistic Interprocedural Analysis: A Framework and an Application, OOPSLA, 2001.
Hirzel et al. Pointer Analysis in the Presence of Dynamic Class Loading, ECOOP, 2004.

実行時情報を利用した最適化

–

 Arnold et al. Adaptive Optimization in the Jalapeno JVM, OOPSLA, 2000.
 Arnold et al. A Framework for Reducing the Cost of Instrumented Code, PLDI, 2001.
 Arnold et al. Online Feedback-Directed Optimization of Java, OOPSLA, 2002.
 Arnold et al. A Survey of Adaptive Optimization in Virtual Machines. IBM Research Report RC23143, 2003.
再コンパイル

–

 Ogasawara et al. A Study of Exception Handling and Its Dynamic Optimization in Java, OOPSLA, 2001.
コードの並べ直し

–

特殊化

–

 Chambers et al. Customization: optimizing compiler technology for SELF, a dynamically-typed object-oriented programming language, PLDI, 1989.
 Dean et al. Selective specialization for object-oriented languages, PLDI, 1995.
 Suganuma et al. A Dynamic Optimization Framework for a Java Just-In-Time Compiler, OOPSLA, 2001.
プリフェッチ

–

 Inagaki et al. Stride Prefetching by Dynamically Inspecting Objects, PLDI, 2003.
オブジェクトの再配置





74

Pettis et al. Profile-Guided Code Positioning, PLDI, 1990.

A-Tabatabai et al. Prefetch Injection Based on Hardware Monitoring and Object Metadata, PLDI, 2004.

Java Just-In-Time コンパイラ | PPL Summer School 2004 |

© 2004 IBM Corporation

More Related Content

What's hot

コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話Yuta Shimada
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2Preferred Networks
 
Graal in GraalVM - A New JIT Compiler
Graal in GraalVM - A New JIT CompilerGraal in GraalVM - A New JIT Compiler
Graal in GraalVM - A New JIT CompilerKoichi Sakata
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応marsee101
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるAtsushi KOMIYA
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdfKazuaki Ishizaki
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編Fixstars Corporation
 
SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係datastaxjp
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
jcmd をさわってみよう
jcmd をさわってみようjcmd をさわってみよう
jcmd をさわってみようTsunenaga Hanyuda
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javajava.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javaYuji Kubota
 
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
A100 GPU 搭載! P4d インスタンス使いこなしのコツA100 GPU 搭載! P4d インスタンス使いこなしのコツ
A100 GPU 搭載! P4d インスタンス 使いこなしのコツKuninobu SaSaki
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2tamtam180
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかYoshifumi Kawai
 
新標準PSRに学ぶきれいなPHP
新標準PSRに学ぶきれいなPHP新標準PSRに学ぶきれいなPHP
新標準PSRに学ぶきれいなPHPYusuke Ando
 

What's hot (20)

コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Graal in GraalVM - A New JIT Compiler
Graal in GraalVM - A New JIT CompilerGraal in GraalVM - A New JIT Compiler
Graal in GraalVM - A New JIT Compiler
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
 
SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
jcmd をさわってみよう
jcmd をさわってみようjcmd をさわってみよう
jcmd をさわってみよう
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javajava.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷java
 
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
A100 GPU 搭載! P4d インスタンス使いこなしのコツA100 GPU 搭載! P4d インスタンス使いこなしのコツ
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
新標準PSRに学ぶきれいなPHP
新標準PSRに学ぶきれいなPHP新標準PSRに学ぶきれいなPHP
新標準PSRに学ぶきれいなPHP
 

Viewers also liked

Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...
Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...
Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...Monica Beckwith
 
Transparent GPU Exploitation for Java
Transparent GPU Exploitation for JavaTransparent GPU Exploitation for Java
Transparent GPU Exploitation for JavaKazuaki Ishizaki
 
Making Hardware Accelerator Easier to Use
Making Hardware Accelerator Easier to UseMaking Hardware Accelerator Easier to Use
Making Hardware Accelerator Easier to UseKazuaki Ishizaki
 
20151112 kutech lecture_ishizaki_public
20151112 kutech lecture_ishizaki_public20151112 kutech lecture_ishizaki_public
20151112 kutech lecture_ishizaki_publicKazuaki Ishizaki
 
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccConcurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccYuji Kubota
 
PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)
PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)
PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)Etsuji Kameyama
 
デブサミ2017 Javaコミュニティ作ったら人生変わった
デブサミ2017 Javaコミュニティ作ったら人生変わったデブサミ2017 Javaコミュニティ作ったら人生変わった
デブサミ2017 Javaコミュニティ作ったら人生変わったKoichi Sakata
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 

Viewers also liked (8)

Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...
Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...
Garbage First Garbage Collector (G1 GC) - Migration to, Expectations and Adva...
 
Transparent GPU Exploitation for Java
Transparent GPU Exploitation for JavaTransparent GPU Exploitation for Java
Transparent GPU Exploitation for Java
 
Making Hardware Accelerator Easier to Use
Making Hardware Accelerator Easier to UseMaking Hardware Accelerator Easier to Use
Making Hardware Accelerator Easier to Use
 
20151112 kutech lecture_ishizaki_public
20151112 kutech lecture_ishizaki_public20151112 kutech lecture_ishizaki_public
20151112 kutech lecture_ishizaki_public
 
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccConcurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
 
PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)
PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)
PTC Vuforia を使用したAR(拡張現実) と MR(複合現実)
 
デブサミ2017 Javaコミュニティ作ったら人生変わった
デブサミ2017 Javaコミュニティ作ったら人生変わったデブサミ2017 Javaコミュニティ作ったら人生変わった
デブサミ2017 Javaコミュニティ作ったら人生変わった
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 

Similar to Java Just-In-Timeコンパイラ

これからのNashorn
これからのNashornこれからのNashorn
これからのNashornLogico
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compilernothingcosmos
 
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングOptuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングTakashi Suzuki
 
猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoderSho Tatsuno
 
20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_publicKazuaki Ishizaki
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるKoichi Sakata
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crfShuyo Nakatani
 
attention_is_all_you_need_nips17_論文紹介
attention_is_all_you_need_nips17_論文紹介attention_is_all_you_need_nips17_論文紹介
attention_is_all_you_need_nips17_論文紹介Masayoshi Kondo
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
Struggle against crossdomain data complexity in Recruit Group
Struggle against crossdomain data complexity in Recruit GroupStruggle against crossdomain data complexity in Recruit Group
Struggle against crossdomain data complexity in Recruit GroupDataWorks Summit/Hadoop Summit
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
Struggle against cross-domain data complexity in Recruit group
Struggle against cross-domain data complexity in Recruit groupStruggle against cross-domain data complexity in Recruit group
Struggle against cross-domain data complexity in Recruit groupRecruit Technologies
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編Fixstars Corporation
 

Similar to Java Just-In-Timeコンパイラ (20)

Spring3.1概要x di
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x di
 
これからのNashorn
これからのNashornこれからのNashorn
これからのNashorn
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングOptuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
 
猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder猫でも分かるVariational AutoEncoder
猫でも分かるVariational AutoEncoder
 
20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Prelude to Halide
Prelude to HalidePrelude to Halide
Prelude to Halide
 
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
 
attention_is_all_you_need_nips17_論文紹介
attention_is_all_you_need_nips17_論文紹介attention_is_all_you_need_nips17_論文紹介
attention_is_all_you_need_nips17_論文紹介
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Struggle against crossdomain data complexity in Recruit Group
Struggle against crossdomain data complexity in Recruit GroupStruggle against crossdomain data complexity in Recruit Group
Struggle against crossdomain data complexity in Recruit Group
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Struggle against cross-domain data complexity in Recruit group
Struggle against cross-domain data complexity in Recruit groupStruggle against cross-domain data complexity in Recruit group
Struggle against cross-domain data complexity in Recruit group
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 

More from Kazuaki Ishizaki

20230105_TITECH_lecture_ishizaki_public.pdf
20230105_TITECH_lecture_ishizaki_public.pdf20230105_TITECH_lecture_ishizaki_public.pdf
20230105_TITECH_lecture_ishizaki_public.pdfKazuaki Ishizaki
 
Make AI ecosystem more interoperable
Make AI ecosystem more interoperableMake AI ecosystem more interoperable
Make AI ecosystem more interoperableKazuaki Ishizaki
 
Enabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache SparkEnabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache SparkKazuaki Ishizaki
 
Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Kazuaki Ishizaki
 
SQL Performance Improvements At a Glance in Apache Spark 3.0
SQL Performance Improvements At a Glance in Apache Spark 3.0SQL Performance Improvements At a Glance in Apache Spark 3.0
SQL Performance Improvements At a Glance in Apache Spark 3.0Kazuaki Ishizaki
 
In-Memory Evolution in Apache Spark
In-Memory Evolution in Apache SparkIn-Memory Evolution in Apache Spark
In-Memory Evolution in Apache SparkKazuaki Ishizaki
 
Looking back at Spark 2.x and forward to 3.0
Looking back at Spark 2.x and forward to 3.0Looking back at Spark 2.x and forward to 3.0
Looking back at Spark 2.x and forward to 3.0Kazuaki Ishizaki
 
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_publicKazuaki Ishizaki
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_publicKazuaki Ishizaki
 
Demystifying DataFrame and Dataset
Demystifying DataFrame and DatasetDemystifying DataFrame and Dataset
Demystifying DataFrame and DatasetKazuaki Ishizaki
 
Easy and High Performance GPU Programming for Java Programmers
Easy and High Performance GPU Programming for Java ProgrammersEasy and High Performance GPU Programming for Java Programmers
Easy and High Performance GPU Programming for Java ProgrammersKazuaki Ishizaki
 
静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化
静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化
静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化Kazuaki Ishizaki
 

More from Kazuaki Ishizaki (18)

20230105_TITECH_lecture_ishizaki_public.pdf
20230105_TITECH_lecture_ishizaki_public.pdf20230105_TITECH_lecture_ishizaki_public.pdf
20230105_TITECH_lecture_ishizaki_public.pdf
 
Make AI ecosystem more interoperable
Make AI ecosystem more interoperableMake AI ecosystem more interoperable
Make AI ecosystem more interoperable
 
Enabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache SparkEnabling Vectorized Engine in Apache Spark
Enabling Vectorized Engine in Apache Spark
 
Introduction new features in Spark 3.0
Introduction new features in Spark 3.0Introduction new features in Spark 3.0
Introduction new features in Spark 3.0
 
SQL Performance Improvements At a Glance in Apache Spark 3.0
SQL Performance Improvements At a Glance in Apache Spark 3.0SQL Performance Improvements At a Glance in Apache Spark 3.0
SQL Performance Improvements At a Glance in Apache Spark 3.0
 
SparkTokyo2019NovIshizaki
SparkTokyo2019NovIshizakiSparkTokyo2019NovIshizaki
SparkTokyo2019NovIshizaki
 
SparkTokyo2019
SparkTokyo2019SparkTokyo2019
SparkTokyo2019
 
In-Memory Evolution in Apache Spark
In-Memory Evolution in Apache SparkIn-Memory Evolution in Apache Spark
In-Memory Evolution in Apache Spark
 
icpe2019_ishizaki_public
icpe2019_ishizaki_publicicpe2019_ishizaki_public
icpe2019_ishizaki_public
 
hscj2019_ishizaki_public
hscj2019_ishizaki_publichscj2019_ishizaki_public
hscj2019_ishizaki_public
 
Looking back at Spark 2.x and forward to 3.0
Looking back at Spark 2.x and forward to 3.0Looking back at Spark 2.x and forward to 3.0
Looking back at Spark 2.x and forward to 3.0
 
20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public20180109 titech lecture_ishizaki_public
20180109 titech lecture_ishizaki_public
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
 
Demystifying DataFrame and Dataset
Demystifying DataFrame and DatasetDemystifying DataFrame and Dataset
Demystifying DataFrame and Dataset
 
Exploiting GPUs in Spark
Exploiting GPUs in SparkExploiting GPUs in Spark
Exploiting GPUs in Spark
 
Easy and High Performance GPU Programming for Java Programmers
Easy and High Performance GPU Programming for Java ProgrammersEasy and High Performance GPU Programming for Java Programmers
Easy and High Performance GPU Programming for Java Programmers
 
Exploiting GPUs in Spark
Exploiting GPUs in SparkExploiting GPUs in Spark
Exploiting GPUs in Spark
 
静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化
静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化
静的型付き言語用Just-In-Timeコンパイラの再利用による、動的型付き言語用コンパイラの実装と最適化
 

Recently uploaded

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (11)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

Java Just-In-Timeコンパイラ

  • 1. IBM Research, Tokyo Research Laboratory Java Just-In-Time コンパイラ Just In Time... 石崎 一明 Kazuaki Ishizaki 日本アイ・ビー・エム 東京基礎研究所 PPL Summer School 2004 | 9/14/2004 | © 2002 IBM Corporation
  • 2. IBM Research, Tokyo Research Laboratory 要旨  以下の内容について、コンパイラの初心者が理解しやす い内容としながら、コンパイラの知識がある研究者にも 興味が持てるチュートリアルに。 – Java Just-In-Timeコンパイラの構成 – 従来から知られている最適化 – Java言語特有の最適化 – 実行時情報を利用した最適化  最初に – 幅広く最適化を紹介したいので、個々の最適化のアルゴリズムは省きます。 – 時間が足りなかったら or 深い理解は、後ろの文献で勉強して下さい。 2 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 3. IBM Research, Tokyo Research Laboratory 目次  Java処理系の構成  従来から知られている最適化  Java言語特有の最適化  実行時情報を利用した最適化  文献リスト – 自習用のおまけ 3 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 4. IBM Research, Tokyo Research Laboratory Java処理系の構成  Java処理系の構成 – Java仮想機械の構成 – Java Just-In-Time(JIT)コンパイラの構成  従来から知られている最適化  Java言語特有の最適化  実行時情報を利用した最適化 4 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 5. IBM Research, Tokyo Research Laboratory Java仮想機械(Java Virtual Machine)の構成  現在のJVMではJITコンパイラは選択的に呼び出される Java仮想機械 Java Program Just-In-Time Compiler javac Java Bytecode .classファイル 5 Memory System (Garbage Collection) Bytecode Verifier Java Just-In-Time コンパイラ | PPL Summer School 2004 | Native Code Bytecode Interpreter © 2004 IBM Corporation
  • 6. IBM Research, Tokyo Research Laboratory Java Just-In-Timeコンパイラの構成  中間表現変換  最適化  コード生成 Java Bytecode 中間表現 中間表現変換 中間表現 最適化 6 Java Just-In-Time コンパイラ | PPL Summer School 2004 | 中間表現 コード生成 Native Code © 2004 IBM Corporation
  • 7. IBM Research, Tokyo Research Laboratory 従来から知られている最適化  Java処理系の構成  従来から知られている最適化 – 最適化とは? – 最適化の方法  Java言語特有の最適化  実行時情報を利用した最適化  文献リスト 7 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 8. IBM Research, Tokyo Research Laboratory 最適化(Optimization)とは?  目的 – 実行時間を短縮する  このチュートリアルでは実行時間の最適化について – メモリ使用量を小さくする  大前提 – 最適化前と最適化後のコードで、プログラムの意味を変え ないこと  メソッド外部から観測可能な値を変えない rは観測可能、a・bは観測不能  例外の発生順序を変えない 割り算も、余りも例外を発生する可能性がある 8 Java Just-In-Time コンパイラ | PPL Summer School 2004 | int foo(int i, int j) { int a, b, r; a = i / j; b = j % i; r = a + b; return r; } © 2004 IBM Corporation
  • 9. IBM Research, Tokyo Research Laboratory 最適化の方法  どこを? – 基本ブロック内  基本ブロック(Basic Block, BB)=制御の分岐も合流もない命令列 – 基本ブロック間  データフロー解析(Dataflow Analysis)を使う  どうやって? – 命令の実行回数を減らす – 速い命令を使う 9 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 10. IBM Research, Tokyo Research Laboratory 命令の実行回数を減らす (1)  コンパイル時に前もって計算 – 定数の畳み込み – 定数伝搬  冗長な命令の除去 – 不要命令除去 – 複写伝搬  計算結果の再利用 – 共通部分式の削除 – 部分冗長性の削除 10 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 11. IBM Research, Tokyo Research Laboratory 命令の実行回数を減らす (2)  メソッドの変形 – コード上昇  プログラムの特殊化・専用化 – メソッド展開 – 末尾複製 11 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 12. IBM Research, Tokyo Research Laboratory 定数の畳み込み(constant folding)  定数計算をコンパイル時に行う。 – Javaでは浮動小数点の精度や例外条件(-32768/-1の答え は?)に考慮することが必要 … … x = 2 * 3; x = 6; … … 12 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 13. IBM Research, Tokyo Research Laboratory 定数伝搬(constant propagation)  定数値を、メソッド中に伝搬させる。 x = 6; x = 6; // この間にxの定義がない … y = x * 3; BB … y = 18; BB x=6 x=6 BB y=x*3 13 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 14. IBM Research, Tokyo Research Laboratory 不要命令除去(dead code elimination)  メソッド中で使われない値を計算する命令を削除する。  実行されない文を削除する。 … … x = a + b; // xはこの後使われない x = a + b; … … if (false) { if (false) { y = 1; y = 1; } 14 } Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 15. IBM Research, Tokyo Research Laboratory 複写伝搬(copy propagation)  単純な代入命令を、右辺のオペランドに伝搬させる。 x = a; // xの定義はここだけ … // この間にaの定義がない y = x + b; x = a; … y = a + b; BB x=a BB BB y=x+b 15 z=x+c Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 16. IBM Research, Tokyo Research Laboratory 共通部分式の削除(common subexpression elimination)  一度計算された式の値を再利用する x = a*b; x = a*b; // この間にx,a,bの定義がない … y = a*b + c; BB … y = x + c; BB x = a*b x = a*b BB y = a*b + c 16 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 17. IBM Research, Tokyo Research Laboratory 部分冗長性の削除(partial redundancy elimination)  一度計算された式の値を再利用するために、式が存在 しなかった実行経路へ、式を実行順で前へ移動する。 – Javaでは、例外を伴う式(割り算、余り、その他)の移動に注意 BB BB x = a*b BB ... BB x = a*b t=x t = a*b BB y = a*b 17 BB Java Just-In-Time コンパイラ | PPL Summer School 2004 | y=t © 2004 IBM Corporation
  • 18. IBM Research, Tokyo Research Laboratory ループ内不変値移動(loop invariant code motion)  ループ内で定数の値をループ外へ移動する。 – Javaでは、例外を伴う式の移動に注意 BB BB i=0 x = a*b + i i=i+1 x=t+i i=i+1 i < 10 18 i=0 t = a*b i < 10 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 19. IBM Research, Tokyo Research Laboratory コード上昇(code hoisting)  式を実行順で前へ移動する。 – 片方の経路でしか実行されない式でも移動可能 – Javaでは、例外を伴う式の移動に注意 BB BB … BB BB x = a*b 19 t = a*b y = a*b Java Just-In-Time コンパイラ | PPL Summer School 2004 | BB x=t BB y=t © 2004 IBM Corporation
  • 20. IBM Research, Tokyo Research Laboratory メソッド展開(method inlining)  メソッド呼び出しの場所に、メソッド本体を展開する。 – 最適化の適用範囲が大きくなる。 – 引数の受け渡しや、レジスタ待避・回復処理を削除出来る。 … x = foo(a) … int foo(int i) { return i *i; } 20 … x = (a * a); … int foo(int i) { return i *i; } Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 21. IBM Research, Tokyo Research Laboratory 末尾複製(tail duplication, splitting)  制御の合流部分以降を複製して、専用コードを作る。 – 変数の性質が一意に決定する。 int x = … BB BB BB x=0 x = foo(x) BB x=0 BB BB if (x == 0) 21 int x = … Java Just-In-Time コンパイラ | PPL Summer School 2004 | if (x == 0) x = foo(x) BB if (x == 0) © 2004 IBM Corporation
  • 22. IBM Research, Tokyo Research Laboratory 速い命令を使う  命令強度軽減  スカラ置き換え  レジスタ割付 22 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 23. IBM Research, Tokyo Research Laboratory 命令強度軽減(strength reduction)  同じ演算を、CPUが持つ速い命令で置き換える。 – 例えば、多くのCPUでは、乗算・除算よりシフト命令の方が高 速である。 … … x = a * 8; // 2のべき乗による乗算 x = a << 3; … … 23 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 24. IBM Research, Tokyo Research Laboratory スカラ置き換え(scalar replacement)  メモリアクセス命令を、単純変数を使った命令に置き換 える。 – 後のレジスタ割付で、単純変数がレジスタに割り付けられるこ とを期待 class A { int f; int g; } class A { int f; int g; } A a = new A(); a.f = 1; a.f = a.f * 2; A a = new A(); t = 1; t = t * 2; a.f = t; 24 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 25. IBM Research, Tokyo Research Laboratory レジスタ割付(register allocation)  メソッド中の単純変数を、プロセッサが持つレジスタ資源 にできるだけ割り付ける。 – メソッド全体を見て Graph coloring register allocator – メソッドの前から順に Linear scan register allocator … … a = 1; R1 = 1; レジスタは2個 b = 2; aとcに割り当てる // a: R1 [mem_b] = 2; // b: mem c = a + 3; R2 = R1 + 3; // c: R2 a=b R1 = [mem_b] … … 25 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 26. IBM Research, Tokyo Research Laboratory Java言語特有の最適化  Java処理系の構成  従来から知られている最適化  Java言語特有の最適化 – Java言語特有の性能上の問題 – Java言語特有の最適化  実行時情報を利用した最適化  文献リスト 26 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 27. IBM Research, Tokyo Research Laboratory Java言語特有の性能上の問題  プログラムの安全性を保証するための例外検査  プログラムの安全性を保証するための型検査  多様性(polymorphism)の導入による、仮想メソッド呼 び出し  カプセル化(encapsulation)による、オブジェクト内の フィールドへの参照  言語が提供する同期操作 27 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 28. IBM Research, Tokyo Research Laboratory Java言語特有の最適化 (1)  例外検査の削除 – 単純に冗長な例外検査削除 – 部分的に冗長な例外検査削除 – 逆最適化 – ループバージョニング  型検査・型変換の削除 – 形解析 28 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 29. IBM Research, Tokyo Research Laboratory Java言語特有の最適化 (2)  仮想メソッド(virtual method)呼び出しの高速化 – Guarded devirtualization – Direct devirtualization  オブジェクト参照の高速化 – 脱出解析によるスタック割付 – スカラ置き換え  同期の高速化 – 同期操作の高速化 – 脱出解析による同期操作除去 29 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 30. IBM Research, Tokyo Research Laboratory 例外検査の削除  プログラムの安全性を保証する – nullcheck – オブジェクトがnullでない – bndcheck – 配列のインデックスが配列の範囲内である – その他、0での割り算チェックなど  例外検査に依存する後続の命令は、例外検査より前 に移動出来ない  例外検査の削除 – 例外検査のための、比較命令、分岐命令の削除 – 命令の移動機会を増やす 30 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 31. IBM Research, Tokyo Research Laboratory 単純に冗長な例外検査削除  同じ変数に対する、同一の例外検査を削除する。 nullcheck a x = a.f; nullcheck a x = a.f; … // この間にaの定義がない nullcheck a y = a.g; … nullcheck a y = a.g; BB BB nullcheck a nullcheck a x = a.f z = a.h BB 31 nullcheck a y = a.g Java Just-In-Time コンパイラ | PPL Summer School 2004 | BB BB nullcheck a nullcheck a x = a.f z = a.h BB nullcheck a y = a.g © 2004 IBM Corporation
  • 32. IBM Research, Tokyo Research Laboratory 部分的に冗長な例外検査削除  部分冗長削除の応用。 – メソッド外部から観測可能な状態を変更する(副作用を持 つ)命令(例外検査命令・メソッド呼び出し命令など)越えて、 例外検査命令を移動出来ない。 – 複数回適用することで、命令移動を伴う他の最適化を適用 する機会を広げる。 BB BB nullcheck a x = a.f*b BB 32 nullcheck a x = a.f*b Java Just-In-Time コンパイラ | PPL Summer School 2004 | BB BB nullcheck a nullcheck a x = a.f*b BB nullcheck a x = a.f*b © 2004 IBM Corporation
  • 33. IBM Research, Tokyo Research Laboratory 部分的に冗長な例外検査削除+逆最適化  例外依存関係を無視して、部分冗長削除で例外検査 命令を移動する。 BB BB nullcheck a x = a.f*b BB 33 y = b / c // c=0なら例外が発生 nullcheck a x = a.f*b Java Just-In-Time コンパイラ | PPL Summer School 2004 | BB BB nullcheck a nullcheck a x = a.f*b BB y=b/c nullcheck a x = a.f*b © 2004 IBM Corporation
  • 34. IBM Research, Tokyo Research Laboratory 部分的に冗長な例外検査削除+逆最適化  例外依存関係を無視して、部分冗長削除で例外検査 命令を移動する。  移動した例外検査命令で、実際に例外を検出したとき には、移動前の位置で例外を発生させる。 aがnullの時 BB 例外検出、しかし ここでは例外を発 生させない BB nullcheck a nullcheck a x = a.f*b BB 命令を書き換えて 例外検査を復活し ここで例外を発生 34 Java Just-In-Time コンパイラ | PPL Summer School 2004 | y=b/c nullcheck a x = a.f*b © 2004 IBM Corporation
  • 35. IBM Research, Tokyo Research Laboratory ループバージョニング  ループ内でアクセスされる添え字の範囲が配列の長さの 範囲内にあるか検査をループ実行直前に投機的に行い、 – 検査が成功した場合は例外検査が除去されたループを実行 – 検査が成功しない場合は例外検査があるループを実行 for (i = s; i < e; i++) { a[i] = i; // require nullcheck and bndcheck } 35 if ((a != null) && (0<= s) && (e <= a.length)) { // optimized loop without exception checks for (i = s; i < e; i++) { a[i] = i; } } else { // original loop with exception checks for (i = s; i <e; i++) { nullcheck a; bndcheck i, a.length; a[i] = i; } } Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 36. IBM Research, Tokyo Research Laboratory 型検査・型変換の削除  型解析 36 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 37. IBM Research, Tokyo Research Laboratory 型解析(type analysis)  オブジェクト参照を行うオペランドの型を計算して、肩検 査や型変換のクラスもしくはサブクラスである場合には、 型検査・型変換を削除可能。 – new, instanceof, checkcast, 引数、戻り値、等を型の種にする if (x instanceof A) { if (x instanceof A) { A y = (A) x; } A y = (A) x; } 上のif文内のinstanceofで、 xはAもしくはAのサブクラ スであることが保証される。 37 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 38. IBM Research, Tokyo Research Laboratory 仮想メソッド呼び出しの高速化  Guarded devirtualization – Class test – Method test – Polymorphic Inline Cache  Direct devirtualization – 型解析 – On stack replacement – Code patching – Preexistence  インタフェースメソッド呼び出しの高速化 – Interface Method Table 38 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 39. IBM Research, Tokyo Research Laboratory 仮想メソッド呼び出し  仮想メソッド呼び出し(invokevirtual, invokeinterface)が 多用される。 – 呼び出し先が決定出来ないメソッド呼び出しによって、最適化 が妨げられる。  カプセル化により、1つのメソッドの大きさが比較的小さ い。 – 最適化の範囲が狭まる メソッド呼び出し先を決定する最適化(devirtualization) が必要。 39 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 40. IBM Research, Tokyo Research Laboratory Class test and Method test  直接メソッド呼び出しもしくはメソッド展開されている コードを呼び出してよいか、比較を行う(guard)。 foo(A x) { ... x.m(); } Javaでの仮想メソッド呼び出しのコード例 r0 = <receiver object> load r1, offset_class_in_object(r0) load r2, offset_method_in_class(r1) load r3, offset_code_in_method(r2) call r3 object class (method table) method Class test r0 = <receiver object> load r1, offset_class_in_object(r0) if (r1 == #address_of_paticular_class) { call paticular_method or inlined code } else { load r2, offset_method_in_class(r1) load r3, offset_code_in_method(r2) call r3 } 40 Method test r0 = <receiver object> load r1, offset_class_in_object(r0) load r2, offset_method_in_class(r1) if (r2 == #address_of_paticular_method) { call paticular_method or inlined code } else { load r3, offset_code_in_method(r2) call r3 } Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 41. IBM Research, Tokyo Research Laboratory Class test and Method test  Method testのほうがロードが1つ多いが、精度が高い。 – 下記のような場合、xにBのインスタンスが渡されると、  Class test(Aでguardされていると仮定)では、A != Bということで、仮 想メソッド呼び出しが実行される。  Method testでは、&A.m() == &B.m()ということで、直接メソッド呼び出 しが実行される。 foo(A x) { ... x.m(); } 41 Java Just-In-Time コンパイラ | PPL Summer School 2004 | Class A m() Class B © 2004 IBM Corporation
  • 42. IBM Research, Tokyo Research Laboratory Polymorphic Inline Cache  複数の呼び出し先を持つcallの高速化のために、複数 のguardが存在する。 – 複数のメソッドがオーバライドしているvirtual呼び出し – 複数のクラスがimplementしているinterface呼び出し r0 = <receiver object> load r1, offset_class_in_object(r0) if (r1 == #address_of_paticular1_class) { call paticular1_method or inlined code } else if (r1 == #address_of_paticular2_class) { call paticular2_method or inlined code } else if (r1 == #address_of_paticular3_class) { call paticular3_method or inlined code } else { load r2, offset_method_in_class(r1) load r3, offset_code_in_method(r2) call r3 } 42 Java Just-In-Time コンパイラ | PPL Summer School 2004 | A.m()を、複数のメソッド がオーバライドしている例 Class A m() Class B m() Class C m() © 2004 IBM Corporation
  • 43. IBM Research, Tokyo Research Laboratory Directed devirtualization  Javaでは、guarded devirtualizationによるメソッド呼び 出しに関するコスト(guard)は、仮想メソッド呼び出しの コストと比べて、あまり差がない。 – Guard無しのdevirtualizationによる高速化の要求  クラス階層解析を必要としない方式 – 型解析  クラス階層解析を必要とする方式 – Code patching – On stack replacement – Preexistence 43 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 44. IBM Research, Tokyo Research Laboratory 型解析(type analysis)  メソッド呼び出しのレシーバーの型を計算して、一意に決 まる場合には、仮想メソッド呼び出しを直接メソッド呼び 出しに変換、もしくはメソッド展開、が可能。 – new, instanceof, checkcast, 引数、戻り値、等を型の種にする A x = new A(); ... x.m(); x.m()に到達する 型は、Aだけである。 r0 = <receiver object> call A.m() // 直接メソッド呼び出し A x; if (…) { x = new A();} else { x = new B();} // BはAのサブクラス。 x.m(); x.m()に到達する型はAとBで、一意に決定しないので、変換不可能。 44 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 45. IBM Research, Tokyo Research Laboratory クラス階層解析(class hierarchy analysis)  プログラム全体のクラス階層においてどのメソッドが定義 されているかを調べる。  Javaの場合、実行中にクラスロードが発生するので、常 にメンテナンスする必要がある。 取り得るメソッド集合 Class A m() 取り得るメソッド集合 Class A m() A : {A.m()} A : {A.m(), C.m()} B : {A.m()} Class B 45 B : {A.m()} Class B Java Just-In-Time コンパイラ | PPL Summer School 2004 | Class C m() C : {C.m()} © 2004 IBM Corporation
  • 46. IBM Research, Tokyo Research Laboratory Code patching  コンパイル時に呼び出し先メソッドがオーバライドされて いなかったら、直接メソッド呼び出しと間接メソッド呼び出 しの両方を用意し、直接メソッド呼び出しを実行する。 A x; … x.m(); // オーバライドされていない … Class A m() 46 Java Just-In-Time コンパイラ | PPL Summer School 2004 | call A.m // 直接メソッド呼び出し after_call: … dynamic_call load r1, offset_class_in_object(r0) load r2, offset_method_in_class(r1) load r3, offset_code_in_method(r2) call r3 // 間接メソッド呼び出し jmp after_call © 2004 IBM Corporation
  • 47. IBM Research, Tokyo Research Laboratory Code patching  動的クラスローディングによってメソッドがオーバライドさ れた時は、コードを書き換えて間接メソッド呼び出しを実 行する。 A x; … x.m(); // オーバライドされた … Class A m() Class C m() 47 Java Just-In-Time コンパイラ | PPL Summer School 2004 | jmp dynamic_call after_call: … dynamic_call load r1, offset_class_in_object(r0) load r2, offset_method_in_class(r1) load r3, offset_code_in_method(r2) call r3 // 間接メソッド呼び出し jmp after_call © 2004 IBM Corporation
  • 48. IBM Research, Tokyo Research Laboratory On stack replacement  メソッドオーバライドが起きたら、メソッドの実行中に、実 行中のコードを変更するともに、スタックの状態を置き換 え、変更後のコードの途中から実行を継続する。 オーバライドが起き たら、<check point> で実行中のコードと foo () { 直接呼び出しへfoo () { foo () { frameを変更し、実 A x = …; A x =…; A x = …; 置き換え 行を再開する。 … … … <check point> <check point> x.m(); x.m(); // 間接呼び出し A.m(); // 直接呼び出し } } } m() { m1(); } m1(){ … } 48 foo()’s stack and reg. Java Just-In-Time コンパイラ | PPL Summer School 2004 | Scope descriptor (foo) new foo()’s stack and reg. © 2004 IBM Corporation
  • 49. IBM Research, Tokyo Research Laboratory On stack replacement  メソッド展開が適用された場合は、1つに統合されたス タックのイメージから、インライン展開前のイメージを戻す 必要があり、実装が複雑。 foo () { A x = …; … x.m(); } m()とm1()の 呼び出しに インライン 展開を適用 foo () { オーバライドが起きた A x = …; ら、<check point>で … 実行中のコードと x.m(); frameを変更し、実行 } を再開する。 foo () { A x =…; … <check point> <inlined code m() and m1()> } m() { m1(); } m1() { … } m1() { … } Scope descriptor (m1) foo()’s stack and reg. Scope descriptor (m) Scope descriptor (foo) 49 m() { m1(); } Java Just-In-Time コンパイラ | PPL Summer School 2004 | new m1()’s stack and reg. new m()’s stack and reg. new foo()’s stack and reg. © 2004 IBM Corporation
  • 50. IBM Research, Tokyo Research Laboratory Preexistence  メソッド呼び出しのレシーバーが、呼び出し側のメソッドを 実行する前に決定したオブジェクトのまま変わらないこと が保証出来れば、仮想メソッド呼び出しを直接メソッド呼 び出しに変換、もしくはメソッド展開、が可能。 foo(A x) { ... x.m(); } 50 r0 = <receiver object> <inlined code of A.m()> Class A m() x.m()に到達するxの定 義は、(fooを実行する前 の値で変わらない)引数 だけである。 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 51. IBM Research, Tokyo Research Laboratory Preexistence  メソッドのオーバライドが起きたときは、次回のメソッド呼 び出し時までに、変換を取り消せばよい。 foo(A x) { ... x.m(); Class A m() } Class C m() 51 load r1, offset_class_in_object(r0) load r2, offset_method_in_class(r1) load r3, offset_code_in_method(r2) 次のfoo()の呼 call r3 // 間接メソッド呼び出し び出しまでに変 換すればよい Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 52. IBM Research, Tokyo Research Laboratory インタフェースメソッド呼び出しの高速化  呼び出し時のインタフェースを実装するクラスのサーチを、 ハッシュテーブルを引くことで置き換え、高速化する。 – クラス毎に、ハッシュテーブル(Interface Method Table)を持ち、 インタフェースクラスを実装するメソッドを登録する。 – インタフェースメソッド呼び出しの際は、IMTを引いて、呼び出 し先メソッドを決定する。 – ハッシュが衝突した場合は、stubで実行時にサーチして解決。 IMT r0 load r1, offset_class_in_object(r0) load r2, offset_IMT_in_class(r1) call r2 52 Java Just-In-Time コンパイラ | PPL Summer School 2004 | compiled code Stub 一つのエントリに複数のコードが ある場合は、順次比較する © 2004 IBM Corporation
  • 53. IBM Research, Tokyo Research Laboratory オブジェクト参照の高速化  脱出解析によるスタック割付  スカラ置き換え 53 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 54. IBM Research, Tokyo Research Laboratory 脱出解析によるスタック割付  オブジェクトの生存区間が、あるメソッドで閉じているな らば、そのオブジェクトはヒープではなくスタックに割り 付け可能。 Class A { int f;} static int z; int foo() { A x = new A(); z = x.f; // xはインスタンス・クラス変数に 代入されない bar(x.f); // xはメソッド呼び出しの 引数でない return z; // xはメソッドの返値でない } 54 Java Just-In-Time コンパイラ | PPL Summer School 2004 | オブジェクトxは、 スタックに割り付 け可能。 © 2004 IBM Corporation
  • 55. IBM Research, Tokyo Research Laboratory スカラ置き換え  オブジェクトのヘッダが使われていなければ、スタック に割り付けられたオブジェクトは単純変数に置き換え 可能。 – オブジェクトのヘッダを使う命令 - 仮想メソッド呼び出し、 型検査、同期 Class A { int f;} Class A { int f;} オブジェクトxは、 スタックに割り付 static int z; static int z; け可能。 int foo() { int foo() { A x = new A(); t = 0; z = t; z = x.f; bar(t); bar(x.f); return z; return z; } } 55 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 56. IBM Research, Tokyo Research Laboratory 同期の高速化  同期操作の高速化  脱出解析による同期操作除去 56 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 57. IBM Research, Tokyo Research Laboratory 同期操作の高速化  同期がスレッド間で衝突しない場合には、OSの同期で はなく、CPUが持つ高速な同期命令(Compare and swap)を利用する。 OtherThreadによるLock操作 (Lockの衝突) MyThreadによるLock操作 CompareAndSwap(Lockword, 0, MyThread) Object Lockword 0 0 My Thread MyThreadによるUnlock操作 Lockword = 0; 0 Monitor ID 同期管理構造体 1 OS Lock … 57 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 58. IBM Research, Tokyo Research Laboratory 脱出解析による同期操作除去  オブジェクトが、あるメソッドから脱出していないならば、 そのオブジェクトに関する同期操作は除去可能。 – 新しいJavaのメモリモデルに関しては、JSR 133参照 Class A { int f;} static int z; int foo() { A x = new A(); synchronized (x) { z = x.f; // xはインスタンス・クラス変数に 代入されない } オブジェクトxに bar(z); // xはメソッド呼び出しの 関する同期は 引数でない return z; // xはメソッドの返値でない 除去可能。 } 58 Java Just-In-Time コンパイラ | PPL Summer School 2004 | Class A { int f;} static int z; int foo() { A x = new A(); synchronized (x) { z = x.f; } bar(z); return z; } © 2004 IBM Corporation
  • 59. IBM Research, Tokyo Research Laboratory Java言語特有の最適化  Java処理系の構成  従来から知られている最適化  Java言語特有の最適化  実行時情報を利用した最適化 – 実行時情報を利用するためのフレームワーク – 実行時情報の取得方法 – 利用出来る実行時情報 – 最適化の方法  文献リスト 59 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 60. IBM Research, Tokyo Research Laboratory 実行時情報を利用するためのフレームワーク  再コンパイルできるシステムであることが前提 実行時情報 実行コード 実行時情報 取得システム 必要とされる 実行時情報 60 コンパイ ルされた コード コンパイラ 制御部 Java Just-In-Time コンパイラ | PPL Summer School 2004 | コンパイ ル指令 © 2004 IBM Corporation
  • 61. IBM Research, Tokyo Research Laboratory 実行時情報の取得方法  Sampling – 頻繁に実行されるメソッド、コードの特定 – コンパイルされたコード内の適当な地点(メソッドの入り口、 ループの先頭へのjump等)を通過したときに、ログを取る。 – OSのタイマー割り込みを使って、割り込みハンドラの中で実 行されているアドレスを取得する。  Instrumentation – 実行中の値の特定 – コンパイルされたコード内に値を記録するコードを生成する。  Hardware Performance Monitor Counter – キャッシュミ ス等の特定 – CPUが提供するパフォーマンス・モニタの値(キャッシュミス 等)を読み取る。 61 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 62. IBM Research, Tokyo Research Laboratory 利用出来る実行時情報  Sampling – 実行頻度の高いメソッド – 実行頻度の高いメソッド内の実行経路 – 例外発生頻度の高いコールスタック  Instrumentation – メソッドに渡される引数 – ループの実行回数  Hardware Performance Monitor Counter – キャッシュミスが起きるロード命令とミスが起きるアドレス 62 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 63. IBM Research, Tokyo Research Laboratory 最適化の方法  再コンパイル  経路の頻度情報を使う – メソッド展開 – コードの並べ直し  特殊化  プリフェッチ  オブジェクトの再配置 63 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 64. IBM Research, Tokyo Research Laboratory 再コンパイル  頻繁に実行されるメソッドは、最適化のレベルを上げて 再コンパイルする。 – 時間がかかる最適化を適用する – 頻繁に実行されるcall pathに沿って深く、メソッド展開する – 例外が頻繁に起こるcall pathに沿って深く、メソッド展開する  例外処理のオーバヘッドの削減 64 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 65. IBM Research, Tokyo Research Laboratory コードの並べ直し(code reordering)  頻繁に実行されるBBのコードを、近い位置に並べる。 – キャッシュミスを減らす – 分岐予測ミスを減らす A 90 10 B C D 15 85 E F G 65 Java Just-In-Time コンパイラ | PPL Summer School 2004 | A B D F G C E © 2004 IBM Corporation
  • 66. IBM Research, Tokyo Research Laboratory 特殊化(specialization, customization)  Instrumentationで得られた定数を元に、専用コードを 生成する。 – 整数・実数  定数伝搬  不要命令除去 – オブジェクトの型  型検査の除去  レシーバの型特定による、より正確なクラス階層解析 – 配列の長さ  配列インデックスチェックの除去  ループ単純化・ループ展開  (遅い)汎用コードも用意しておくことが必要 66 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 67. IBM Research, Tokyo Research Laboratory プリフェッチ(prefetch)  データキャッシュ・TLB(Translation Look-aside Buffer: 論理アドレス->物理アドレス変換で用いられるバッ ファ)ミスが起きるロード命令の前に、あらかじめデータ をロードする命令を実行し、ミスをなくす。 TokenLoop: for (int i = 0; i < tv.ptr; i++) { Token tmp = tv.v[i]; tmpNext = spec_load (&tv.v[i+1]); // 次イタレーションのtmp prefetch (tmpNext + offset(facts)); // factsのprefetch prefetch (tmpNext + offset(facts) + c); // facts arrayのprefetch for (int j = 0; j < t.size; j++) if (!t.facts[j].equals (tmp.facts[j])) continue TokenLoop; return tmp; } Slide from [Inagaki03] 67 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 68. IBM Research, Tokyo Research Laboratory オブジェクトの再配置  関連があるオブジェクトを、GCの際に近くに並べて、 キャッシュミスを減らす。 – アクセス順序によって、最適な配置が異なる Class A { B y; C z; B C A String } Class B { String s; } Class C { A B String C String s; } String String Memory address 68 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 69. IBM Research, Tokyo Research Laboratory Our research outcome  JIT compiler – – – – – – – – – Please visit http://www.research.ibm.com /trl/projects/jit/pub_int.htm Method invocation optimization[OOPSLA00][JVM02] Exception optimization[ASPLOS00][OOPSLA01][PACT02] Profiling based optimization[JG00][PLDI03][PACT03] Float optimization[JVM02][ICS02] 64bit architecture optimization[PLDI02] Register allocation[PLDI02] Data prefetch[PLDI03] Instruction Scheduling[CGO03] Compiler overview[JG99][IBMSJ00][OOPSLA03][IBMSJ04]  Runtime systems – Fast lock[OOPSLA99][OOPSLA02][ECOOP04][PACT04] – Fast interpreter[ASPLOS02] 69 Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 70. IBM Research, Tokyo Research Laboratory Special thanks to  中谷登志男  小松秀昭  小野寺民也  菅沼俊夫  河内谷清久仁  小笠原武史  川人基弘  安江俊明  緒方一則  古関聰  稲垣達氏 70 Java Just-In-Time コンパイラ | PPL Summer School 2004 |      郷田修 竹内幹雄 今野和浩 田端幹男 百瀬浩之 © 2004 IBM Corporation
  • 71. IBM Research, Tokyo Research Laboratory ありがとうございました PPL Summer School 2004 | 9/14/2004 | © 2002 IBM Corporation
  • 72. IBM Research, Tokyo Research Laboratory 文献リスト  Java処理系の構成 – IBM DK –  Suganuma et al. Overview of the IBM Java Just-In-Time Compiler, IBM Systems Journals, 39(1), 2000.  Ishizaki et al. Effectiveness of Cross-Platform Optimizations for a Java Just-In-Time Compiler, OOPSLA, 2003.  Suganuma et al. Evolution of a Java just-in-time compiler for IA-32 platforms, IBM Systems Journals, 48(5), 2004. Sun HotSpot –  Paleczny et al. The Java HotSpot Server Compiler, JVM, 2001. Jikes RVM   – Alpern et al. The Jalapeno Virtual Machine, IBM Systems Journals, 39(1), 2000. Fink et al. The Design and Implementation of the Jikes RVM Optimizing Compiler, 2002, available at http://www124.ibm.com/developerworks/oss/jikesrvm/info/course-info.shtml. Intel ORP     A-Tabatabai et al. Fast, Effective Code Generation in a Just-In-Time Java Compiler, PLDI, 1998. Cierniak et al. Practicing judo: Java under dynamic optimzations, PLDI, 2000. A-Tabatabai et al. The StarJIT Compiler: A Dynamic Compiler for Managed Runtime Environments, Intel Technology Journal, 2003. available at http://developer.intel.com/technology/itj/2003/volume07issue01/. 従来から知られている最適化 –  Aho et al. Compilers: Principles, Techniques, and Tools, ISBN 0201101947.  (和訳)コンパイラI・II, ISBN4-7819-0585-4, ISBN4-7819-0586-2.  Muchnick. Advanced compiler design and implementation, ISBN 1-55860-320-4, 1997.  中田. コンパイラの構成と最適化, ISBN 4-254-12139-3, 1999. 部分冗長性除去 –  J. Knoop, O. Ruthing, and B. Steffen. Optimal code motion, TOPLAS, 1995. メソッド展開 –  Suganuma et al. An Empirical Study of Method Inlining for a Java Just-In-Time Compiler, JVM, 2002. レジスタ割り付け   72 Chaitin. Register allocation and spilling via graph coloring, Compiler Construction, 1982. Poletto et al. Linear scan register allocation, TOPLAS, 1999. Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 73. IBM Research, Tokyo Research Laboratory 文献リスト  Java言語特有の最適化 – 例外検査の削除 –       型解析 –  Palsberg et al. Object-Oriented Type Inference, OOPSLA, 1991.  Gagnon et al. Efficient Inference of Static Types for Java Bytecode, SAS, 2000. Guarded devirtualization –  Calder et al. Reducing Indirect Function Call Overhead In C++ Programs, POPL, 1994.  Detlefs et al. Inlining of virtual methods, ECOOP, 1999.  Arnold et al. Thin Guards: A Simple and Effective Technique for Reducing the Penalty of Dynamic Class Loading, ECOOP, 2002. 型解析 –  Chambers et al. Interactive type analysis and extended message splitting; optimizing dynamically-typed object-oriented programs, PLDI, 1990. クラス階層解析    Kawahito et al. Effective Null Pointer Check Elimination Utilizing Hardware Trap, ASPLOS, 2000. 大平他. 例外依存関係を越える部分冗長性除去, 情報処理学会・プログラミング研究会, 2004. Midkiff et al. Optimizing array reference checking in Java programs. IBM Systems Journal, 37(3), 1998. Gupta et al. Optimizing array bound checks using flow analysis, LOPLAS, 1993. Kawahito et al. Eliminating Exception Checks and Partial Redundancies for Java Just-in-Time Compilers. IBM Research Report RT0350, 2000. Bodik et al. ABCD: Eliminating Array-Bounds Checks on Demand, PLDI, 2000. Dean et al. Optimization of object-oriented programs using static class hierarchy, ECOOP, 1995. Bacon et al. Fast Static Analysis of C++ Virtual Function Calls, OOPSLA, 1996. Sundaresan et al. Practical Virtual Method Call Resolution for Java, OOSPLA, 2000. – Code patching –  Ishizaki et al. A Study of Devirtualization Techniques for a Java Just-In-Time Compiler, OOPSLA, 2000. On stack replacement –  Holzle et al. Debugging Optimized Code with Dynamic Deoptimization, PLDI, 1992.  Fink et al. Design, Implementation and Evaluation of Adaptive Recompilation with On-Stack Replacement, CGO, 2003. インタフェースメソッド呼び出し  73 Alpern et al. Efficient Implementation of Java Interfaces: Invokeinterface Considered Harmless, OOPSLA, 2001. Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation
  • 74. IBM Research, Tokyo Research Laboratory 文献リスト  Java言語特有の最適化 – 同期操作の高速化 –  Bacon et al. Thin Locks: Featherweight Synchronization for Java, PLDI, 1998.  Onodera et al. A Study of Locking Objects with Bimodal Fields, OOPSLA 1999. 脱出解析 –  Choi et al. Escape Analysis for Stack Allocation and Synchronization Elimination in Java, TOPLAS, 2003.  Whaley et al. Compositional Pointer and Escape Analysis for Java Programs, OOPSLA 1999.  Lea. The JSR-133 Cookbook for Compiler Writers, 2004, available at http://gee.cs.oswego.edu/dl/jmm/cookbook.html. その他の最適化    Pechtchanski et al. Dynamic Optimistic Interprocedural Analysis: A Framework and an Application, OOPSLA, 2001. Hirzel et al. Pointer Analysis in the Presence of Dynamic Class Loading, ECOOP, 2004. 実行時情報を利用した最適化 –  Arnold et al. Adaptive Optimization in the Jalapeno JVM, OOPSLA, 2000.  Arnold et al. A Framework for Reducing the Cost of Instrumented Code, PLDI, 2001.  Arnold et al. Online Feedback-Directed Optimization of Java, OOPSLA, 2002.  Arnold et al. A Survey of Adaptive Optimization in Virtual Machines. IBM Research Report RC23143, 2003. 再コンパイル –  Ogasawara et al. A Study of Exception Handling and Its Dynamic Optimization in Java, OOPSLA, 2001. コードの並べ直し – 特殊化 –  Chambers et al. Customization: optimizing compiler technology for SELF, a dynamically-typed object-oriented programming language, PLDI, 1989.  Dean et al. Selective specialization for object-oriented languages, PLDI, 1995.  Suganuma et al. A Dynamic Optimization Framework for a Java Just-In-Time Compiler, OOPSLA, 2001. プリフェッチ –  Inagaki et al. Stride Prefetching by Dynamically Inspecting Objects, PLDI, 2003. オブジェクトの再配置   74 Pettis et al. Profile-Guided Code Positioning, PLDI, 1990. A-Tabatabai et al. Prefetch Injection Based on Hardware Monitoring and Object Metadata, PLDI, 2004. Java Just-In-Time コンパイラ | PPL Summer School 2004 | © 2004 IBM Corporation