MPI_Isend與MPI_Irecv小例子
阿新 • • 發佈:2018-11-08
訪問本站觀看效果更佳
與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(); }