Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MPIによる並列計算

18,576 views

Published on

MPIを用いた並列計算の解説
並列化スキルが習得できます

Published in: Technology
  • Be the first to comment

MPIによる並列計算

  1. 1. MPIによる並列計算 MPIによる並列計算 並列化とは 並列化例 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All 2009/10/06 1 rights reserved.
  2. 2. 目次 • 並列計算ってなんだろう • 効果・メリット • MPIで並列計算するには • 基本的なMPIコードのリーディング • 実習環境の使い方 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 2 All rights reserved.
  3. 3. 並列計算とは • 部分問題に切り分けて、同時に複数実行する 小P 小P Problem 小P 小P 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 3 All rights reserved.
  4. 4. 計算間の並列性 ・・・ ・ ・ ・ • 並列性: ・ ・ = – 複数のCPUへ分担させて ・・・ ・ ・ ・ 同時に実行しても正しい 計算結果が得られること ・・・ ・ ・ ・ = • たとえば行列積では: ・ – 結果の各要素の計算は 同時実行可能! 全て同時に実行してOK ・ ・ = ・・・ ・ ・ 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 4 All rights reserved.
  5. 5. 並列計算のメリット • さらなる高速化向上への道 – 周波数向上が頭打ち→メニーコア化 – 「時間」を買える • さらなる大規模化への道 – シミュレーションの高精度化、大規模化 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 5 All rights reserved.
  6. 6. 並列化の効果 • 理想的にはCPUをつぎ込んだだけ速く計算できる t t 実際は通信がオーバーヘッドとなることが多い 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 6 All rights reserved.
  7. 7. 並列版の作り方 • どんなモデル? – 並列実行モデル – 分散メモリアーキテクチャ • 何をどのように書けばいい? – rankによる条件分岐 – 通信処理 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 7 All rights reserved.
  8. 8. 並列計算の実際の流れ 並列計算実行 アプリ アプリ アプリ LAN アプリ 通 アプリ 信 アプリ クラスタ ユーザ アプリ アプリ 同時に複数CPUを 同時に複数 を 結果 使って計算 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 8 All rights reserved.
  9. 9. MPIシステムの位置関係 MPIシステムの位置関係 プロセス0 プロセス プロセス1 プロセス Message 通信 TCP/IP通信 システム MPIシステム (ライブラリ) 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 9 All rights reserved.
  10. 10. 並列プロセスの内容 • 全ノード上で同一のバイナリを動かす – 一般に、並列動作には共通コードが多い • でもちょっと振舞いを変える必要あり – 例:1番目は1~50を足す、2番目は51~100を足す 同一のバイナリ プロセス0 プロセス プロセス1 プロセス ~ の総和 1~100の総和 の和+51~ =1~50の和+ ~100の和 ~ の和+ の和 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 10 All rights reserved.
  11. 11. rankによる条件分岐 rankによる条件分岐 • 1番目は1~50を足す、2番目は51~100を足す • 実行時のプロセス識別番号「rank」で書き分ける • rank IP rankとIPアドレス(NIC)との対応づけは NIC MPIシステムが行う if rank==0 then プロセス0 プロセス ~ を足す 1~50を足す プロセス1 プロセス else ~ を足す 51~100を足す 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 11 All rights reserved.
  12. 12. プログラミングする上で: 隣のメモリを直接読み書き可能? 隣のメモリを直接読み書き可能? 分散メモリ(複数ノード) NO:分散メモリ(複数ノード) 共有メモリ(マルチコア) YES:共有メモリ(マルチコア) • 隣のプロセスがメモリ内容を • 隣のスレッドのメモリは 変更したら新しい値を通信で 自由に読み書き(load,store) 授受する必要がある できる – 複数のメモリアドレス空間 – 単一のメモリアドレス空間 • 通信を考えるのは難しいが • 通信コードを書かずに済む 事実多くのアプリの並列化に – 敷居が低い 使用できている • OpenMP, Pthread • MPI, (Grid)RPC 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 12 All rights reserved.
  13. 13. 並列計算の例 Σ Y=a[0]+a[1]+…+a[99] 1CPU 4CPU プロセス0 プロセス a=a[0]+…+a[24] Y=a+b+c+d プロセス1 b=a[25]+…+a[49] プロセス プロセス2 プロセス c=a[50]+…+a[74] プロセス3 プロセス d=a[75]+…+a[99] 並列処理を行う部分 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 13 All rights reserved.
  14. 14. 通信処理の書き方 • メッセージ送信関数 MPI_Send(送信バッファのアドレス, 送信数, MPI_Send(送信バッファのアドレス, 送信数, 型, 受信するプロセスのrank, メッセージタグ, 受信するプロセスのrank, メッセージタグ, コミュニケータ) コミュニケータ) この2つを この つを おさえれば • メッセージ受信関数 書ける MPI_Recv(受信バッファのアドレス, 受信数, MPI_Recv(受信バッファのアドレス, 受信数, 型, 送信してくるプロセスのrank, メッセージタグ, 送信してくるプロセスのrank, メッセージタグ, コミュニケータ, ステータス情報用バッファ) コミュニケータ, ステータス情報用バッファ) 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 14 All rights reserved.
  15. 15. MPI_Send/Recvの動作 MPI_Send/Recvの動作 t プロセス 0 MPI_Send ↓sendbuf メモリ空間0 メモリ空間 int ↓recvbuf メモリ空間1 メモリ空間 プロセス 1 MPI_Recv if (rank == 0 { 0) MPI_Send( sendbuf, MPI_Send &sendbuf 1, MPI_INT, 1, 1,MPI_COMM_WORLD); } else if (rank == 1 { 1) MPI_Recv( recvbuf MPI_Recv &recvbuf 1, MPI_INT, 0, 1,MPI_COMM_WORLD, &status); buf, } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 15 All rights reserved.
  16. 16. MPIの定型句を入れましょう(1/2) MPIの定型句を入れましょう(1/2) static const int root = 0; // Rank of the master process MPI_Init(&argc, &argv); // Initialize MPI system int nproc; // The number of processes being used MPI_Comm_size(MPI_COMM_WORLD, &nproc); // Calculate nproc int rank; // My process number MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Calculate rank nproc=4 P rank=0(root) P rank=1 P rank=2 P rank=3 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 16 All rights reserved.
  17. 17. MPIの定型句を入れましょう(2/2) MPIの定型句を入れましょう(2/2) char hostname[MPI_MAX_PROCESSOR_NAME]; int namelen; MPI_Get_processor_name(hostname, &namelen); // Hostname fprintf(stdout, "[%d/%d] %s¥n", rank, nproc, hostname); fflush(stdout); // Output immediately nproc=4 P rank=0 on node00 (CPU0) … (並列コード)… P rank=1 on node00 (CPU1) P rank=2 on node01 (CPU0) P rank=3 on node01 (CPU1) 確認:ちゃんと複数CPUコアを MPI_Finalize(); // Finalize MPI system 使 っ て 動 か せ て い る か ? 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 17 All rights reserved.
  18. 18. MPIを使用するための必須事項 MPIを使用するための必須事項 例 からRANK1へ情報を送信するプログラム から (例) RANK0から へ情報を送信するプログラム 1. #include <stdio.h> 必須のインクルード 2. のためのインクルードファイル #include “mpi.h” ←MPIのためのインクルードファイル の場合はmpif.h) •mpi.h (Fortranの場合は の場合は ) 3. 4. int main(int argc, char* argv[]){ 変数 5. int rank, nproc, status; • int rank 自ランク番号 6. MPI_Status status; • int nproc 総ランク数 7. int buffer, Message=25; 8. MPI_Init(&argc, &argv); ① 9. ② MPI_Comm_rank(MPI_COMM_WORLD, &rank);② 処理 10. MPI_Comm_size(MPI_COMM_WORLD, &nproc); ③ ①MPI_Init MPI環境の初期化 11. ②MPI_Comm_size プロセスの総数取得 12. ③MPI_Comm_Rank 自ランク取得 13. if(RANK==0){ ④MPI_Finalize MPI終了処理 14. MPI_Send( Message, 1, MPI_INT, 1, 1,MPI_COMM_WORLD); 15. }else if(RANK==1){ 16. MPI_Recv(buffer, 1, MPI_INT, 0, 1,MPI_COMM_WORLD, &status) ; 17. } 18. 19. 20. MPI_Finalize(); ④ 21. return 0; 22. } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 18 All rights reserved.
  19. 19. 基本MPIコード 基本MPIコード リーディング 一対一通信を使った 具体例「配列の総和」を 深く理解しよう 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 19 All rights reserved.
  20. 20. お話しすること • 配列の総和 1/2 1/2 rank=0 1 1/nproc 1/nproc ・・・ 1/nproc rank=0 1 nproc-1 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 20 All rights reserved.
  21. 21. rank=0 rank=1 main() { main() { MPI初期化 MPI初期化 MPI初期化 MPI初期化 Aの確保 Aの初期化 offset, numの計算 numの計算 offset, numの計算 numの計算 subAの確保 subAの確保 subAの確保 subAの確保 の後半をrank=1へ送信 Aの後半をrank=1へ送信 の後半をrank=0から受信 Aの後半をrank=0から受信 の前半をsubAにコピー Aの前半をsubAにコピー sumup(subA,num[0],&subtotal); sumup(subA,num[1],&subtotal); answer = subtotal subtotalをrank=1から受信 subtotalをrank=1から受信 subtotalをrank=0へ送信 subtotalをrank=0へ送信 answer += subtotal 結果テスト MPI終了処理 MPI終了処理 MPI終了処理 MPI終了処理 メモリ解放 メモリ解放 } } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 21 All rights reserved.
  22. 22. nproc並列版に変えるには(1/2) nproc並列版に変えるには(1/2) • rank=1から/への処理がnproc-1倍に増える rank=0 rank=1..nproc-1 1..nproc- rank=1への送信 rank=0からの受信 rank=1..nproc-1への送信(繰り返し) 1..nproc- rank=1からの受信 rank=0への送信 rank=1..nproc-1からの受信(繰り返し) 1..nproc- ※マスタワーカ型の場合 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 22 All rights reserved.
  23. 23. nproc並列版に変えるには(2/2) nproc並列版に変えるには(2/2) • C言語でいうと rank=0 rank=1..nproc-1 1..nproc- for ( i = 1; i < nproc; i++ ) nproc; MPI_Send(A+offset[i], num[i], i…); i i MPI_Recv( A+offset[rank], num[rank], 0…); for ( i = 1; i < nproc; i++ ) nproc; MPI_Recv(B+offset[i], num[i], i…); i i MPI_Send( B+offset[rank], num[rank], 0…); 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 23 All rights reserved.
  24. 24. rank=0 rank=1..nproc-1 main() { main() { MPI初期化 MPI初期化 MPI初期化 MPI初期化 Aの確保 Aの初期化 offset, numの計算 numの計算 offset, numの計算 numの計算 subAの確保 subAの確保 subAの確保 subAの確保 の一部をrank=1..nproc-1へ送信 の一部を Aの一部を へ送信 の一部をrank=0から受信 の一部を Aの一部を から受信 の一部をsubAにコピー の一部を Aの一部を にコピー sumup(subA,num[0],&subtotal); sumup(subA,num[rank],&subtotal); answer = subtotal を から受信 subtotalをrank=1..nproc-1から受信 subtotalをrank=0へ送信 subtotalをrank=0へ送信 answer += subtotal 結果テスト MPI終了処理 MPI終了処理 MPI終了処理 MPI終了処理 メモリ解放 メモリ解放 } } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 24 All rights reserved.
  25. 25. 実習環境の使い方 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 25 All rights reserved.
  26. 26. VNC: リモートデスクトップツール VNCクライアントの起動 http://www.realvnc.com/ 遠隔にLinuxのGUIを使える 遠隔にLinuxのGUIを使える 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 26 All rights reserved.
  27. 27. コンパイル:mpicc コンパイル:mpicc > mpicc matmul-mpi.c – MPIライブラリが自動的にリンクされる – gccのオプション(-lや-o)をそのまま使える 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 27 All rights reserved.
  28. 28. 実行:mpirun 実行:mpirun 計算に使うCPUコア総数 ./a.out > mpirun –np 計算に使う コア総数 並列計算の依頼 ソフト LAN クラスタ ユーザ 複数CPUを使って 複数 を使って 並列に計算 2009/10/06 結果 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All rights reserved. 28
  29. 29. おまけ:rank割当て変更方法 おまけ:rank割当て変更方法 > mpirun --hostfile マシンファイルのパス 計算に使うCPUコア総数 --byslot ./a.out –np 計算に使う コア総数 --byslot • --byslot 幅優先 • --bynode 深さ優先 node01 0 1 node01 0 4 node02 2 3 node02 1 5 node03 4 5 node03 2 6 node04 6 7 node04 3 7 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 29 All rights reserved.
  30. 30. 画像ビューア:GQView 画像ビューア:GQView S Slide show 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 30 All rights reserved.
  31. 31. 2次元熱伝導解析 アプリケーションの並列化 HPCシステムズ 新規事業企画室 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 31 All rights reserved.
  32. 32. 2次元熱伝導シミュレーション • 熱伝導とは... – 物質中の熱が伝わる様子をシミュレーション – 基本的な物理現象の一つ – 熱伝導方程式から数値的に解析可能 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 32 All rights reserved.
  33. 33. 計算モデルについて 出典:大分大学工学部生産システム工学科 三村泰成氏作成 http://mikilab.doshisha.ac.jp/dia/smpp/00_cluster/doc/chapter05.pdf × 格子 256×256格子 初期条件 300K 断熱 条件 熱源 800K 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 33 All rights reserved.
  34. 34. 逐次版熱伝導 シミュレーションプログラム • ソース名 sfdm2d.c • コンパイル > icc sfdm2d.c -O0 -pg -o sfdm2d.exe プロファイル取得 • 実行 > ./sfdm2d.exe 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 34 All rights reserved.
  35. 35. HOT SPOT特定 SPOT特定 • コンパイル時に-pgオプションを付けることにより、 プログラム実行時に、関数呼び出しの時間を計測 できる(gmon.out出力) • gprofコマンドにより、gmon.outの内容を表示 > gprof ./sfdm2d.exe | less 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 35 All rights reserved.
  36. 36. 差分法 (solve関数) solve関数) ∂T ∂ 2T ∂ 2T = a( 2 + 2 ) ∂t ∂x ∂y 差分法で用いる形に変換 Ti ,( n +1) − Ti ,( n ) j j Ti +n ,) j + Ti −n ,) j − 2Ti ,( n ) ( 1 ( 1 j Ti ,( n+1 + Ti ,( n−1 − 2Ti ,( n ) j ) j ) j = a( 2 + 2 ) ∆t ∆x ∆y 2 格子が等間隔であるこ とから ∆ x = ∆ y = h 、 γ = ∆ t / h とすると、 Ti ,( n +1) = γ (Ti +n ,) j + Ti −n ,) j + Ti ,( n+1 + Ti ,( n−1 − 4Ti ,( n ) ) + Ti ,( n ) j ( 1 ( 1 j ) j ) j j 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 36 All rights reserved.
  37. 37. void solve(double gamma){ for(i=NW/2 ; i<NW-1 ; i++){ i = NW-1; double Te, Tw, Ts, Tn; Tw = T[i-1][j]; j = NH-1; int i,j; Te = T[i+1][j]; Tw = T[i-1][j]; Ts = T[i][j+1]; /* insulation */ Te = T[i-1][j]; /* insulation */ /* Left boundary */ 境界計算 Tn = T[i][j+1]; Ts = T[i][j-1]; i = 0; T_new[i][j] = gamma*( Tn = T[i][j-1]; /* insulation */ for(j=1 ; j<NH-1 ; j++){ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; T_new[i][j] = gamma*( Tw = T[i+1][j]; /* insulation */ Te = T[i+1][j]; } /* corner */ 一般的な点 Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; Ts = T[i][j-1]; i = 0; 四隅の計算 の計算 /* Calc. inner temp. */ Tn = T[i][j+1]; j = 0; for(i=1 ; i<NW-1 ; i++){ T_new[i][j] = gamma*( Tw = T[i+1][j]; /* insulation */ for(j=1 ; j<NH-1 ; j++){ Tw + Te + Ts + Tn –4.0*T[i][j]) + T[i][j]; Te = T[i+1][j]; Tw = T[i-1][j]; } Ts = T[i][j+1]; /* insulation */ Te = T[i+1][j]; /* Right boundary */ Tn = T[i][j+1]; Ts = T[i][j-1]; i = NW-1; T_new[i][j] = gamma*( Tn = T[i][j+1]; for(j=1 ; j<h_mid ; j++){ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; T_new[i][j] = gamma*( Tw = T[i-1][j]; Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; Te = T[i-1][j]; /* insulation */ i = 0; } Ts = T[i][j-1]; j = NH-1; } Tn = T[i][j+1]; Tw = T[i+1][j]; /* insulation */ } T_new[i][j] = gamma*( Te = T[i+1][j]; Tw + Te + Ts + Tn –4.0*T[i][j]) + T[i][j]; Ts = T[i][j-1]; } Tn = T[i][j-1]; /* insulation */ /* Upper boundary */ T_new[i][j] = gamma*( j = NH-1; Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; for(i=1 ; i<NW-1 ; i++){ Tw = T[i-1][j]; i = NW-1; Te = T[i+1][j]; j = 0; Ts = T[i][j-1]; Tw = T[i-1][j]; Tn = T[i][j-1]; /* insulation */ Te = T[i-1][j]; /* insulation */ T_new[i][j] = gamma*( Ts = T[i][j+1]; /* insulation */ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; Tn = T[i][j+1]; } T_new[i][j] = gamma*( /* Lower boundary */ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. j = 2009/10/06 0; 37 All rights reserved.
  38. 38. int main(int argc, char** argv){ T[i][0] = temp_high; T,filename); int i, j; T_new[i][0] = temp_high; } int count; } int nprint; /* Update temp. */ double a, t; t=0.0; for(i=0 ; i<NW ; i++){ double Te, Tw, Ts, Tn; sprintf(filename," for(j=0 ; j<NH ; j++){ double gamma; %f%s",t,".bmp"); T[i][j] = T_new[i][j]; double dq = DBL_MAX; printf("FILENAME=%s } FILE *fp; メイン ¥n",filename); } time_t time; ループ write_bmp_mono(T,filename); } a = k / rou / c; for(count=1 ; count<=nlimit ; sprintf(filename, gamma = a * dt / (h*h); count++){ "%f%s",t,".bmp"); h_mid = NH / 2; t += dt; 差分法 printf("FILENAME=%s¥n",filename) printf("gamma = %e¥n", solve(gamma); ; gamma); write_bmp_mono(T,filename); if( gamma > 0.5 ){ //Over write HEATER exit(0); for(i=0 ; i<NW/2 ; i++){ return 0; } 初期 T[i][0] = temp_high; } 温度 T_new[i][0] = temp_high; /* Init. Temp. */ } for(i=0 ; i<NW ; i++){ データ for(j=0 ; j<NH ; j++){ /* write data */ T[i][j] = temp_low; 書き出し if( (count%1000) == 0){ T_new[i][j] = temp_low; sprintf(filename, } "%f%s",t,".bmp"); } printf("FILENAME= %s¥n",filename); // Init. HEATER 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 for(i=0 ; i<NW/2 ; i++){ write_bmp_mono(reserved. 38 All rights
  39. 39. 並列化手順 1. 定型句の挿入 2. 2並列化 3. n並列化 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 39 All rights reserved.
  40. 40. 定型句の挿入 • ヘッダファイル挿入: mpi.h • 関数 – MPI_Init – MPI_Comm_World – MPI_Comm_Size – MPI_Finalize • ホスト名の取得 – char hostname[MPI_MAX_PROCESSOR_NAME]; int namelen; MPI_Get_processor_name(hostname, &namelen); fprintf(stdout, "[%d/%d] %s¥n", rank, nproc, hostname); fflush(stdout); 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 40 All rights reserved.
  41. 41. 差分法の並列化(2分割) RANK0 担当 RANK1 担当 128格子 128格子 領域分割 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 41 All rights reserved.
  42. 42. 境界部分の計算 126 127 128 129 n RANK0 RANK1 持ってない! w e s 領域分割 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 42 All rights reserved.
  43. 43. 0 127 128 126 127 128 129 部分計算 n w e rank0 s 128 255 128 rank1 部分計算 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 43 All rights reserved.
  44. 44. 128 T_Right 126 127 128 129 n w e rank0 バッファの s 値を使う T_Left 128 rank1 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 44 All rights reserved.
  45. 45. n並列化にあたっての留意点 • 自rank+1、又は、自rank-1と送受信 • rank0、nproc-1、それ以外のrankの挙動の違い • 境界条件の扱い 1 2 3 rank0 rank1 rank2 rank3 64 64 64 64 の場合 n=4の場合 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 45 All rights reserved.
  46. 46. n並列化 実装その1 rank0 1 rank1 2 rank2 3 rank3 プログラムが単純で、理解し やすい反面、他のランクが通 ① ① ① ② 信中は、順番が回ってこない と通信ができないため、無駄 な待ち時間が多くなる。 ② ③ が でなければ、 rankがnproc-1でなければ、 ② ③ 右に SEND ① ④ ③ が でなければ、 rankが0でなければ、 左から RECV ② ④ が でなければ、 rankが0でなければ、 左に SEND ③ ④ が でなければ、 rankがnproc-1でなければ、 右から RECV ④ 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 46 All rights reserved.
  47. 47. n並列化 実装その2 rank0 1 rank1 2 rank2 3 rank3 複数の通信を同時にすることで、 通信時間の短縮を図る。 ② ⑤ ① ⑥ 同期通信を使う場合、偶奇で、 する方向を合わせて SEND/RECVする方向を合わせて おかないと、deadlockを起こす。 おかないと、 を起こす。 ⑥ ② が偶数なら rankが偶数なら ③ ⑦ ③ ⑦ 左に (I)SEND ① 右に (I)SEND ② 右から (I)RECV ③ ⑧ ④ 左から (I)RECV ④ が奇数なら rankが奇数なら 右から (I)RECV ⑤ 左から (I)RECV ⑥ 左に (I)SEND ⑦ 右に (I)SEND ⑧ 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 47 All rights reserved.
  48. 48. n並列化 実装その3 rank0 1 rank1 2 rank2 3 rank3 非同期通信を使用する。 領域境界の点の計算と、 その他一般的な場所の点の 計算を分離して考えると、 通信時間を利用して 通信と同時に、 計算を進めることができる。 通信と関係ない点について計算を進める • 非同期通信で、全ての を呼び出す SEN/RECVを呼び出す • 一般的な場所の点の計算を開 始し、その間に非同期通信を実 行する • 一般的な場所の点が全て 終了してもなお、通信が 終わっていない場合の 通信が終わってから、領域境界のみ計算 ために、MPI_WAITによって、 ために、 によって、 正しい通信の終了を待つ • 通信修了後、領域境界に 必要な情報がそろっている はずなので、領域境界の 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 48 計算を別途行う All rights reserved.
  49. 49. 課題 挑戦者数 達成者数 定形文の挿入 2 2 並列化 2並列化 2 1 並列化 4並列化 1 1 並列化(実装 並列化 実装1) N並列化 実装 2 2 並列化(実装 偶奇分け) 並列化 実装2:偶奇分け N並列化 実装 偶奇分け 2 2 並列化(実装 通信と計算のオーバーラップ) 並列化 実装3:通信と計算のオーバーラップ N並列化 実装 通信と計算のオーバーラップ 2 2 両方向分割並列 XY両方向分割並列 性能測定 1 1 配列の領域(NW)を小さく 大きくしてみる 配列の領域 を小さく/大きくしてみる を小さく 1 1 要らないメモリを使わないようにする 1 性能分析(計算・通信の内訳は? 性能分析 計算・通信の内訳は?) 計算・通信の内訳は?
  50. 50. 0 63 rank0 ずつ 64ずつ rank1 64 127 部分計算 rank2 128 191 rank3 192 255
  51. 51. n並列化時の書き方 • 「各プロセスが担当する処理」を書く。 – ×:全プロセスが実行する処理を書く • 各プロセスが全プロセス分の処理をやってしまうので間違い • n並列に一般化して書くには が のとき、 のとき、2のとき、・・・」という のとき、1のとき、 – 「rankが0のとき、 のとき、 のとき、・・・」という ベタな値の条件分岐が並んだソースコードは書かない • 128並列用のソースコードは書きたくないですよね? – ポイント:処理自体を、 処理自体を、rankを使って読み替えさせる 処理自体を、 を使って読み替えさせる
  52. 52. x = 2 * rank; //各プロセスの変数xに、値「自rank*2」を代入 0 2 4 6 2*(nproc- 1) x x x x ・・・ x for (i=NW/nproc*rank ; i < NW/nproc*(rank+1) ; i++) //長さNWの領域を等分割して、プロセス群に それぞれ割り当てる (NW/nproc)*1 0 NW (NW/nproc)*2

×