Distributed Aggregate with Migration マイグレーションを支援する 分散集合オブジェクト 30388 高橋 慧 近山・田浦研究室 powered by Phoenix Library グリッド環境での計算 ▌ 特徴 ►インターネット上の計算機で並列処理 ►安価に巨大な計算資源を得られる ▌ プロセッサ数を増減させたい ►少しの時間でも使える資源を総動員したい ►故障への対応・所有者の要請 ▌ 記述を楽にしたい ►通信を明示的に書きたくない ►データと仕事の関連を明確にしたい [2] グリッド環境での計算 ▌ 現状 ►既存の分散オブジェクトでは無駄が多すぎる ►通信 + 手続きを記述するモデルが主流 ▌ 求められる記述モデル ►動的プロセッサ数の増減に対応 ►記述が容易 ►無駄な通信が発生しない これらを備えた記述モデル 「分散集合オブジェクト」を提案 [3] 発表の流れ ▌ はじめに ▌ 背景 ►分散集合 ►並列プログラミングモデル ▌ 分散集合オブジェクト ▌ 性能評価 ▌ まとめ [4] 分散集合 (Distributed Aggregate) ▌ 定義 ►プロセッサ間にまたがるデータ ►インデックスで位置が要素を識別 ▌ 用途 ►配列・ハッシュ表など ▌ 通常の環境では高速にアクセス可能 ►逐次プログラム データのアドレスを簡単に計算可能 ►プロセッサ数固定の並列プログラム プロセッサ番号を簡単に計算可能 背景 [5] 分散オブジェクト ▌ オブジェクト指向を並列プログラムに導入 ►クラス定義と、それを用いるプログラムを記述 ►リモートのメソッドを呼び出せる(RMI) ►オブジェクトを移動できる (マイグレート) Object x x->m()を実行 参照 remote_x remote_x->m(); 背景 マイグレート 参照も移動 Object x x->m()を実行 [6] 分散オブジェクトによる分散集合の記述 ▌ プロセッサ増減に対応すると性能が悪い ►要素とプロセッサの対応表をmanagerが保持 ►メソッド呼び出しはmanagerを通じて行う ►managerを持つプロセッサにメッセージが集中 ⇒台数効果が得られない 0 1 2 … get(2) manager 100 … get(100) get(100) 0-99 -> 0 100-199 -> 1 200-299 -> 2 get(2) 背景 200 … [7] 分散集合オブジェクトモデル(1) ▌ 集合の分割保持に特化 ►プログラマは「断片クラス」を定義 断片の分割・併合を実装 ▌ メソッド呼び出し ►全体に対するメソッド呼び出しが出来る ▌ システム実装 ►要素とプロセッサの対応を分散保持 ⇒メッセージが一プロセッサに集中しない ▌ プロセッサ増減 ►断片のマイグレートにより対応 提案 [8] 分散集合オブジェクトモデル(2) ▌ メソッド呼び出し ►集合全体に対しインデックス集合を指定 ►メッセージは断片に直接届く ⇒メッセージが一プロセッサに集中しない WholeArray->calc([50,150)); calc([50-150)) [50-100) [100-150) calc([50-100)) [0-100) 提案 calc([100-150)) [100-200) [200-… [9] 特徴 ▌ プロセッサ数の増減に対応 ►断片のマイグレーション ▌ 記述しやすい ►オブジェクト指向 ►「全体オブジェクト」というビューを提供。 要素の配分を意識する必要がない ▌ メッセージパッシングに劣らない速度 ►メソッド呼び出し 提案 [10] アプリケーションの記述方法 ▌ 断片クラス ►DistibutedAggergateクラスを継承 ►断片クラスはIndexSetを保持 ►メソッドは保持するIndexSetに対する処理を記述 ►データの分割・併合を記述 ▌ メインルーチン ►各プロセッサで断片を生成 ►集合全体に対し、範囲を指定してメソッド呼び出し ►join()・leave()により、断片をマイグレート [11] 記述例 (メソッド定義・RMI) ▌ 分散配列の要素をインクリメント ►配分によらず要素[100-200)をインクリメントできる void DistributedArray::increment(IndexSet *is){ foreach (index <- is){ data[index]++; } } int main(){ … WholeArray->increment ([100-200)); [12] 記述例 (マイグレーション) ▌ 計算に参加し、断片を受け取る擬似コード ►オブジェクト定義で、split()とmerge()を記述 ►プログラマは集合全体を指定して関数呼び出し DistributedArray::split(void) {(データとインデックス集合を分割) return (分割したデータ);} DistributedArray::serialize() { return (保持するデータ);} DistributedArray::merge(データ) {(データをデシリアライズして併合)} int main(){ join(object_id); [13] システムの実装 ▌ C++で、Phoenixライブラリを用いて実装 ►IndexSet (一次元/二次元の二種類を提供) ►シリアライズ用ライブラリ ►RMI / マイグレーション ►3000行程度 実装 [14] 性能評価 ▌ 偏微分方程式の数値解法による実験 ►二次元配列を分散保持 ►アルゴリズム ◘ 各断片は端のデータを交換 ◘ 上下左右の値を用いて値を更新 ◘ 全プロセッサの残差を合計 ◘ 閾値より小さければ終了・大きければループ ►プロセッサ数の増減に対応 ◘ 64台での連続joinに成功 [15] 実行時間 ▌ 実行時間 ►一回のループ時間から台数効果を測定 ►一辺10000, 20000, 30000で実行 ►一台で実行可能な限界は10000x10000 以降は実行可能な最小のプロセッサ数を基準に換算 ▌ 結果 30.0 25.0 20.0 台数効果 ►問題サイズに応じて 台数効果が得られた ►メッセージパッシングと 同等の特性と思われる 15.0 10.0 10000x10000 20000x20000 30000x30000 5.0 0.0 1 21 41 # of procs 61 81 [16] マイグレーションの様子 ▌ Join時間の内訳 split ►配列サイズ10000x10000 32台に一台を追加 ►状態により大きく変動 ►28Mbps-14Mbps 1.8 0.0 comm. 1.3 1.0 2.0 0.9 3.0 4.0 60 ▌ Joinにかかる時間 50 40 time (sec) ►10000x10000で、プロセッ サを1-24台追加 ►台数が増えると同期のコス トが増大 merge 30 20 1 split 2 split 10 3 split 0 0 5 10 15 join time 20 25 # of procs [17] まとめ ▌ 分散集合オブジェクトの提案・実装を行った ►断片のマイグレーションに対応 ►メソッド呼び出し時にメッセージが集中しない ▌ 性能を損なわず、容易な記述 ►偏微分方程式の解法 ►プロセッサ増減に対応 ►性能低下無しに容易な記述 ▌ 今後の課題 ►記述性の改善 (返り値のサポートなど) [18]
© Copyright 2024 ExpyDoc