本日 (4/25) の内容 1 並列計算の概要 並列化計算の目的 並列コンピュータ環境 並列プログラミングの方法 MPI を用いた並列プログラミング 並列化効率 2 並列計算の実行方法 Hello world モンテカルロ法による円周率計算
並列計算のはじまり 並列計算の最初の構想を イギリスの科学者リチャードソンが 1922 年に発表 < リチャードソンの夢 > 64000 人を円形の劇場に集めて 北半球全体を 2000 ブロックに分け 各ブロックに 32 人ずつ割り当てて一斉に手計算すれば リアルタイムに気象予測が可能
並列計算の目的 現代では コンピュータを駆使して 並列処理 n 個のプロセッサ (CPU) を用いることにより 計算時間を 1/n に短縮 大規模な演算処理を必要とするシミュレーションを高速に処理 ( 地震予測 地球温暖化 津波などのシミュレーション技術などの確立が急務 )
並列コンピュータの開発その 1 1946 年に世界最初の汎用コンピュータ ENIAC (400flops) を開発 ( 処理速度が 1FLOPS のコンピュータは 1 秒間に 1 回の浮動小数点数演算 ) 表 TOP500 (2006 年 11 月時点 ) 現在はこちら http://www.top500.org/
並列計算機の分類 CPU( プロセッサ ): コンピューターの中央処理装置 命令を読み込み 実行 メモリ : データやプログラムを記憶する装置で CPU が直接読み書き 共有メモリ型 ( すべてのプロセッサがメモリを共有 ) ( 短所 ) プロセッサが増すとメモリの書き込みが競合し 並列化の効率を低下 メモリ CPU CPU CPU 分散メモリ型 ( それぞれのプロセッサが個別にメモリを保有 ) ( 短所 ) データが分散して配置されるため そのことを考慮したプログラミング開発が必要 メモリ ネットワーク メモリ メモリ ノード CPU CPU CPU
並列プログラミング MPMD(Multiple Program Multiple Data) 複数のプログラムを複数のプロセッサで処理 プロセッサ間の通信の明示 1 つのノードで親プロセスを他のノードで子プロセスを実行 主従関係を持つ SPMD(Single Program Multiple Data) 1 つのプログラムを複数のプロセッサで処理 プロセッサ間の通信の明示 (1 プログラムを複数のプロセッサで処理のため ) データがどのプロセッサにあるかを確認
MPI とは? SPMD のタイプ ノード間の情報交換を通信で行うライブラリ ノード メモリ CPU ネットワーク ノード メモリ CPU Fortran や C などのプログラミング言語に サブルーチン ( 関数 ) として用いる MPI サブルーチンを用いて 各ノード間で必要な情報を交換する
MPI サブルーチン MPI サブルーチンは 3 つに分類 おまじない 1 環境管理サブルーチンプログラムの最初と最後の部分で必ず使用 2 グループ通信サブルーチン複数のノード間を通信 31 対 1 通信サブルーチン 2 つのノード間の通信 4 その他計算時間や通信時間を計測
1 環境管理サブルーチン call MPI_INIT(error) MPI のプログラムを使用するためにプログラムの先頭に必ずコールする call MPI_FINALIZE(error) プログラムの最後に必ずコールする これがコールされた後は MPI のサブルーチンを呼び出すことはできない error : 整数 完了コードと呼ばれる コール文が実行できた場合は error=0 となる
1 環境管理サブルーチン MPI_Abort(MPI_COMM_WORLD, error) すべてのプロセスを即時に異常終了する MPI_COMM_WORLD( グループ番号 ) コミュニケータを識別する変数 コミュニケータとはプロセスのグループを識別 プロセスは順序付けられ それぞれランクを持つ コミュニケータ ネットワーク コミュニケータ ランク 1 ランク 2 ランク 3 ランク 1 ランク 2 ランク 3 ランク 4
1 環境管理サブルーチン MPI_COMM_SIZE(MPI_COMM_WORLD, tnode, error) コミュニケータ( グループ ) に含まれるプロセスの和 MPI_COMM_WORLD : 整数 コミュニケータを指定 Tnode : 整数 MPI_COMM_WORLDで指定したグループ内に含まれるプロセス数 error : 整数 完了コードが戻る MPI_COMM_RANK(MPI_COMM_WORLD, myrank, error) コミュニケータ( グループ ) 内でのプロセスのランクが戻る MPI_COMM_WORLD : 整数 コミュニケータを指定する myrank : 整数 MPI_COMM_WORLDで指定したグループ内のランクが戻る error : 整数 完了コードが戻る
2 グループ通信サブルーチン MPI_Allreduce(&sendbuf, &recvbuf, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); コミュニケータ内のプロセスの送信 (&sendbuf) のメッセージが 通信しながら加算 (MPI_SUM) され 結果が全プロセスの受信に送信される &sendbuf : 送信バッファの先頭アドレスを指定 &recvbuf : 受信バッファの先頭アドレスを指定 1 : 整数 送受信の要素数を指定 MPI_INI : 送受信のメッセージのデータタイプを指定 ここでは整数型 MPI_SUM : 演算の種類を指定 error : 整数 完了コードが戻る
341 対 1 通信サブルーチン その他 MPI_Send(&buf, count, MPI_INT, dest, tag, MPI_COMM_WORLD); MPI_Recv(&buf, count, MPI_INT, source, tag, MPI_COMM_WORLD); MPI_Isend(&buf, count, MPI_INT, dest, tag, MPI_COMM_WORLD, &request); MPI_Irecv(&buf, count, MPI_INT, source, tag, MPI_COMM_WORLD, &request); MPI_Wait(&request, &status); MPI_Wtime();
並列化効率 並列計算の効率を計るために定義される指標 1プロセッサによる計算時間効率 = 100% Nプロセッサによる計算時間 N スピードアップ 1プロセッサによる計算時間 = N プロセッサによる計算時間
今日の内容 1 並列計算の概要 並列化計算の目的 並列コンピュータ環境 並列プログラミングの方法 MPI を用いた並列プログラミング 並列化効率 2 並列計算の実行方法 Hello world モンテカルロ法による円周率計算
MPI プログラムの実行方法 (SC 版 ) (1) ダウンロード hello_parallel.f と run_hello_parallel.sh と machines をダウンロード WinSCP を利用して SC の各個人の home に転送する home に適当なディレクトリを作って保存する e.g) % mkdir mpi_test_1 % mv hello_parallel.f run_hello_parallel.sh machines mpi_test_1 % cd mpi_test_1 % ls hello_parallel.f machines run_hello_parallel.sh (3) 実行 % cat run_hello_parallel.sh #!/bin/sh %/usr/local/mpich-1.2.7p1/bin/mpirun -np 2 -machinefile machines a.out ( オプションの意味 ) -np [ 数字 ] プロセス数の指定 -machinefile [ マシンファイル名 ] マシンファイルで指定したノードを利用する % chmod +x run_hello_parallel.sh %./run_hello_parallel.sh (2) プログラムのコンパイル (1) でファイルを保存したディレクトリで % /usr/local/mpich-1.2.7p1/bin/mpif77 hello_parallel.f
モンテカルロ法による円周率計算 モンテカルロ法 計算機上で 乱数を用いてランダムな事象を多数回生成し その統計から情報を得る 手法 モンテカルロ法による円周率計算 半径 1の円の四分円 およびそれを囲む一辺 1の正方形を y 考える 正方形の中に でたらめに 点をうつ 1 ( 四分円の中に落ちた点の数 : ( 落とした点の総数 : N) n) ( 四分円の面積 ) ( 正方形の面積 ) π = 4 点の数の比 n/n は N が大きければ 四分円と正方形の面積の比にほぼ等しくなる よって 4n π N 大 N ( ) O 1 x
MPI プログラム pi_parallel.c (1) ダウンロード pi_parallel.c と run_pi_parallel.sh と machines と Makefile をダウンロード WinSCP を利用して SC の各個人の home に転送する home に適当なディレクトリを作って保存する e.g) % mkdir mpi_test_2 % mv pi_parallel.c run_pi_parallel.sh machines Makefile mpi_test_2 % cd mpi_test_2 % ls Makefile pi_parallel.c machines run_pi_parallel.sh (2) プログラムのコンパイル (1) でファイルを保存したディレクトリにおいて Makefile をつかってコンパイル % make (3) 実行 % cat run_pi_parallel.sh #!/bin/sh /usr/local/mpich-1.2.7p1/bin/mpirun -np 2 -machinefile machines pi_parallel % chmod +x run_pi_parallel.sh %./run_pi_parallel.sh
追加演習 試行回数 N と精度の関係は? POINTCNT を変える マシン台数と計算時間の関係は? -np オプションの引数を変える ( マシンファイルも修正する )