Parallel Programming in MPI part 1

Slides:



Advertisements
Similar presentations
Windows HPC 講習会 2009/9/25 Windows HPC コンソーシアム 1 - MS-MPIプログラミング演習 - 同志社大学生命医科学部 廣安 知之 同志社大学工学研究科 中尾 昌広.
Advertisements

情報の科学的 な理解( 3 ) 情報科教育法 9 回目 2005/6/11 太田 剛. 目次 1. ネットワーク ( 続き ) 2. アプリケーションとフリーソフト 3. 課題 A( フォートポリオ )
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
だい六か – クリスマスとお正月 ぶんぽう. て form review ► Group 1 Verbs ► Have two or more ひらがな in the verb stem AND ► The final sound of the verb stem is from the い row.
て -form - Making て -form from ます -form -. With て -form, You can say... ~てもいいですか? (= May I do…) ~てください。 (= Please do…) ~ています。 (= am/is/are doing…) Connecting.
第 5 章 2 次元モデル Chapter 5 2-dimensional model. Contents 1.2 次元モデル 2-dimensional model 2. 弱形式 Weak form 3.FEM 近似 FEM approximation 4. まとめ Summary.
Essay writing rules for Japanese!!. * First ・ There are two directions you can write. ・よこがき / 横書き (same as we write English) ・たてがき / 縦書き (from right to.
VE 01 え form What is え form? え? You can do that many things with え form?
11 January 17, Sample answer of the last week's report. (1) 2 #include #include "mpi.h" int main(int argc, char *argv[]) { int i,r, myid, procs,*result;
SS2-15:A Study on Image Recognition and Understanding
クラスタの構成技術と クラスタによる並列処理
Parallel Programming in MPI part 2
実習用サーバの利用開始手順 (Windowsの場合) TeraTerm Proをインストール 公開鍵をメールで送付
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
All Rights Reserved, Copyright (C) Donovan School of English
英語勉強会.
第1回レポートの課題 6月15日出題 今回の課題は1問のみ 第2回レポートと併せて本科目の単位を認定 第2回は7月に出題予定
Chapter 11 Queues 行列.
日本語... ジェパディー! This is a template for you to use in your classroom.
Bellwork: English meaning? 1)はじめまして 2)どうぞ 3)すみません 4)おはようございます 5)しゅくだい
今しましょう Translate the story on the next slide. せんせいは しゅくだいを みます。
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
Chris Burgess (1号館1308研究室、内線164)
What did you do, mate? Plain-Past
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
OSI7層の各層の1)名称 2)機能の簡単な説明 3)各階層に関連のあ る機器、規格などを5つ以上書いて下さい。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Tohoku University Kyo Tsukada
Network Programming in C ネットワークプログラミング Lecture 8, Network Programming (3) 第8回「ネットワークとプログラミング(3)」 2010年秋学期 Rodney Van Meter.
十年生の 日本語 Year 10 Writing Portfolio
Licensing information
Chapter 4 Quiz #2 Verbs Particles を、に、で
Provisioning on Multiple Network(NIC) env
“You Should Go To Kyoto”
ストップウォッチの カード ストップウォッチの カード
Parallel Programming in MPI part 1
情報の科学的 な理解(2) 情報科教育法 8回目 2005/6/4 太田 剛.
Session 8: How can you present your research?
Parallel Programming in MPI part 3
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
ネットワークプログラミング 第4回「C言語の基礎~ポインタと配列」
Causative Verbs Extensively borrowed from Rubin, J “Gone Fishin’”, Power Japanese (1992: Kodansha:Tokyo) Created by K McMahon.
Parallel Programming in MPI part 2
-Get test signed and make corrections
デバッガ dbx の使い方.
ネットワークプログラミング 第3回「C言語の基礎~コマンドライン引数・構造体・ポインタ」
Term paper, Report (1st, first)
Where is Wumpus Propositional logic (cont…) Reasoning where is wumpus
MPIを使った加算  齋藤グループ 小林直樹
UNIX演習 情報ネットワーク特論.
2019/4/22 Warm-up ※Warm-up 1~3には、小学校外国語活動「アルファベットを探そう」(H26年度、神埼小学校におけるSTの授業実践)で、5年生が撮影した写真を使用しています(授業者より使用許諾済)。
Term paper, report (2nd, final)
第1回レポートの課題 6月24日出題 今回の課題は1問のみ 第2回レポートと併せて本科目の単位を認定 第2回は7月に出題予定
UNIX演習 情報ネットワーク特論資料.
UNIX演習 情報ネットワーク特論資料.
UNIX演習 情報ネットワーク特論資料.
アルゴリズムとプログラミング (Algorithms and Programming)
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
Created by L. Whittingham
Parallel Programming in MPI part 2
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Term paper, report (2nd, final)
ネットワーク・プログラミング TCPサーバ.
ネットワーク・プログラミング 1対多のプロセス間通信.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
ポートスキャン実習 2002年9月19日 修士1年 兼子 譲 牧之内研究室「インターネット実習」Webページ
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Presentation transcript:

Parallel Programming in MPI part 1 情報ネットワーク特論 南里 豪志 1

Preparation: Request for your account of the server もし、公開鍵暗号方式の鍵を作っていなければ、作成する If you haven't created a pair of keys of public key cryptosystem, create them. http://okaweb.ec.kyushu-u.ac.jp/lectures/in-ng/2014/pki-2014.pptx メールに「公開鍵」を添付し、本文に学籍番号と名前を書いて以下 に送付 Send a mail to the following address with your public key attached and your student ID and name are written in the body of it. nanri@cc.kyushu-u.ac.jp Your account information will be sent later.

「並列プログラミング実習」の目的 Purpose of “parallel programming tutorial” 「通信」 = 複数のプロセス間でのデータの送受信 “Communication” = Data transfer among multiple processes. 複数のプロセスが並行してそれぞれのプログラムを実行 Each of the processes executes its own program concurrently. これが並列処理   This is “parallel processing”. 並列処理には「並列プログラム」が必要 “Parallel program” is required for parallel processing Learn how to write “parallel programs”.

どうやって、プログラムに通信を記述するか? How to Describe Communications in a Program? TCP, UDP ? Good: - 多くのネットワークに実装されており,可搬性が高い. Portable: Available on many networks. Bad: - 接続やデータ転送の手続きが複雑 Protocols for connections and data-transfer are complicated. 記述可能だが,プロトコル関連の記述が必要。 Possible. But require additional descriptions for protocols.

MPI (Message Passing Interface) 並列計算向けに設計された通信関数群 A set of communication functions designed for parallel processing C, C++, Fortranのプログラムから呼び出し Can be called from C/C++/Fortran programs. "Message Passing" = Send + Receive 実際には,Send, Receive 以外にも多数の関数を利用可能. Actually, more functions other than Send and Receive are available. ともかく、プログラム例を見てみましょう Let's see a sample program, first.

#include <stdio.h> #include "mpi.h" int main(int argc, char *argv[]) { int myid, procs, ierr, i; double myval, val; MPI_Status status; FILE *fp; char s[64]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &procs); if (myid == 0) { fp = fopen("test.dat", "r"); fscanf(fp, "%lf", &myval); for (i = 1; i < procs; i++){ fscanf(fp, "%lf", &val); MPI_Send(&val, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); } fclose(fp); } else MPI_Recv(&myval, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); printf("PROCS: %d, MYID: %d, MYVAL: %e\n", procs, myid, myval); MPI_Finalize(); return 0; Setup MPI environment Get own ID (= rank) of the process Get total number of processes If my ID is 0 input data for this process and keep it in myval i = 1~procs-1 input data and keep it in val use MPI_Send to send value in val to process i processes with ID other than 0 use MPI_Recv to receive data from process 0 and keep it in myval print-out its own myval end of parallel computing 6 6

プログラム例の実行の流れ Flow of the sample program. 複数の"プロセス"が,自分の番号(ランク)に応じて実行 Multiple "Processes" execute the program according to their number (= rank). rank 0 rank 1 read data from a file myval rank 2 receive data from rank 0 receive data from rank 0 read data from a file val send val to rank 1 wait for the arrival of the data myval read data from a file val print myval wait for the arrival of the data send val to rank 2 myval print myval print myval 7 7 7

