細粒度スレッド生成をサポートする Java 処理系の構想

細粒度スレッド生成を支援する
Java 処理系の構想
東京大学 大学院 理学系研究科
情報科学専攻 米澤研究室
大山 恵弘 田浦健次朗 米澤明憲
目的



低コストなスレッド生成
高いスケーラビリティ
プログラマの負担が少ない並列化
を実現する Java 処理系を作る
プログラム例
class Pfib {
public static int pfib(int n) {
if (n < 2) return 1;
同期ブロック
else {
int x, y;
sync {
fork { x = pfib(n-1); }
fork { y = pfib(n-2); }
}
return x + y;
スレッド生成
}
}
}
プロトタイプの実装

拡張可能 Java プリプロセッサEPP
(電総研の一杉による) を利用して実装




Java ソース to ソースの変換
一つの fork ⇔ 一つの Java スレッドの生成
約500行の EPP プラグインコードによる実装
性能は問題外
今後の検討事項
Q: どうやってスレッド生成のコストを下げるか?
A: Lazy Task Creation (LTC) の方法が使えそうだ
問題
従来の LTC に基づく処理系:
コンパイラ and/or ランタイムがスタックをトリッキーに管理
スタックフレーム情報を明示的にデータ構造に入れる、など
しかし...
Java ではバイトコードレベルですら
call/return/throw でしかスタックを操作できない
→ どうする? JVM の拡張は有効そうだ。 それとも...
Java ソースtoソース変換により
フレーム情報を明示的に扱う方法
JavaGo (関口’99) の場合
フレーム情報をデータ構造
int x, y = 0;
(コンテキスト)に退避
try {
x = foo(y);
} catch (NotifyMigration e) {
c = make_context(pc, x, y, ...);
append_context(c);
throw e;
}
コンテキスト
コンテキスト
コンテキスト
コンテキスト
フレーム
フレーム
フレーム
フレーム
スレッド移動時に例外を投げ
throw コンテキストデータ構造を生成
throw
throw
スレッド移動以外の実行の
オーバヘッド小さい