(三)MPI中的阻塞式和非阻塞式

本文介绍了MPI中的阻塞式和非阻塞式通信。阻塞式通信会导致进程悬挂,直到通信完成。而非阻塞式通信允许进程在通信未完成时继续执行,提高了资源利用率并减少了潜在的死锁风险。文中通过示例程序解释了非阻塞式广播的使用,并强调了在非阻塞通信中确保数据有效性的关键步骤。非阻塞通信在处理大数据时能提升性能,建议在接收进程调用MPI_Irecv后再进行MPI_Isend。
摘要由CSDN通过智能技术生成

1.MPI阻塞式通信的一个例子

先看下面这段程序,可以看到每个进程都调用了两次MPI_Bcast(),其中第一次广播的数据为字符串HelloStr的长度,第二次广播的数据为HelloStr字符串本身。所以可以很容易地理解到,0号进程要向其他进程广播一个任意长度地字符串时,需要分为两步,第一次先向组中的其他进程广播字符串的长度,第二次广播字符串本身;其他进程在接收时,要先接收到从0号进程发送来的字符串长度,申请该长度的内存,然后接收字符串。

这里的MPI_Bcast()属于阻塞式广播。所谓阻塞,就是在调用返回结果之前,当前进程会一直阻塞在那里,即进程悬挂。所以阻塞式发送可以理解为,只有进程在确定消息完全发出去(发送到缓冲区)后才会继续执行下一条指令,在此之前会一直等待;阻塞式接受也可以理解为,当前进程在未接受到完整的消息时,会一直等待,直到接收结束才会继续执行。

#include <iostream> 
#include <mpi.h> 

int main(int argc, char* argv[]) 
{
    
	MPI_Init(&argc, &argv); 
	
	int RankID; 
	MPI_Comm_rank(MPI_COMM_WORLD, &RankID); 
	
	if (0 == RankID) 
	{
    
		char HelloStr[] = "Hello,Guys!"; 
		int StrLength = _countof(HelloStr); 
		std::cout << StrLength &
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值