ソース 5.2.1 1対1ノンブロッキング通信
ノンブロッキング受信 - C |
---|
プログラム |
#include <stdio.h> #include <mpi.h> #include <unistd.h> // UNIX/GNU でないと使えません #define NUMOF(array) (sizeof (array) / sizeof *(array)) #define STRLEN(literal) (NUMOF(literal) - 1) enum TAG_KIND // 通信タグ { TAG_HELLO, // Hello 文字列通信タグ }; enum RANK_KIND // ランク { RANK_SENDER, // 送信側のランク RANK_RECVER, // 受信側のランク }; // 送信 void Send() { char hello[] = "Hello, host1. This is host0 sending."; sleep(1); // わざと送信を1秒遅らせます MPI_Send(hello, STRLEN(hello), MPI_CHAR, RANK_RECVER, TAG_HELLO, MPI_COMM_WORLD); } // 受信 void Recv() { char hello[64]; int recvCount; MPI_Status status; MPI_Request req; MPI_Irecv(hello, STRLEN(hello), MPI_CHAR, RANK_SENDER, TAG_HELLO, MPI_COMM_WORLD, &req); puts("Now receiving..."); MPI_Wait(&req, &status); // 受信が完了するのを待ちます puts("Receiving Complete!"); MPI_Get_count(&status, MPI_CHAR, &recvCount); hello[recvCount] = '\0'; printf("Received bytes : %d\n", recvCount); printf("Received text : %s\n", hello); } int main(int argc, char** argv) { int rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); switch(rank) { case RANK_SENDER: Send(); break; case RANK_RECVER: Recv(); break; } MPI_Finalize(); printf("Exit : %d\n", rank); } |
実行結果例 |
Now receiving... (ここで表示が1秒止まる) Exit : 0 Receiving Complete! Received bytes : 37 Received text : Hello, host1. This is host0 sending. Exit : 1 |
ノンブロッキング送信 - FORTRAN77 |
プログラム1 params.h |
Include 'mpif.h' C Hello 文字列通信タグ Integer TAG_HELLO Parameter (TAG_HELLO = 0) C 受信バッファサイズ Integer BUF_SIZE Parameter (BUF_SIZE = 64) C 送信側のランク Integer RANK_SENDER Parameter (RANK_SENDER = 0) C 受信側のランク Integer RANK_RECVER Parameter (RANK_RECVER = 1) |
プログラム2 |
C 送信 Subroutine Send Implicit None Include 'params.h' Integer err Character hello*37/'Hello, host1. This is host0 sending.'/ Integer req C 同期モードで送信します Call MPI_Issend(hello, Len(hello), MPI_CHARACTER, RANK_RECVER, * TAG_HELLO, MPI_COMM_WORLD, req, err) Write(*, *) 'Now sending...' C 送信が終了するのを待ちます Call MPI_Wait(req, MPI_STATUS_IGNORE, err) Write(*, *) 'Sending Complete!' Return End C 受信 Subroutine Recv Implicit None Include 'params.h' Integer err Character hello(BUF_SIZE) Integer status(MPI_STATUS_SIZE) Integer recvCount Integer i C わざと受信を1秒遅らせます Call Sleep(1) Call MPI_Recv(hello, BUF_SIZE, MPI_CHARACTER, RANK_SENDER, * TAG_HELLO, MPI_COMM_WORLD, status, err) Call MPI_Get_count(status, MPI_CHARACTER, recvCount, err) Write(*, *) 'Received bytes : ', recvCount Write(*, *) 'Received text : ', (hello(i), i = 1, recvCount) Return End Program TestLAM Implicit None Include 'params.h' Integer err Integer rank Call MPI_Init(err) Call MPI_Comm_rank(MPI_COMM_WORLD, rank, err) If(rank .eq. RANK_SENDER) Then Call Send Else If(rank .eq. RANK_RECVER) Then Call Recv EndIf Call MPI_Finalize(err) Write(*, *) 'Exit : ', rank Stop End |
実行結果例 |
Now sending... (ここで表示が1秒止まる) Sending Complete! Received bytes : 37 Received text : Hello, host1. This is host0 sending. Exit : 0 Exit : 1 |
ノンブロッキング終了確認 - C++ |
プログラム |
#include <iostream> #include <mpi++.h> #include <unistd.h> // UNIX/GNU でないと使えません #define NUMOF(array) (sizeof (array) / sizeof *(array)) #define STRLEN(literal) (NUMOF(literal) - 1) enum TAG_KIND // 通信タグ { TAG_HELLO, // Hello 文字列通信タグ }; enum RANK_KIND // ランク { RANK_SENDER, // 送信側のランク RANK_RECVER, // 受信側のランク }; using namespace std; // 送信 void Send() { const char hello[] = "Hello, host1. This is host0 sending."; MPI::Request req; // 同期モードで送信します req = MPI::COMM_WORLD.Issend( hello, STRLEN(hello), MPI::CHAR, RANK_RECVER, TAG_HELLO); cout << "Now sending..." << endl; while(!req.Test()) // 送信が終了したか確認します { cout << " Waiting..." << endl; sleep(1); // 1秒待ってから次の確認を行います } cout << "Sending complete!" << endl; } // 受信 void Recv() { char hello[64]; int recvCount; MPI::Status status; sleep(5); // わざと5秒受信を遅らせます MPI::COMM_WORLD.Recv( hello, STRLEN(hello), MPI::CHAR, RANK_SENDER, TAG_HELLO, status); recvCount = status.Get_count(MPI::CHAR); hello[recvCount] = '\0'; cout << "Received count : " << recvCount << endl; cout << "Received text : " << hello << endl; } int main(int argc, char** argv) { MPI::Init(argc, argv); int rank = MPI::COMM_WORLD.Get_rank(); switch(rank) { case RANK_SENDER: Send(); break; case RANK_RECVER: Recv(); break; } MPI::Finalize(); cout << "Exit : " << rank << endl; } |
実行結果例 |
Now sending... Wait... (ここで表示が1秒止まる) Wait... (ここで表示が1秒止まる) Wait... (ここで表示が1秒止まる) Wait... (ここで表示が1秒止まる) Wait... (ここで表示が約1秒止まる) Received count : 37 Received text : Hello, host1. This is host0 sending. Exit : 1 Sending complete! Exit : 0 |
Last update was done on 2002.11.14