並列処理 演習

並列処理 演習
クラスタの構成技術と
クラスタによる並列処理
3. クラスタによる並列処理
アプリケーション
クラスタ向きのアプリケーション
– 一般にプロセッサ内での処理量が多く通信量が
少なければ並列処理の効果は高い
• 特にクラスタではこの傾向が顕著
– 驚異的並列計算(embarrassingly parallel)
同時に実行できる完全な独立部分に分解できる問題
– スーパーリニアスピードアップ
n台でn倍以上の速度向上
データサイズ縮小によるメモリ・キャッシュの効果
アプリケーション(2)
• 画像処理
– ボリュームレンダリング
• データベース検索
– たんぱく質分析
– データマイニング
メッセージ通信ライブラリ
• 並列アプリケーションで通信を行うソフトウェア
– ネットワークに依存しない通信がしたい
• いちいちソケットを使って書くのは大変
• ネットワークプロトコルがTCP/IPとは限らない
• かつては各社が独自に提供
– IBM: MPL
• 可搬性のあるプログラムを書きたい
• 標準規格が欲しい
– MPI Forum: MPI
PVM
•
•
•
•
Parallel Virtual Machine
1989年 オークリッジ国立研究所
問題を別々のプログラムに分解して実行
Heterogeneousな環境による並列処理の研究から
誕生
– データ表現の自動変換、動的プロセス生成、マシン自
動選択
• Heterogeneous環境での並列実行も可能
• 動的なプロセス生成を提供
• 固有の並列計算機に特化した高速化はできない
PVMの動作モデル
MPI
• Message Passing Interface
• 1992年 MPI Forum
– 並列計算機ベンダーと学術組織
• 仕様のみ策定。実装は各ベンダーに任せる
– ベンダーがそれぞれの計算機固有の方式を用いて実
装
• MPICH, LAM
• 1997年 MPI-2
動的プロセス生成、並列I/Oなどの仕様を追加
MPIの動作モデル
MPIの実装
• MPICH
– アルゴンヌ国立研究所・ミシシッピ州立大
– 現在の主流
• LAM
– オハイオ スーパーコンピューティングセン
ター
• CHIMP
– エジンバラ並列計算センター
MPIプログラミング
• SPMD (Single Program Multiple Data)モデル
• 基本的には6つの関数で書ける
–
–
–
–
–
–
MPI_Init()
MPI_Comm_size()
MPI_Comm_rank()
MPI_Send()
MPI_Recv()
MPI_Finalize()
サンプルMPIプログラム
#include <mpi.h>
int main(int argc, char *argv[])
{
int rank;
MPI_Status status;
char buf[256];
char data[] = "Hello";
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
MPI_Send(data, 5, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
} else if (rank == 1) {
MPI_Recv(buf, 5, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &status);
printf("%s\n", buf);
}
MPI_Finalize();
}
通信のモデル
• 1対1通信
• 1対n通信
–
–
–
–
いろいろな通信パターンがある
ブロードキャスト、マルチキャスト
レデュース
ギャザ・スキャタ
1対1通信
• MPI_Send(), MPI_Recv()
P0
P1
ブロードキャスト
• あるプロセスから他の全てのプロセスへデータをコ
ピー
• MPI_Bcast()
リデュース
• すべてのプロセスから値を集約
• MPI_Reduce()
スキャタ・ギャザ
• データの要素を各プロセスに分配・収集
• MPI_Scatter(), MPI_Gather()
バリア
• 処理のある部分で全てのプロセスが同期
• MPI_Barrier()
高速化技法
• 実行速度向上の障害
– 通信
– 同期
– 計算量の不均衡
• 負荷分散
– 静的負荷分散
– 動的負荷分散
静的負荷分散
• 問題の性質を見極めて、ノードへ割り当て
る仕事量を決める
– 性質の分かっている問題にしか使えない
– うまく配分するのは難しい
動的負荷分散
• アプリケーションによるアプローチ
マスタ・スレーブ型アプリケーション
• ワークプール
• システムによるアプローチ
プロセスマイグレーション
• 負荷の軽いノードへプロセスを移動
プロセスマイグレーション