実行例 Sample of the Result of Execution 各プロセスがそれぞれ勝手に表示するので、表示の順番は毎回変 わる可能性がある。 The order of the output can be different, since each process proceeds execution independently. PROCS: 4 MYID: 1 MYVAL: 20.0000000000000000 PROCS: 4 MYID: 2 MYVAL: 30.0000000000000000 PROCS: 4 MYID: 0 MYVAL: 10.0000000000000000 PROCS: 4 MYID: 3 MYVAL: 40.0000000000000000 rank 1 rank 2 rank 0 rank 3

MPIインタフェースの特徴 Characteristics of MPI Interface MPI プログラムは,普通の C言語プログラム MPI programs are ordinal programs in C-language Not a new language 各プロセスが同じプログラムを実行する Every process execute the same program ランク(=プロセス番号)を使って,プロセス毎に違う仕事を実行 Each process executes its own work according to its rank(=process number) 他のプロセスの変数を直接見ることはできない。 A process cannot read or write variables on other process directly Rank 0 Read file myval Rank 1 Read file val Rank 2 Send Receive Receive myval Read file val Print myval Send myval Print myval Print myval 9

TCP, UDP vs MPI MPI:並列計算に特化したシンプルな通信インタフェースSimple interface dedicated for parallel computing SPMD(Single Program Multiple Data-stream) model 全プロセスが同じプログラムを実行 All processes execute the same program TCP, UDP: 各種サーバ等,様々な用途を想定した汎用的な通信イ ンタフェース Generic interface for various communications, such as internet servers Server/Client model 各プロセスが自分のプログラムを実行 Each process executes its own program.

TCP Client MPI TCP Server initialize initialize initialize #include <stdio.h> #include "mpi.h" int main(int argc, char *argv[]) { int myid, procs, ierr, i; double myval, val; MPI_Status status; FILE *fp; char s[64]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &procs); if (myid == 0) { fp = fopen("test.dat", "r"); fscanf(fp, "%lf", &myval); for (i = 1; i < procs; i++){ fscanf(fp, "%lf", &val); MPI_Send(&val, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); } fclose(fp); } else MPI_Recv(&myval, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); printf("PROCS: %d, MYID: %d, MYVAL: %e\n", procs, myid, myval); MPI_Finalize(); return 0; sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); memset(&echoServAddr, 0, sizeof(echoServAddr)); echoServAddr.sin_family = AF_INET; echoServAddr.sin_addr.s_addr = inet_addr(servIP); echoServAddr.sin_port = htons(echoServPort); connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)); echoStringLen = strlen(echoString); send(sock, echoString, echoStringLen, 0); totalBytesRcvd = 0; printf("Received: "); while (totalBytesRcvd < echoStringLen){ bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0); totalBytesRcvd += bytesRcvd; echoBuffer[bytesRcvd] = '\0' ; printf(echoBuffer); } printf("\n"); close(sock); initialize initialize TCP Server servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); memset(&echoServAddr, 0, sizeof(echoServAddr)); echoServAddr.sin_family = AF_INET; echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); echoServAddr.sin_port = htons(echoServPort); bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)); listen(servSock, MAXPENDING); for (;;){ clntLen = sizeof(echoClntAddr); clntSock = accept(servSock,(struct sockaddr *)&echoClntAddr, &clntLen); recvMsgSize = recv(clntSock, echoBuffer, RCVBUFSIZE, 0); while (recvMsgSize > 0){ send(clntSock, echoBuffer, recvMsgSize, 0); } close(clntSock); initialize

… MPIの位置づけ Layer of MPI … … ネットワークの違いを、MPIが隠ぺい Hide the differences of networks Applications MPI Sockets XTI … … TCP UDP … IP High-Speed Interconnect (InfiniBand, etc.) Ethernet driver, Ethernet card

MPIプログラムのコンパイル How to compile MPI programs Compile command: mpicc Example) mpicc -O3 test.c -o test optimization option O is not 0 source file to compile executable file to create

MPIプログラムの実行 How to execute MPI programs Number of Nodes (maximum: 4) Prepare a script file Submit the script file qsub test.sh Other commands qstat (= check status), qdel job_number (= cancel job) Maximum Execution Time Sample: #!/bin/sh #PBS -l nodes=2,walltime=00:01:00 #PBS -j oe #PBS -q p4 cd $PBS_O_WORKDIR /usr/local/bin/mpiexec -f $PBS_NODEFILE -np 8 ./test-mpi Store standard output and error in the same file. Name of Job Queue Commands to be Executed cd to the directory from where this job is submitted Run MPI program with specified number (ex: 8) of processes

