#include <iostream>
#include <mpi.h>
int main(int argc, char* argv[])
{
// 初始化MPI环境
MPI_Init(&argc, &argv);
int RankID;
// 获取当前进程在通信器MPI_COMM_WORLD中的进程号
MPI_Comm_rank(MPI_COMM_WORLD, &RankID);
//获取本进程id
// MPI_Comm_rank(MPI_COMM_WORLD, &iID);
//获取总进程数
// MPI_Comm_size(MPI_COMM_WORLD, &iTotalID);
if (0 == RankID)
{
int SendNum = 16;
MPI_Send(&SendNum, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
else if (1 == RankID)
{
int RecvNum = 0;
MPI_Recv(&RecvNum, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
std::cout << "Receive from rank 0: " << RecvNum << std::endl;
}
MPI_Finalize(); // 结束MPI环境
return 0;
}
该程序实现的功能是进程0向进程1发送一个整数16,进程1接收到并打印到窗口。
其中,
MPI_Init(&argc, &argv);:是MPI的初始化函数;
MPI_Comm_rank(MPI_COMM_WORLD, &RankID);:是获取该进程的ID编号,后面会用来判断该进程执行哪部分代码;
if (0 == RankID)…else… :这部分代码每个进程会也只会选择执行其中一个某一块,如进程0只会执行判断RankID0为true的部分代码,进程1只会执行判断RankID1为true的部分代码,该判断部分之外的代码是所有进程共有的代码,也就是全都会执行;
MPI_Send(&SendNum, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);:按参数的顺序:SendNum是要发送的数据,1是发送数据的数量,MPI_INT是数据的类型位int型,1 是接收端的进程编号,0是消息的标识符,MPI_COMM_WORLD是由所有进程组成的通信组,也就是通信子。
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(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:通信域