52
MPI MPIに並列計算 に並列計算 並列化とは 並列化例 2009/10/06 1 第三回並列化修得 第三回並列化修得 第三回並列化修得 第三回並列化修得 Copyright (C) 2009 HPC SYSTEMS, Inc. All rights reserved.

MPIによる並列計算

  • Upload
    hpc

  • View
    13.110

  • Download
    2

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: MPIによる並列計算

MPIMPIによる並列計算による並列計算

並列化とは

並列化例

2009/10/06 1第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All

rights reserved.

Page 2: MPIによる並列計算

目次目次

• 並列計算ってなんだろう

• 効果・メリット

• MPIで並列計算するには

• 基本的なMPIコードのリーディング

• 実習環境の使い方

2009/10/06 2第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 3: MPIによる並列計算

並列計算とは並列計算とは

• 部分問題に切り分けて、同時に複数実行する

小小小小P

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.3

Problem

小小小小P

小小小小P

小小小小P

Page 4: MPIによる並列計算

計算間の並列性計算間の並列性

• 並列性:

– 複数のCPUへ分担させて同時に実行しても正しい計算結果が得られること

=・・・・・・・・・・・・

・・・・・・・・・・・・ ・・・・

・・・・・・・・・・・・

・・・・・・・・・・・・ ・・・・

=・・・・・・・・・・・・・・・・ ・・・・

• たとえば行列積では:

– 結果の各要素の計算は全て同時に実行してOK

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.4

=・・・・・・・・

=・・・・・・・・・・・・

・・・・・・・・・・・・ ・・・・

同時実行可能!同時実行可能!同時実行可能!同時実行可能!同時実行可能!同時実行可能!同時実行可能!同時実行可能!

Page 5: MPIによる並列計算

並列計算のメリット並列計算のメリット

• さらなる高速化向上への道

–周波数向上が頭打ち→メニーコア化

– 「時間」を買える

• さらなる大規模化への道• さらなる大規模化への道

–シミュレーションの高精度化、大規模化

2009/10/06 5第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 6: MPIによる並列計算

並列化の効果並列化の効果

• 理想的にはCPUをつぎ込んだだけ速く計算できる

t

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.6

t

実際は通信がオーバーヘッドとなることが多い

Page 7: MPIによる並列計算

並列版の作り方並列版の作り方

• どんなモデル?

–並列実行モデル

–分散メモリアーキテクチャ

• 何をどのように書けばいい?• 何をどのように書けばいい?

– rankによる条件分岐

–通信処理

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.7

Page 8: MPIによる並列計算

並列計算の実際の流れ並列計算の実際の流れ

LAN

並列計算実行並列計算実行並列計算実行並列計算実行

アプリアプリアプリアプリ

アプリアプリアプリアプリ

アプリアプリアプリアプリ

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.8

LAN

ユーザユーザユーザユーザクラスタクラスタクラスタクラスタ

結果結果結果結果

同時に複数同時に複数同時に複数同時に複数CPUをををを使って計算使って計算使って計算使って計算

アプリアプリアプリアプリ

アプリアプリアプリアプリ

アプリアプリアプリアプリ

アプリアプリアプリアプリ

アプリアプリアプリアプリ

アプリアプリアプリアプリ

通通通通通通通通信信信信信信信信

Page 9: MPIによる並列計算

MPIMPIシステムの位置関係システムの位置関係

TCP/IP通信通信通信通信

プロセスプロセスプロセスプロセス0 プロセスプロセスプロセスプロセス1

Message

MPIシステムシステムシステムシステムTCP/IP通信通信通信通信

2009/10/06 9第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

MPIシステムシステムシステムシステム(ライブラリ)(ライブラリ)(ライブラリ)(ライブラリ)

Page 10: 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の和の和の和の和

Page 11: MPIによる並列計算

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.

Page 12: MPIによる並列計算

プログラミングする上で:プログラミングする上で:隣のメモリを直接読み書き可能隣のメモリを直接読み書き可能??

