MPI简单记录:

1 篇文章 0 订阅
本文介绍了一个使用MPI进行进程间通信的示例程序,详细解释了如何通过MPI_Init、MPI_Comm_rank、MPI_Send和MPI_Recv等函数,实现从进程0向进程1发送整数16,并在进程1中接收并打印的过程。
摘要由CSDN通过智能技术生成
#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:通信域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值