Ex 0) MPIプログラムの実行 Execution of an MPI program まず、133.5.152.195 にログイン First of all, login to 133.5.152.195 Windows: Use Putty specify your private key MacOS X: Use ssh command from terminal

Ex 0) MPIプログラムの実行 Execution of an MPI program ログイン後、以下を実行しなさい。 After login, try the following commands. 時間に余裕があったら,プロセス数を変えたり, プログラムを書き換えたりしてみる. Try changing the number of processes, or modifying the source program. $ cp /tmp/test-mpi.c . $ cp /tmp/test.dat . $ cp /tmp/test.sh . $ cat test-mpi.c $ cat test.dat $ mpicc test-mpi.c –o test-mpi $ qsub test.sh wait for a while $ ls (check the name of the result file (test.sh.o????)) $ less test.sh.o????

MPIライブラリ MPI Library MPI関数の実体は,MPIライブラリに格納されている The bodies of MPI functions are in "MPI Library". mpicc が自動的に MPIライブラリをプログラムに結合する mpicc links the library to the program mpicc main() { MPI_Init(...); ... MPI_Comm_rank(...); MPI_Send(...); ... } compile link Executable file MPI_Init MPI_Comm_rank ... MPI Library source program

MPIプログラムの基本構造 Basic Structure of MPI Programs Crucial lines #include <stdio.h> #include "mpi.h" int main(int argc, char *argv[]) { ... MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &procs); MPI_Send(&val, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); MPI_Recv(&myval, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); MPI_Finalize(); return 0; } header file "mpi.h" Function for start-up You can call MPI functions in this area Functions for finish

今日の MPI関数 MPI Functions Today MPI_Init Initialization MPI_Finalize Finalization MPI_Comm_size Get number of processes MPI_Comm_rank Get rank (= Process number) of this process MPI_Send & MPI_Recv Message Passing MPI_Bcast & MPI_Gather Collective Communication ( = Group Communication )

MPI_Init MPIの並列処理開始 Start parallel execution of in MPI 引数: Parameter: Usage: int MPI_Init(int *argc, char **argv); MPIの並列処理開始 Start parallel execution of in MPI プロセスの起動やプロセス間通信路の確立等。 Start processes and establish connections among them. 他のMPI関数を呼ぶ前に、 必ずこの関数を呼ぶ。 Most be called once before calling otherMPI functions 引数: Parameter: main関数の2つの引数へのポインタを渡す。 Specify pointers of both of the arguments of 'main' function. 各プロセス起動時に実行ファイル名やオプションを共有 するために参照。 Each process most share the name of the executable file, and the options given to the mpirun command. Example #include <stdio.h> #include "mpi.h" int main(int argc, char *argv[]) {   int myid, procs, ierr;   double myval, val; MPI_Status status;   MPI_Init(&argc, &argv);   MPI_Comm_rank(MPI_COMM_WORLD, &myid);   MPI_Comm_size(MPI_COMM_WORLD, &procs); ... 20 20

MPI_Finalize 並列処理の終了 Finishes paralles execution Usage: int MPI_Finalize(); 並列処理の終了 Finishes paralles execution このルーチン実行後はMPIルーチンを 呼び出せない MPI functions cannot be called after this function. プログラム終了前に全プロセスで必ずこのルーチンを実行させる。 Every process needs to call this function before exitting the program. Example main() { ...   MPI_Finalize(); } 21 21

MPI_Comm_rank Usage: int MPI_Comm_rank(MPI_Comm comm, int *rank); そのプロセスのランクを取得する Get the rank(= process number) of the process 2番目の引数に格納 Returned in the second argument 最初の引数 = “コミュニケータ” 1st argument = "communicator" プロセスのグループを表す識別子 An identifier for the group of processes 通常は,MPI_COMM_WORLD を指定 In most cases, just specify MPI_COMM_WORLD, here. MPI_COMM_WORLD: 実行に参加する全プロセスによるグループ a group that consists all of the processes in this execution プロセスを複数のグループに分けて、それぞれ別の仕事をさせることも可能 Processes can be devided into multiple groups and attached different jobs. Example ... MPI_Comm_rank(MPI_COMM_WORLD, &myid); 22 22