NO:分散メモリ(複数ノード)分散メモリ(複数ノード)分散メモリ(複数ノード)分散メモリ(複数ノード)

• 隣のプロセスがメモリ内容を変更したら新しい値を通信で授受する必要がある– 複数のメモリアドレス空間

YES:共有メモリ(マルチコア)共有メモリ(マルチコア)共有メモリ(マルチコア)共有メモリ(マルチコア)

• 隣のスレッドのメモリは自由に読み書き(load,store)できる– 単一のメモリアドレス空間– 複数のメモリアドレス空間

• 通信を考えるのは難しいが

事実多くのアプリの並列化に使用できている

• MPI, (Grid)RPC

– 単一のメモリアドレス空間

• 通信コードを書かずに済む– 敷居が低い

• OpenMP, Pthread

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.12

Page 13: MPIによる並列計算

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.

Page 14: MPIによる並列計算

通信処理の書き方通信処理の書き方

• メッセージ送信関数

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つをつをつをつをおさえればおさえればおさえればおさえれば書ける書ける書ける書ける

Page 15: MPIによる並列計算

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

Page 16: MPIによる並列計算

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

Page 17: MPIによる並列計算

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 コ ア をコ ア をコ ア をコ ア を使 っ て 動 か せ て い る か使 っ て 動 か せ て い る か使 っ て 動 か せ て い る か使 っ て 動 か せ て い る か ????

Page 18: MPIによる並列計算

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.

Page 19: MPIによる並列計算

基本基本MPIMPIコードコードリーディングリーディング

一対一通信を使った一対一通信を使った具体例「配列の総和」を深く理解しよう

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.19

Page 20: MPIによる並列計算

お話しすることお話しすること

• 配列の総和

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

Page 21: MPIによる並列計算

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へ送信へ送信へ送信へ送信へ送信へ送信へ送信へ送信

Page 22: MPIによる並列計算

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への送信

※※※※※※※※マスタワーカ型の場合マスタワーカ型の場合マスタワーカ型の場合マスタワーカ型の場合マスタワーカ型の場合マスタワーカ型の場合マスタワーカ型の場合マスタワーカ型の場合

Page 23: MPIによる並列計算

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…);

Page 24: MPIによる並列計算

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へ送信へ送信へ送信へ送信へ送信へ送信へ送信へ送信

Page 25: MPIによる並列計算

実習環境の使い方実習環境の使い方

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.25

Page 26: MPIによる並列計算

VNC: VNC: リモートデスクトップツールリモートデスクトップツール

VNCクライアントの起動

http://www.realvnc.com/

遠隔に遠隔に遠隔に遠隔に遠隔に遠隔に遠隔に遠隔にLinuxLinuxののののののののGUIGUIを使えるを使えるを使えるを使えるを使えるを使えるを使えるを使える2009/10/06 26

第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All rights reserved.

Page 27: MPIによる並列計算

コンパイル:コンパイル: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.

Page 28: MPIによる並列計算

実行:実行:mpirunmpirun

> mpirun –np 計算に使う計算に使う計算に使う計算に使うCPUコア総数コア総数コア総数コア総数 ./a.out

ソフトソフトソフトソフト

並列計算の依頼並列計算の依頼並列計算の依頼並列計算の依頼

2009/10/06 28第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

LAN

ユーザユーザユーザユーザクラスタクラスタクラスタクラスタ

結果結果結果結果

複数複数複数複数CPUを使ってを使ってを使ってを使って並列に計算並列に計算並列に計算並列に計算

Page 29: MPIによる並列計算

おまけ:おまけ: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.

Page 30: MPIによる並列計算

画像ビューア:画像ビューア:GQViewGQView

S

Slide show

2009/10/06 30第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 31: MPIによる並列計算

22次元熱伝導解析次元熱伝導解析アプリケーションの並列化アプリケーションの並列化アプリケーションの並列化アプリケーションの並列化

