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