c++ - C++:同一范围内的多个 MPI_Recv
问题描述
我已经实现了一个利用 MPI 在集群上传递消息的程序。但是,我在理解 MPI_Recv 函数的工作原理时遇到了一些麻烦。
下面的代码片段应该产生输出
First string: firstString
Second string: secondString
但是,输出偶尔会变成
First string: firstString
Second string: secondStringfirstString
编码:
if (rank == 1){
std::string firstString;
std::string secondString;
MPI_Status status1;
MPI_Probe(0,1,MPI_COMM_WORLD,&status1);
int count1;
MPI_Get_count(&status1,MPI_CHAR,&count1);
char firstBuf [count1];
MPI_Recv(&firstBuf,count1,MPI_CHAR,0,1,MPI_COMM_WORLD,&status1);
firstString = firstBuf;
MPI_Status status2;
int count2;
MPI_Probe(0,2,MPI_COMM_WORLD,&status2);
MPI_Get_count(&status2,MPI_CHAR,&count2);
char secBuf [count2];
MPI_Recv(&secBuf,count2,MPI_CHAR,0,2,MPI_COMM_WORLD,&status2);
secondString = secBuf;
std::cout << "First string: " << firstString << std::endl;
std::cout << "Second string: " << secondString << std::endl;
} else {
std::string firstString = "firstString";
std::string secondString = "secondString";
MPI_Send(&firstString[0],firstString.size(),MPI_CHAR,1,1,MPI_COMM_WORLD);
MPI_Send(&secondString[0],secondString.size(),MPI_CHAR,1,2,MPI_COMM_WORLD);
}
我想我可以通过包装一个或两个接收块来避免这种行为,以便第一个在执行第二个之前超出范围。以下代码段显示了工作代码:
if (rank == 1){
std::string firstString;
std::string secondString;
if (true){
MPI_Status status1;
MPI_Probe(0,1,MPI_COMM_WORLD,&status1);
int count1;
MPI_Get_count(&status1,MPI_CHAR,&count1);
char firstBuf [count1];
MPI_Recv(&firstBuf,count1,MPI_CHAR,0,1,MPI_COMM_WORLD,&status1);
firstString = firstBuf;
}
if (true){
MPI_Status status2;
int count2;
MPI_Probe(0,2,MPI_COMM_WORLD,&status2);
MPI_Get_count(&status2,MPI_CHAR,&count2);
char secBuf [count2];
MPI_Recv(&secBuf,count2,MPI_CHAR,0,2,MPI_COMM_WORLD,&status2);
firstString = firstBuf;
}
std::cout << "First string: " << firstString << std::endl;
std::cout << "Second string: " << secondString << std::endl;
} else {
std::string firstString = "firstString";
std::string secondString = "secondString";
MPI_Send(&firstString[0],firstString.size(),MPI_CHAR,1,1,MPI_COMM_WORLD);
MPI_Send(&secondString[0],secondString.size(),MPI_CHAR,1,2,MPI_COMM_WORLD);
}
这样做的理由是什么?这是发送多个字符串的常用方法,还是应该序列化两个字符串并发送一条消息?