HPCシステムズ

新規事業企画室

312009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 32: MPIによる並列計算

2次元熱伝導シミュレーション2次元熱伝導シミュレーション

• 熱伝導とは...

–物質中の熱が伝わる様子をシミュレーション

–基本的な物理現象の一つ

–熱伝導方程式から数値的に解析可能–熱伝導方程式から数値的に解析可能

322009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 33: MPIによる並列計算

出典:大分大学工学部生産システム工学科出典:大分大学工学部生産システム工学科出典:大分大学工学部生産システム工学科出典:大分大学工学部生産システム工学科 三村泰成氏作成三村泰成氏作成三村泰成氏作成三村泰成氏作成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.

Page 34: MPIによる並列計算

逐次版熱伝導逐次版熱伝導シミュレーションプログラムシミュレーションプログラム

• ソース名 sfdm2d.c

• コンパイル

> icc sfdm2d.c -O0 -pg -o sfdm2d.exe

• 実行

> ./sfdm2d.exe

プロファイル取得プロファイル取得プロファイル取得プロファイル取得

342009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 35: MPIによる並列計算

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.

Page 36: MPIによる並列計算

差分法差分法差分法差分法差分法差分法差分法差分法((((((((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.

Page 37: MPIによる並列計算

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.

Page 38: MPIによる並列計算

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.

Page 39: MPIによる並列計算

並列化手順並列化手順

1. 定型句の挿入

2. 2並列化2. 2並列化

3. n並列化

392009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 40: MPIによる並列計算

定型句の挿入定型句の挿入

• ヘッダファイル挿入: 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.

Page 41: MPIによる並列計算

差分法の並列化(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.

Page 42: MPIによる並列計算

境界部分の計算境界部分の計算境界部分の計算境界部分の計算境界部分の計算境界部分の計算境界部分の計算境界部分の計算

RANK0 RANK1

nn

127 128 129126

持ってない!持ってない!持ってない!持ってない!

42

領域分割領域分割領域分割領域分割

ss

ww ee

2009/10/06第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.

All rights reserved.

Page 43: MPIによる並列計算

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

Page 44: MPIによる並列計算

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.

Page 45: MPIによる並列計算

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.

Page 46: MPIによる並列計算

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.

Page 47: MPIによる並列計算

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.

Page 48: MPIによる並列計算

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.

Page 49: MPIによる並列計算

課題課題課題課題 挑戦者数挑戦者数挑戦者数挑戦者数 達成者数達成者数達成者数達成者数

定形文の挿入定形文の挿入定形文の挿入定形文の挿入 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

性能分析性能分析性能分析性能分析(計算・通信の内訳は?計算・通信の内訳は?計算・通信の内訳は?計算・通信の内訳は?)

Page 50: MPIによる並列計算

rank0

rank164ずつずつずつずつ部分計算部分計算部分計算部分計算

0 63

64 127

rank2

rank3

191

255

128

192

Page 51: MPIによる並列計算

n並列化時の書き方

• 「各プロセスが担当する処理」を書く。

–×:全プロセスが実行する処理を書く

• 各プロセスが全プロセス分の処理をやってしまうので間違い

• n並列に一般化して書くには• n並列に一般化して書くには

– 「「「「rankがががが0のとき、のとき、のとき、のとき、1のとき、のとき、のとき、のとき、2のとき、・・・」というのとき、・・・」というのとき、・・・」というのとき、・・・」というベタな値の条件分岐が並んだソースコードは書かないベタな値の条件分岐が並んだソースコードは書かないベタな値の条件分岐が並んだソースコードは書かないベタな値の条件分岐が並んだソースコードは書かない

• 128並列用のソースコードは書きたくないですよね?

–ポイント:処理自体を、処理自体を、処理自体を、処理自体を、rankを使って読み替えさせるを使って読み替えさせるを使って読み替えさせるを使って読み替えさせる

Page 52: MPIによる並列計算

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