780 likes | 931 Views
全体ミーティング (9/12). 村田 雅之. 今日の内容. 修士論文について Deterministic Parallel Copying Garbage Collection 先日の発表と基本的には同じになります. 並列プログラムの非決定性. スレッドの実行順序により結果が非決定的に なること バグの原因になる デバッグが困難である. 非決定性の例. Thread 1. Thread2. Thread2. Thread 1. x = 3. x = 3. x=x*2;. x=x+1;. x = 4. x = 6. x=x*2;. x=x+1;.
E N D
全体ミーティング (9/12) 村田 雅之
今日の内容 • 修士論文について • Deterministic Parallel Copying Garbage Collection • 先日の発表と基本的には同じになります
並列プログラムの非決定性 • スレッドの実行順序により結果が非決定的になること • バグの原因になる • デバッグが困難である
非決定性の例 Thread 1 Thread2 Thread2 Thread 1 x = 3 x = 3 x=x*2; x=x+1; x = 4 x = 6 x=x*2; x=x+1; x = 8 x = 7
非決定性の例 Thread 1 Thread2 Thread2 Thread 1 x = 3 x = 3 x=x*2; x=x+1; x = 4 x = 6 x=x*2; x=x+1; x = 8 x = 7 非決定的
ガベージコレクション (GC) • 不要なメモリ領域を再利用するアルゴリズム • GCの実行はユーザプログラムの性能に影響を与えるので高速化したい • 並列化すれば高速化が期待できる
並列GCの難しさ • 実装が難しい • GCの正しさの検証は複雑 • 必要なデータがすべてコピーされるか、等 • 並列化すると検証はもっと難しくなる • 前述の非決定性が絡む
並列GCの難しさ • 実装が難しい • GCの正しさの検証は複雑 • 必要なデータがすべてコピーされるか、等 • 並列化すると検証はもっと難しくなる • 前述の非決定性が絡む
本研究の目標 • 並列GCの決定性を保証する • GCの実装の正しさの証明を難しくする一因となる非決定性を排除できる
本研究で提案する手法 • 並列GCのアルゴリズムを考える • 決定性を検証できる型システムを適用する
DPJ (Deterministic Parallel Java) • Type and Effect System for Deterministic Parallel Java • BocchinoJr. らが提案(2009) • 型システムを用いて静的に決定性を検証 • 実装が公開されている • http://dpj.cs.uiuc.edu/
DPJの型システムの特徴 • Region • ヒープ領域を分割する • 一つのスレッドからしかアクセスしないようにする • 配列を分割して別のregionに配置することも可能 • Effect • スレッドのregionへのアクセスを表す型情報
Region • ヒープを分割しデータを配置する • 図では変数xをregion Aに変数yをregion Bに配置 • ひとつのregionに複数のスレッドが同時にアクセスしないよう型システムで保証する • 決定性を保証できる ヒープ region A region B y x
配列の分割 • 配列を分割してそれぞれを別のregionに配置することができる region A
配列の分割 • 配列を分割してそれぞれを別のregionに配置することができる region A0 region A1
Effect • プログラム中の文のregionへのアクセスを表す型情報 • 例 Aを読む、Bに書く y = x + 1; y x region A region B
型検査による決定性の検証 • 各スレッドのeffectが異なるregionへのものになっていることを型検査で確かめる • 各スレッドが違うデータにアクセスしていれば実行順序は結果に影響しない
検証の例 • 配列に書き込みを行う • 2つの区間に分けて並列処理 • 配列はregion Aに配置されている region A 並列実行{ write(i,j); write(k,l); } 配列 二つの文を並列実行する
Regionを分割しなかったとき • ともに「Aに書く」というeffectを持つ • 同じregionに並列にアクセスする • 型検査によりエラーとなる • 決定性は保証されない region A 並列実行{ write(i,j); write(k,l); } Aに書く Aに書く
Regionを分割したとき • 並列実行されるスレッドが別のregionへのeffectを持つ • 型検査を通る • 決定性が保証される region A1 region A0 並列実行{ write(i,j); write(k,l); } A0に書く A1に書く
本研究で行ったこと • 並列コピーGCのアルゴリズムを考えた • 逐次のコピーGCのアルゴリズムを拡張する • DPJの型検査によって決定性を検証した
コピーGC • ヒープを二つにわけて埋まってきたら必要なものだけコピーすることでGCを行う • プログラムは普段は一方を使用 • 必要なもの = rootから到達可能なもの From To
コピーGC • ヒープを二つにわけて埋まってきたら必要なものだけコピーすることでGCを行う • プログラムは普段は一方を使用 • 必要なもの = rootから到達可能なもの From To
並列コピーGCのアルゴリズム copy(from,to){ if(from,toが十分短ければ){ 逐次コピーGCを行う }else{ from,toを分割 並列実行{ // 再帰呼び出し copy(fromの前半, toの前半); copy(fromの後半, toの後半); } 返ってきた結果を統合 } } 終了後にデフラグ
並列コピーGCのアルゴリズム copy(from,to){ if(from,toが十分短ければ){ 逐次コピーGCを行う }else{ from,toを分割 並列実行{ // 再帰呼び出し copy(fromの前半, toの前半); copy(fromの後半, toの後半); } 返ってきた結果を統合 } } 終了後にデフラグ STEP 1 大きなヒープの分割 2つを並列実行する
並列コピーGCのアルゴリズム copy(from,to){ if(from,toが十分短ければ){ 逐次コピーGCを行う }else{ from,toを分割 並列実行{ // 再帰呼び出し copy(fromの前半, toの前半); copy(fromの後半, toの後半); } 返ってきた結果を統合 } } 終了後にデフラグ STEP 2 各区間についてコピーGCをする
並列コピーGCのアルゴリズム copy(from,to){ if(from,toが十分短ければ){ 逐次コピーGCを行う }else{ from,toを分割 並列実行{ // 再帰呼び出し copy(fromの前半, toの前半); copy(fromの後半, toの後半); } 返ってきた結果を統合 } } 終了後にデフラグ STEP 3 分割した結果をひとつにまとめる
並列コピーGCのアルゴリズム copy(from,to){ if(from,toが十分短ければ){ 逐次コピーGCを行う }else{ from,toを分割 並列実行{ // 再帰呼び出し copy(fromの前半, toの前半); copy(fromの後半, toの後半); } 返ってきた結果を統合 } } 終了後にデフラグ STEP 4 データを移動させて隙間を減らす
4つのステップ • ヒープを分割する • 分割したヒープそれぞれで並列にコピーGC • 分割した結果をまとめる • データの移動
STEP 1: ヒープの分割 • 大きなヒープをあるサイズ以下になるまで並列かつ再帰的に分割 • 分割したヒープをそれぞれ別のregionに配置することで決定的な並列実行ができる • 十分小さくなったら逐次コピーGCを行う
STEP 2: 逐次コピーGC • 基本的には逐次アルゴリズムと同様 • ただし分割されたregionの外へのポインタは後回しにする
例: STEP 1 ヒープの分割 • ヒープを2分割するケース From To
例: STEP 1 ヒープの分割 • From, Toをそれぞれ2分割し別のregionとする From1 From0 To1 To0
例: STEP 2逐次コピーGC • 2つに分けたregionで並列にコピーGCを行う From1 From0 To1 To0
例: STEP 2逐次コピーGC • ただし、regionの外へのポインタがあればそれを記憶して後で追跡する From1 From0 To1 To0
STEP 3: 分割したregionの統合 • 後回しにしていた、regionの外へのポインタを再び追跡する
例: STEP3分割したregionの統合 • 統合前の状態 From1 From0 To1 To0
例: STEP3分割したregionの統合 • Regionが統合される From To
例: STEP3分割したregionの統合 • 後回しにしていたポインタから新たに到達可能になるデータをコピー From To
例: STEP3分割したregionの統合 • ここでは新しいデータは前から詰めていく • 空き領域をリストで管理している From To
例: STEP3分割したregionの統合 • これで必要なデータのコピーが終わる From To
まだ不満なこと • ヒープを分割するのでデータが連続して配置されない From To 隙間が空いている
STEP 4: デフラグを行う • データを移動して間を詰める • 末尾に大きく連続した空き領域ができる • 本研究では単純な方法をとる • 後ろの断片から順にできるだけ前に移動
デフラグをするメリット • 単純なメモリ管理ができる • データをうしろに配置していくだけ • 逐次のコピーGCで可能だったこと
例: STEP4デフラグ • このような状態のヒープがあるときを考える
例: STEP4デフラグ • 一番うしろから動かそうとする • 末尾の空き領域を大きくしたいので
例: STEP4デフラグ • 移動可能な空き領域を前から探していく • この場合一番最初で見つかる
例: STEP4デフラグ • 移動可能な領域を移動する • 移動を並列化することで高速化する
例: STEP4デフラグ • 以上の手続きをできるだけ繰り返す
例: STEP4デフラグ • 以上の手続きをできるだけ繰り返す