1. 程式人生 > >MPI_Isend與MPI_Irecv小例子

MPI_Isend與MPI_Irecv小例子

訪問本站觀看效果更佳
與MPI_Send與MPI_Recv不同,MPI_Isend與MPI_Irecv均為非阻塞式通訊。
函式原型:
MPI_Isend

int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,MPI_Comm comm, MPI_Request *request)

輸入引數:
buf:傳送緩衝區的首地址
count:需要傳送的位元組數
datatype:每個傳送元素的資料型別
dest:目標的rank(id)
tag:訊息標識(integer)
comm:通訊域
輸出引數:
request:communication request (handle)

MPI_Irecv

int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source,
int tag, MPI_Comm comm, MPI_Request *request)

輸出引數:
buf:接收緩衝區的首地址
count:接收緩衝區存放位元組數(integer)
datatype:每個接收元素的資料型別
source:傳送者的rank (integer)
tag:訊息標識(integer)
comm:通訊域
輸出引數:
request:communication request (handle)

request 返回的非阻塞通訊物件(用於TEST/WAIT使用)。
由於非阻塞通訊在呼叫後不用等待通訊完全結束就可以返回,所以非阻塞通訊的返回並不意味著通訊的完成。在返回後,使用者還需要檢測甚至等待通訊的完成。MPI提供了下面的函式來完成這些目的。

#include "mpi.h"
int main( int argc, char* argv[] ){
    int rank, nproc;
    int isbuf, irbuf, count;
    MPI_Request request;
    MPI_Status status;
    int TAG = 100;
 
    MPI_Init( &argc, &argv );
    MPI_Comm_size( MPI_COMM_WORLD, &nproc );
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );

    if(rank == 0) {
         isbuf = 9;
         MPI_Isend( &isbuf, 1, MPI_INT, 1, TAG, MPI_COMM_WORLD, &request );
    } else if(rank == 1) {
        MPI_Irecv( &irbuf, 1, MPI_INT, 0, TAG, MPI_COMM_WORLD, &request);
        MPI_Wait(&request, &status);
        MPI_Get_count(&status, MPI_INT, &count);
        printf( "irbuf = %d source = %d tag = %d count = %d\n", 
                   irbuf, status.MPI_SOURCE, status.MPI_TAG, count);
        }
    MPI_Finalize();
}