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.