マイグレーションを支援する分散集合オブジェクト マイグレーションを支援する分散集合オブジェクト グリッドプログラミングにおける要請 ▌動的なプロセッサ数の変化に対応させたい ►使用可能なプロセッサが動的に変化 ►利用可能な資源を最大限活用 ▌記述を簡単にしたい ►オブジェクト指向 ▌無駄な通信が発生しない メソッド呼び出しの記述 ▌ インデックスで要素を識別できる集合 ►配列・ハッシュ表… ▌ 分散環境では断片に分割して保持 ►プロセッサ数が固定 →要素の位置を簡単に計算できる ►プロセッサ数が動的に変化 →どの要素がどのプロセッサにあるか不明 →要素とプロセッサの対応表が必要 0 1 2 Proc. 1 3 4 5 6 7 8 9 10 4,5,6 -> proc.1 断片の定義 ►断片の定義で、split()・merge()を記述 ►分割・併合に必要な処理を記述 計算に参加 / 脱退 ►プログラマは外部からjoin() / leave()を呼び出し class DistributedArray{ split(void){ (データとインデックス集合を分割) return (分割したデータ);} merge(データ){(データを併合)} }; int main(){ join(object_id); Proc. 0 class DistributedArray { increment(IndexSet *is){ foreach (index <- is){ data[index]++; } } }; int main(){ WholeArray->increment ([2-8]); 0 1 … 2 Proc. 1 3 4 3 4 Proc. 0 0 1 5 6 7 Proc. 1 2 5 Proc. 0 0 1 2 Proc. 2 9 8 4 5 6 7 ►左の断片は、■色のインデックス範囲に、 ■色の部分のデータを送信 ►断片の分割時は、端のデータに重なりを持 たせて分割する (下図) ►proc2がjoin()を呼び出し Proc. 2 ►proc2から要求メッセージ ►proc1でsplit()が呼ばれる ►proc2にmerge()される 9 Proc. 1 3 基本的なアルゴリズム ►隣接する境界のデータを交換 ►データを更新 ►残差を一カ所に集計 分散集合オブジェクトを用いた記述 ►各断片がメソッドを呼び合う形で処理が進行 ►境界データの交換 ◘ 端のデータを引数に、隣のインデックスに対しRMI ◘ データを必要とする要素のインデックスに向けて送信 ◘ 断片が移動しても、正しい断片にメッセージが届く ►右のコードにおいて、アルゴリズムの正しさを証明した join() [7-9]を譲渡 + 実行結果 ►プロセッサ81台の環境で正しく動作 ►64台で連続joinに成功 ▌Mflops値 ►一回のループ時間から計算 ►一辺10000, 20000, 30000で実行 ▌台数増加により頭打ち ►現状の実装では処理系のオーバーヘッドが 大きいためと推定 30 25 8 9 Proc. 0 7,8,9,10-> proc.2 increment([2-3]) 8 データ要求 6 7 0,1.2.3 -> proc.0 Proc. 2 マイグレーションの記述 断片の定義 ►集合全体の一部を持つものとして定義 ►インデックス集合とデータを保持 ►メソッドは引数に「インデックス集合」を取る メソッド呼び出し(RMI) ►インデックス集合とメソッドを指定 ►各断片が持つインデックス集合と重なりを取って、メ ソッドが呼び出される 例:分散配列の要素をインクリメント ►配分によらず要素[2-8)をインクリメント 対象とする集合 Proc. 0 マイグレーション対応SOR 高橋 高橋 慧 田浦健次朗 近山 慧 田浦健次朗 近山 隆 (東京大学) 隆 (東京大学) increment([4-8]) 0 1 2 … 3 Proc. 1 4 5 6 Proc. 2 7 8 20 ►proc2の参加が完了 9 speedup 背景・目的 15 10 l=10000 l=20000 l=30000 5 既存モデルでの問題点 ▌メッセージパッシング ►送信先の指定にプロセッサ番号を用いるため、プロ セッサ増減に対応が難しい ►対応表を一から実装する必要がある ►手続き的で記述が難しい ▌分散共有メモリ ►プロセッサ増減自体には容易に対応 ►データと仕事の対応を意識しないと、不必要な リモートメモリアクセスが多発し、低速 ▌分散オブジェクト ►オブジェクト単位ではマイグレーション可能 ►プロセッサ間にまたがるデータは簡単には扱えない 提案 「分散集合オブジェクトモデル」 ▌プロセッサ間にまたがる集合を一オブジェクトに ►プログラマは断片オブジェクトを定義 ►メソッドは引数にインデックスの範囲を取る ►オブジェクトの外側からは、集合全体に対し メソッドを呼び出す ►断片は分割・併合・マイグレートできる powered by Phoenix Library Array->increment([2-8]) ►データアクセスにプロセッサ番号を用いないため、 プログラマは配分を意識せず記述できる ►メソッドはデータのあるプロセッサで実行されるため、 データに応じてタスクも自動的に配分される 処理系の実装 ►要素とプロセッサの対応を集中管理すると… ◘ 実装は楽 ◘ 対応表を持つプロセッサにメッセージが集中 ►Phoenixライブラリを利用 (http://www.logos.ic.i.u-tokyo.ac.jp/phoenix/) メッセージパッシングライブラリの一種。各プロセッサは番号の集合([0-100)など)を持ち、メッ セージは一つの番号に向けて送信される。番号とプロセッサの対応はプログラマが自由に変更で き、この対応は各プロセッサが分散保持している。 ◘ インデックス一つをPhoenixの番号一つに対応付け ◘ 要素とプロセッサの対応が分散保持される ◘ メッセージが対応表を持つプロセッサに集中しない ►メソッド呼び出しメッセージの中継方法 ◘ 呼出先の先頭のインデックスにメッセージを送信 ◘ その断片のインデックス集合と重なりを取って、残りを次の先 頭インデックスに送信 Proc. 0 Proc. 1 Proc. 2 … ◘ ツリー状の中継も実装 0 1 2 3 4 5 6 7 8 9 increment([2-3]) increment([4-6]) increment([4-8]) increment([2-8]) increment([4-8]) ►プログラマはクラス定義でsplit(), merge() を記述 すれば、関数1つでマイグレーションが実現される マイグレーションとスレッド RMI 断片B (m0b) (m0a) 10 RMI 断片B RMI 返り値を引数として渡す (m1) m0a(){ ... RMI::m1(arg); } m0(){ ... hoge = RMI::m1(arg); ... } m1の呼び出し部分で m0をm0aとm0bに分割 20 30 40 50 60 70 # of processors ▌分散集合オブジェクトモデルを提案・実装した ►インデックス集合を指定したRMIにより、 プロセッサ数増減に対応 ►オブジェクト指向による記述 ►対応表を分散保持しメッセージが集中しない ▌これを用いてSOR法のプログラムを記述した ►正しく動作することを確認した ►アルゴリズムの正しさを示した 断片A 返り値 (メソッドm1) m1(){ return fuga; } 0 まとめ ►通常の処理系では、実行中のスレッドは移送できない ►本モデルではメソッド実行中の停止を禁止することで、 任意のメソッド実行の間でマイグレーションを可能にする ►あるメソッドの返り値を必要とする処理は、そのメソッド の呼び出し前と呼出し後に分割して記述する ►一断片内での実行スレッドは一つに制限でき、このスレッ ドが待機状態であればマイグレーションが可能である ►将来的には、プリプロセッサにより、擬似的に返り値を取 れるような処理系を構築したい (スタックの情報はRMIの引数の形で授受する) (メソッドm0) 断片A (停止中) 0 m0b(hoge){ ... } m1(){ RMI::mob(fuga); } この間に断片Aは マイグレート可能 今後の課題 ▌実装の改良による処理系の高速化 ▌他のアプリケーションの記述 ▌記述性の改善 ►返り値についての検討 80 90
© Copyright 2024 Paperzz