1. 程式人生 > >MPI_Send與MPI_Recv小例子

MPI_Send與MPI_Recv小例子

訪問本站觀看效果更佳
函式原型
MPI_Send

int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)

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

MPI_Recv

 int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag,MPI_Comm comm, MPI_Status *status)

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

先將字串拷貝到傳送緩衝區message中,然後呼叫MPI_Send語句將它發出,用strlen(message)指定訊息的長度,用MPI_CHAR指定訊息的資料型別1,指明發往程序1, 使用的訊息標識是99 ,MPI_COMM_WORLD是包含本程序程序0 和接收訊息的程序程序1 的通訊域,傳送方和接收方必須在同一個通訊域中,由通訊域來統一協調和控制訊息的傳送和接收。
程序1直接執行接收訊息的操作,這裡它使用message作為接收緩衝區,由此可見,對於同一個變數在傳送程序和接收程序中的作用是不同的,它指定接收訊息的最大長度為20 ,訊息的資料型別為MPI_CHAR字元型,接收的訊息來自程序0 ,而接收訊息攜帶的標識必須為99,使用的通訊域也是MPI_COMM_WORLD, 接收完成後的各種狀態資訊存放在status中,接收完成後它直接將接收到的字串列印在螢幕上。

#include"mpi.h"
int main(int argc,char *argv[])
{
       char message[20]="";
       int myrank;
       MPI_Status status;
       MPI_Init(&argc,&argv);
       MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
       if(myrank==0)
       {
              strcpy(message,"Hello,process 1");
              MPI_Send(message,strlen(message),MPI_CHAR,1,99,MPI_COMM_WORLD);
       }
       else if(myrank==1)
       {
              MPI_Recv(message,20,MPI_CHAR,0,99,MPI_COMM_WORLD,&status);
              printf("received:%s/n",message);
       }
       MPI_Finalize();            
       return 0;
}