MPI_Comm_size プロセス数を取得する Get the number of processes 2番目の引数に格納される Usage: int MPI_Comm_size(MPI_Comm comm, int *size); プロセス数を取得する Get the number of processes 2番目の引数に格納される Example ... MPI_Comm_size(MPI_COMM_WORLD, &procs); ... 23 23

一対一通信 Message Passing 送信プロセスと受信プロセスの間で行われる通信 Communication between "sender" and "receiver" 送信関数と受信関数を,"適切"に呼び出す. Functions of Sending and Receiving most be called in a correct manner. "From" rank and "To" rank are correct Specified size of the data to be transferred is the same on both side Same "Tag" is specified on both side Rank 0 Rank 1 Receive From: Rank 0 Size: 10 Integer data Tag: 100 Send To: Rank 1 Size: 10 Integer data Tag: 100 Wait for the message

MPI_Send 送信内容 Information of the message to send Usage: int MPI_Send(void *b, int c, MPI_Datatype d,              int dest, int t, MPI_Comm comm); 送信内容 Information of the message to send start address of the data 開始アドレス, number of elements 要素数, data type データ型, rank of the destination 送信先, tag, communicator (= MPI_COMM_WORLD, in most cases) data types: tag: メッセージに付ける番号(整数) The number attached to each message 不特定のプロセスから届く通信を処理するタイプのプログラムで使用 Used in a kind of programs that handles anonymous messages. 通常は、0 を指定しておいて良い. Usually, you can specify 0. Example ...   MPI_Send(&val, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);   ... Integer MPI_INT Real(Single) MPI_FLOAT Real(Double) MPI_DOUBLE Character MPI_CHAR 25 25

Example of MPI_Send 整数変数 d の値を送信(整数1個) Send the value of an integer variable 'd' 実数配列 mat の最初の要素から100番目の要素までを送信 Send first 100 elements of array 'mat' (with MPI_DOUBLE type) 整数配列 data の10番目の要素から50個を送信 Send elements of an integer array 'data' from 10th to 59th element MPI_Send(&d, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); MPI_Send(mat, 100, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); MPI_Send(&(data[10]), 50, MPI_INT, 1, 0, MPI_COMM_WORLD);

MPI_Recv Information of the message to receive Usage: int MPI_Recv(void *b, int c, MPI_Datatype d, int src, int t, MPI_Comm comm, MPI_Status *st); Information of the message to receive start address for storing data 受信データ格納用の開始アドレス, number of elements 要素数, data type データ型, rank of the source 送信元, tag (= 0, in most cases), communicator (= MPI_COMM_WORLD, in most cases), status status: メッセージの情報を格納する整数配列 An integer array for storing the information of arrived message 送信元ランクやタグの値を参照可能(通常は、あまり使わない) Consists the information about the source rank and the tag. ( Not be used in most case ) Example ...     MPI_Recv(&myval, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD &status); ... 27 27

集団通信 Collective Communications グループ内の全プロセスで行う通信 Communications among all of the processes in the group Examples) MPI_Bcast copy a data to other processes MPI_Gather Gather data from other processes to an array MPI_Reduce Apply a 'Reduction' operation to the distributed data to produce one array Rank 0 Rank 1 Rank 2 3 1 8 2 3 1 8 2 3 1 8 2 Rank 0 Rank 1 Rank 2 7 5 9 7 5 9 Rank 0 Rank 1 Rank 2 1 2 3 4 5 6 7 8 9 12 15 18

MPI_Bcast Usage: int MPI_Bcast(void *b, int c, MPI_Datatype d, int root, MPI_Comm comm); あるプロセスのデータを全プロセスにコピー copy a data on a process to all of the processes Parameters: start address, number of elements, data type, root rank, communicator root rank: コピー元のデータを所有するプロセスのランク rank of the process that has the original data Example:   MPI_Bcast(a, 3, MPI_DOUBLE, 0, MPI_COMM_WORLD); Rank 0 Rank 1 Rank 2 Rank 3 a a a a 29 29

