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。如果发生错误,则返回相应的错误码。文章来源:https://www.toymoban.com/news/detail-681415.html
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 标准中的一个阻塞函数,它将一直阻塞直到接收到来自指定源和标记的消息。文章来源地址https://www.toymoban.com/news/detail-681415.html
代码示例:
//0号进程给1号进程发送数据
#include "mpi.h"
#include <unistd.h>
#include <iostream>
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阻塞接口及参数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!