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 << S