60 likes | 180 Views
細粒度スレッド生成を支援する Java 処理系の構想. 東京大学 大学院 理学系研究科 情報科学専攻 米澤研究室 大山 恵弘 田浦健次朗 米澤明憲. 目的. 低コストなスレッド生成 高いスケーラビリティ プログラマの負担が少ない並列化 を実現する Java 処理系を作る. プログラム例. class Pfib { public static int pfib(int n) { if (n < 2) return 1; else { int x, y; sync {
E N D
細粒度スレッド生成を支援する 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 スレッド移動以外の実行の オーバヘッド小さい フレーム コンテキスト