Parallel Programming in MPI part 1

Slides:



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

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;
クラスタの構成技術と クラスタによる並列処理
Parallel Programming in MPI part 2
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
All Rights Reserved, Copyright (C) Donovan School of English
英語勉強会.
STEP 2 ノート・テイキングのサンプル.
第1回レポートの課題 6月15日出題 今回の課題は1問のみ 第2回レポートと併せて本科目の単位を認定 第2回は7月に出題予定
クラスタコンピューティングの 並列環境と性能
システムプログラミング 第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.
How do you talk about Positions/ Locations?
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 を、に、で
The Sacred Deer of 奈良(なら)
“You Should Go To Kyoto”
VTA 02 What do you do on a weekend? しゅうまつ、何をしますか。
MPIによるプログラミング概要(その1) 【C言語編】
ストップウォッチの カード ストップウォッチの カード
Starter: Write the following dates in Mandarin
情報の科学的 な理解(2) 情報科教育法 8回目 2005/6/4 太田 剛.
Parallel Programming in MPI part 3
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
ネットワークプログラミング 第4回「C言語の基礎~ポインタと配列」
Parallel Programming in MPI part 2
-Get test signed and make corrections
データベース工学 生研 戦略情報融合研究センタ 喜連川 優.
デバッガ dbx の使い方.
ネットワークプログラミング 第3回「C言語の基礎~コマンドライン引数・構造体・ポインタ」
Term paper, Report (1st, first)
第7回 プログラミングⅡ 第7回
Where is Wumpus Propositional logic (cont…) Reasoning where is wumpus
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
Parallel Programming in MPI part 1
MPIを使った加算  齋藤グループ 小林直樹
進捗報告 金田憲二.
2019/4/22 Warm-up ※Warm-up 1~3には、小学校外国語活動「アルファベットを探そう」(H26年度、神埼小学校におけるSTの授業実践)で、5年生が撮影した写真を使用しています(授業者より使用許諾済)。
Term paper, report (2nd, final)
岡村耕二 TCP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
アルゴリズムとプログラミング (Algorithms and Programming)
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
Created by L. Whittingham
The Facilitative Cues in Learning Complex Recursive Structures
Parallel Programming in MPI part 2
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
ネットワーク・プログラミング TCPサーバ.
ネットワーク・プログラミング 1対多のプロセス間通信.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング マルチタスク.
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Presentation transcript:

Parallel Programming in MPI part 1 January 11, 2011 1

並列処理:複数の演算器で仕事を分担 Parallel Processing: Share a job among multiple processors Multi-Core / Multi-CPU PC 1台の計算機内 within one PC 小規模問題向け for small problems Cluster of PCs / Supercomputer 複数の計算機を相互接続 Interconnect computers 中規模~大規模問題向け  for middle- to large-scale problems 計算機間で通信が必要 Communication is required among computers

どうやって、プログラムに通信を記述するか? How to Describe Communications in a Program? TCP, UDP ? Good: - 多くのネットワークに実装されており,可搬性が高い. Portable: Available on many networks. Bad: - 接続やデータ転送の手続きが複雑 Protocols for connections and data-transfer are complicated. - 広域ネットワークを対象に設計されており,オーバーヘッドが大きい. High overhead, since they are designed for wide-area (= unreliable) networks. 記述可能だが,並列処理には適さない Possible. But not suitable for parallel processing.

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 process ID (= rank) 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 5 5

プログラム例の実行の流れ 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 6 6 6

実行例 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 8

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 & execute MPI programs Compile command: mpicc Example) mpicc -O3 test.c -o test.exe Execution command: mpirun Example) mpirun -np 8 ./test.exe optimization option O is not 0 source file to compile executable file to create number of processes executable file to execute

Ex 0) MPIプログラムの実行 Execution of an MPI program psihexaにログインして、以下を実行しなさい。 Login to psihexa, and try the following commands. 時間に余裕があったら,プロセス数を変えたり, プログラムを書き換えたりしてみる. Try changing the number of processes, or modifying the source program. $ cp /tmp/test-mpi.c . $ cat test-mpi.c $ mpicc test-mpi.c –o test-mpi $ mpirun -np 8 ./test-mpi

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); ... 17 17

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(); } 18 18

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

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); ... 20 20

一対一通信 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 22 22

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); ... 24 24

集団通信 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 26 26

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 27 27

集団通信の利用に当たって 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. 28 28

まとめ 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 30 30

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(); }

レポート課題: 順番をそろえて表示する 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