MPI之MPI_Send&MPI_Recv阻塞接口及参数详解

MPI简介以及阻塞非阻塞代码示例

函数原型:

MPI_Send

int MPI_Send(void *buf, int count, MPI_Datatype datatype, 
int dest, int tag, MPI_Comm comm)
  • buf:指向发送缓冲区的指针;
  • count:发出的消息的数量(例如,整数个数、字节数等);
  • datatype:发出消息的数据类型。MPI 数据类型通常是针对特定的数据结构(如 char、int、float 等)定义的,它仅能在使用相同 MPI_Datatype 的进程间传递数据;
  • dest:目标进程的标识符(MPI_Comm 值)。该参数用于指定消息的目标进程,它必须等于 MPI_Init 时返回的进程 ID,或者是调用 MPI_Comm_rank 函数返回的值。
  • tag:消息标记,用于识别消息。每个消息都有一个唯一的标记,接收方可以使用它来过滤出要接收的消息,如果数据发送时指定的tag和数据接受时指定的tag不一致,数据将无法接收
  • comm:MPI 通信器,用于指定通信域。该参数定义了进程组,这些进程可以相互通信;

返回值:函数执行成功,返回 MPI_SUCCESS。如果发生错误,则返回相应的错误码。

MPI_Recv

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, 
int tag, MPI_Comm comm, MPI_Status *status)
  • buf:接收缓冲区的指针,用于接收从另一个进程中到来的数据。
  • count:接收数据的数量(例如,整数个数、字节数等);
  • datatype:接收数据的数据类型。MPI 数据类型通常是针对特定的数据结构(如 char、int、float 等)定义的,它仅能在使用相同 MPI_Datatype 的进程间传递数据;
  • source:发送消息的源进程的标识符。该参数用于指定发送消息的源进程,它必须等于 MPI_Init 时返回的进程 ID,或者是调用 MPI_Comm_rank 函数返回的值。如果该值等于 MPI_ANY_SOURCE,则表示从任何进程接收消息;
  • tag:消息标记,用于识别消息。每个消息都有一个唯一的标记,接收方可以使用它来过滤出要接收的消息。如果该值等于 MPI_ANY_TAG,则表示接收任何标记的消息;
  • comm:MPI 通信器,用于指定通信域。该参数定义了进程组,这些进程可以相互通信。
  • status:包含接收到的消息的状态信息,包括消息的源、标记和错误信息等。如果不需要这些状态信息,可以传递 MPI_STATUS_IGNORE。

返回值:函数执行成功,返回 MPI_SUCCESS。如果发生错误,则返回相应的错误码。
MPI_Recv 函数是 MPI 标准中的一个阻塞函数,它将一直阻塞直到接收到来自指定源和标记的消息。

代码示例:

//0号进程给1号进程发送数据
#include "mpi.h"
#include 
#include 


int main(int argc, char *argv[])
{
    int err = MPI_Init(&argc,&argv);
    int rank,size;
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if(0 == rank)
    {
        int sendNum = 99;
        //这里指定消息的标签为0   目标进程的标识符为1
        int tag = 0;
        int dest = 1;
        MPI_Send(&sendNum, 1 ,MPI_INT ,dest , tag , MPI_COMM_WORLD);
    }
    else
    {
        int recvNum = 0;
        //这里指定接收的消息的标签为0   消息源的进程的标识符为1
        //如果这里tag 不等于0,将无法接收到发送进程来的消息
        //如果指定tag为MPI_ANY_TAG,将可以接受源进程发送的任意标签的消息
        //
        int tag = 0;
        int source = 1;
        MPI_Status status;
        std::cout << "before recv , recv num = " << recvNum << std::endl;
        MPI_Recv(&recvNum, 1 ,MPI_INT , source, tag, MPI_COMM_WORLD, &status);
        std::cout << "before recv , recv num = " << recvNum << std::endl;
    }
    
    err = MPI_Finalize();
    return 0;
}

你可能感兴趣的:(并行计算,MPI,并行计算,阻塞接口,MPI_Send,MPI_Recv)