細粒度スレッド生成をサポートする Java 処理系の構想
Download
Report
Transcript 細粒度スレッド生成をサポートする 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
スレッド移動以外の実行の
オーバヘッド小さい