首页 > 解决方案 > 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);
        }

这样做的理由是什么?这是发送多个字符串的常用方法,还是应该序列化两个字符串并发送一条消息?

标签: c++mpi

解决方案


推荐阅读