• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
MPIによる並列計算
 

MPIによる並列計算

on

  • 13,371 views

MPIを用いた並列計算の解説

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

Statistics

Views

Total Views
13,371
Views on SlideShare
13,316
Embed Views
55

Actions

Likes
7
Downloads
55
Comments
0

2 Embeds 55

http://www.slideshare.net 51
https://twitter.com 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    MPIによる並列計算 MPIによる並列計算 Presentation Transcript

    • MPIによる並列計算 MPIによる並列計算 並列化とは 並列化例 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All 2009/10/06 1 rights reserved.
    • 目次 • 並列計算ってなんだろう • 効果・メリット • MPIで並列計算するには • 基本的なMPIコードのリーディング • 実習環境の使い方 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 2 All rights reserved.
    • 並列計算とは • 部分問題に切り分けて、同時に複数実行する 小P 小P Problem 小P 小P 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 3 All rights reserved.
    • 計算間の並列性 ・・・ ・ ・ ・ • 並列性: ・ ・ = – 複数のCPUへ分担させて ・・・ ・ ・ ・ 同時に実行しても正しい 計算結果が得られること ・・・ ・ ・ ・ = • たとえば行列積では: ・ – 結果の各要素の計算は 同時実行可能! 全て同時に実行してOK ・ ・ = ・・・ ・ ・ 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 4 All rights reserved.
    • 並列計算のメリット • さらなる高速化向上への道 – 周波数向上が頭打ち→メニーコア化 – 「時間」を買える • さらなる大規模化への道 – シミュレーションの高精度化、大規模化 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 5 All rights reserved.
    • 並列化の効果 • 理想的にはCPUをつぎ込んだだけ速く計算できる t t 実際は通信がオーバーヘッドとなることが多い 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 6 All rights reserved.
    • 並列版の作り方 • どんなモデル? – 並列実行モデル – 分散メモリアーキテクチャ • 何をどのように書けばいい? – rankによる条件分岐 – 通信処理 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 7 All rights reserved.
    • 並列計算の実際の流れ 並列計算実行 アプリ アプリ アプリ LAN アプリ 通 アプリ 信 アプリ クラスタ ユーザ アプリ アプリ 同時に複数CPUを 同時に複数 を 結果 使って計算 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 8 All rights reserved.
    • MPIシステムの位置関係 MPIシステムの位置関係 プロセス0 プロセス プロセス1 プロセス Message 通信 TCP/IP通信 システム MPIシステム (ライブラリ) 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 9 All rights reserved.
    • 並列プロセスの内容 • 全ノード上で同一のバイナリを動かす – 一般に、並列動作には共通コードが多い • でもちょっと振舞いを変える必要あり – 例: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.
    • 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.
    • プログラミングする上で: 隣のメモリを直接読み書き可能? 隣のメモリを直接読み書き可能? 分散メモリ(複数ノード) NO:分散メモリ(複数ノード) 共有メモリ(マルチコア) YES:共有メモリ(マルチコア) • 隣のプロセスがメモリ内容を • 隣のスレッドのメモリは 変更したら新しい値を通信で 自由に読み書き(load,store) 授受する必要がある できる – 複数のメモリアドレス空間 – 単一のメモリアドレス空間 • 通信を考えるのは難しいが • 通信コードを書かずに済む 事実多くのアプリの並列化に – 敷居が低い 使用できている • OpenMP, Pthread • MPI, (Grid)RPC 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 12 All rights reserved.
    • 並列計算の例 Σ 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.
    • 通信処理の書き方 • メッセージ送信関数 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.
    • 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.
    • 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.
    • 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.
    • 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.
    • 基本MPIコード 基本MPIコード リーディング 一対一通信を使った 具体例「配列の総和」を 深く理解しよう 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 19 All rights reserved.
    • お話しすること • 配列の総和 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.
    • 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.
    • 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.
    • 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.
    • 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.
    • 実習環境の使い方 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 25 All rights reserved.
    • VNC: リモートデスクトップツール VNCクライアントの起動 http://www.realvnc.com/ 遠隔にLinuxのGUIを使える 遠隔にLinuxのGUIを使える 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 26 All rights reserved.
    • コンパイル:mpicc コンパイル:mpicc > mpicc matmul-mpi.c – MPIライブラリが自動的にリンクされる – gccのオプション(-lや-o)をそのまま使える 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 27 All rights reserved.
    • 実行:mpirun 実行:mpirun 計算に使うCPUコア総数 ./a.out > mpirun –np 計算に使う コア総数 並列計算の依頼 ソフト LAN クラスタ ユーザ 複数CPUを使って 複数 を使って 並列に計算 2009/10/06 結果 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All rights reserved. 28
    • おまけ: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.
    • 画像ビューア:GQView 画像ビューア:GQView S Slide show 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 30 All rights reserved.
    • 2次元熱伝導解析 アプリケーションの並列化 HPCシステムズ 新規事業企画室 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 31 All rights reserved.
    • 2次元熱伝導シミュレーション • 熱伝導とは... – 物質中の熱が伝わる様子をシミュレーション – 基本的な物理現象の一つ – 熱伝導方程式から数値的に解析可能 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 32 All rights reserved.
    • 計算モデルについて 出典:大分大学工学部生産システム工学科 三村泰成氏作成 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.
    • 逐次版熱伝導 シミュレーションプログラム • ソース名 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.
    • 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.
    • 差分法 (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.
    • 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.
    • 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
    • 並列化手順 1. 定型句の挿入 2. 2並列化 3. n並列化 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 39 All rights reserved.
    • 定型句の挿入 • ヘッダファイル挿入: 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.
    • 差分法の並列化(2分割) RANK0 担当 RANK1 担当 128格子 128格子 領域分割 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 41 All rights reserved.
    • 境界部分の計算 126 127 128 129 n RANK0 RANK1 持ってない! w e s 領域分割 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 42 All rights reserved.
    • 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.
    • 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.
    • 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.
    • 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.
    • 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.
    • 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.
    • 課題 挑戦者数 達成者数 定形文の挿入 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 性能分析(計算・通信の内訳は? 性能分析 計算・通信の内訳は?) 計算・通信の内訳は?
    • 0 63 rank0 ずつ 64ずつ rank1 64 127 部分計算 rank2 128 191 rank3 192 255
    • n並列化時の書き方 • 「各プロセスが担当する処理」を書く。 – ×:全プロセスが実行する処理を書く • 各プロセスが全プロセス分の処理をやってしまうので間違い • n並列に一般化して書くには が のとき、 のとき、2のとき、・・・」という のとき、1のとき、 – 「rankが0のとき、 のとき、 のとき、・・・」という ベタな値の条件分岐が並んだソースコードは書かない • 128並列用のソースコードは書きたくないですよね? – ポイント:処理自体を、 処理自体を、rankを使って読み替えさせる 処理自体を、 を使って読み替えさせる
    • 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