MPI之点对点通信——阻塞式MPI_Send 和MPI_Recv

MPI的两种点对点通信方式

通信方式介绍

  • 从对通信过程的角度来看
    同步通信——发送和接收数据同时发生(类似打电话)
    异步通信——发送和接收数据非同时发生(类似发邮件)
  • 从函数调用的角度
    阻塞——在函数完成相应任务之前(收到相应信息),不返回
    非阻塞——在完成一下初始化等工作后就返回,不关心对方是否受到信息

MPI的点对点通信包括阻塞式

阻塞式通信 MPI_Send/MPI_Recv

MPI_Send不会返回,调用MPI_Send发送数据的进程会被阻塞,直到缓存为空
MPI_Recv不会返回,调用 MPI_Recv接收数据的进程会被阻塞,直到缓存被填充
在这里插入图片描述
a)进程1程序被挂起直到进程2执行到recv()的时候,send()将数据传给recv()后才返回。
b)进程2程序被挂起直到进程1执行到send()的时候,send()将数据传给recv()后才返回。

消息发送函数:MPI_Send

函数原型:

 int MPI_Send(		void *buf, //buf为消息的地址
 					int count,//count是内容的数量
 					 MPI_Datatype datatype, //datatype为消息内容的数据类型
 					 int goal, //goal为目标进程编号
 					 int tag, //tag为消息的标志
 					 MPI_Comm comm//comm为通信域
 			 )
  • 此函数将buf里的count个类型为datatype的数据发送到进程编号为goal的接收函数里,标志为goal,通信域通常为MPI_COMM_WORLD

消息接收函数——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是消息内容的数据类型,source为接收来源的进程编号,tag是消息的标志,comm是通信域,status是接收状态

tag必须与发送函数的tag一致,comm为接收函数与发送函数两者的进程所在的通信域,status是返回状态

假定q号进程调用了MPI_Send

 MPI Send(send buf p, send buf sz, send type, dest, send tag,send comm);

假定r号进程调用了MPI_Recv

 MPI Recv(recv buf p, recv buf sz, recv type, src, recv tag,recv comm, &status);

消息从进程q发送到进程r需要

. recv comm = send comm,
. recv tag = send tag,
. dest = r, and
. src = q.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值