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. 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. 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.
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. 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.
41. 差分法の並列化(2分割)
RANK0 担当 RANK1 担当
128格子 128格子
領域分割
第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06 41
All rights reserved.
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. 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. 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.
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. 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.
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