MPI_Gather Usage: int MPI_Gather(void *sb, int sc MPI_Datatype st, void *rb, int rc, MPI_Datatype rt, int root, MPI_Comm comm); 全プロセスからデータを集めて一つの配列を構成 Gather data from other processes to construct an array Parameters: send data: start address, number of elements, data type, receive data: start address, number of elements, data type, (means only on the root rank) root rank, communicator root rank: 結果の配列を格納するプロセスのランク rank of the process that stores the result array Example:  MPI_Gather(a, 3, MPI_DOUBLE, b, 3, MPI_DOUBLE, 0, MPI_COMM_WORLD); Rank 0 Rank 1 Rank 2 Rank 3 a a a a b 30 30

集団通信の利用に当たって Usage of Collective Communications 同じ関数を全プロセスが実行するよう、記述する。 Every process must call the same function 例えば MPI_Bcastは,root rankだけでなく全プロセスで実行 For example, MPI_Bcast must be called not only by the root rank but also all of the other ranks 送信データと受信データの場所を別々に指定するタイプの集団通信で は、送信データの範囲と受信データの範囲が重ならないように指定す る。 On functions that require information of both send and receive, the specified ranges of the addresses for sending and receiving cannot be overlapped. MPI_Gather, MPI_Allgather, MPI_Gatherv, MPI_Allgatherv, MPI_Recude, MPI_Allreduce, MPI_Alltoall, MPI_Alltoallv, etc. 31 31

まとめ Summary MPIでは、一つのプログラムを複数のプロセスが実行する On MPI, multiple processes run the same program 各プロセスには、そのランク(番号)に応じて仕事を割り当てる Jobs are attached according to the rank(the number) of each process 各プロセスはそれぞれ自分だけの記憶空間で動作する Each process runs on its own memory space 他のプロセスが持っているデータを参照するには、通信する Accesses to the data on other processes can be made only by explicit communication among processes MPI functions MPI_Init, MPI_Finalize, MPI_Comm_rank MPI_Send, MPI_Recv MPI_Bcast, MPI_Gather

References MPI Forum http://www.mpi-forum.org/ specification of "MPI standard" MPI仕様(日本語訳) http://phase.hpcc.jp/phase/mpi-j/ml/ 理化学研究所の講習会資料 http://accc.riken.jp/HPC/training/mpi/mpi_all_2007-02-07.pdf 33 33

Ex 1) 乱数を表示するプログラム A program that displays random numbers 「各プロセスがそれぞれ自分のランクと整数乱数を一つ表示するプログ ラム」を作成しなさい。 Make a program in which each process displays its own rank with one integer random number Sample: #include <stdio.h> #include <stdlib.h> #include <sys/time.h> int main(int argc, char *argv[]) { int r; struct timeval tv; gettimeofday(&tv, NULL); srand(tv.tv_usec); r = rand(); printf("%d\n", r); }

Ex 1) (cont.) Example of the result of execution 1: 520391 0: 947896500 3: 1797525940 2: 565917780 4: 1618651506 5: 274032293 6: 1248787350 7: 828046128

Ex 1) Sample of the answer #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include "mpi.h" int main(int argc, char *argv[]) { int r, myid, procs; struct timeval tv; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &procs); gettimeofday(&tv, NULL); srand(tv.tv_usec); r = rand(); printf("%d: %d\n", myid, r); MPI_Finalize(); } 表示されるデータの順番がランクと一致しない The data is not printed out in the order of ranks.

課題: 順番をそろえて表示する Report: Display in order Ex 1) で作成したプログラムについて、以下の条件を満たすように修正 しなさい。  「ランク0からランクの順に、それぞれのプロセスで生成した乱数を表 示する。」 Modify the program in Ex1), so that: Messages are printed out in the order of the rank of each process Example of the result of the execution 0: 1524394631 1: 999094501 2: 941763604 3: 526956378 4: 152374643 5: 1138154117 6: 1926814754 7: 156004811

Hint 少なくとも 2つの方法が考えられる At least, two methods are possible. Method 1) (Easy) Gather the data to rank 0, first. Then, let rank 0 to print data in order. Method 2) (Little hard) Before rank i prints its data, receive a message from rank i-1 (i > 0) After rank i prints its data, send a message to rank i+1 (i<P-1) P is the total number of processes. ともかく、講義資料のプログラム例を実行し、各行の意味を理解しましょう。 First of all, try sample programs in this material and understand the meanings, line by line.