(mpic ++)MPI_Scatter产生错误的结果(逻辑错误)

时间:2016-12-22 11:58:04

标签: c++ vector struct mpi

我希望使用这个最小代码在一个类型为struct的向量中分散许多元素

struct node
{
    scale2 P;
    scale2 V;
    float   M;
    //
   node(float M, float Px, float Py) // constructor
    :P(Px,Py)
    , V( 0.f, 0.f )
    , M(m)
   {}
};

主要功能

    int main(int argc, char **argv){
        std::vector<node> bodies;
        std::vector<node> b;
        int rank, size, ROOT =0;
        long int pC;


        MPI_Datatype MPI_NODE; 

        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);

        //creating data type that represents node
        //setup description of scale2 and float
        // define and commit structure type

        if(rank == ROOT){
           // initialise bodies
           pC = bodies.size();
           cout <<pC << " nodes" << endl;
        }
        MPI_Bcast(&pC, 1, MPI_LONG, ROOT, MPI_COMM_WORLD);

        MPI_Scatter(&bodies, pC/size, MPI_NODE, &b, pC/size, MPI_NODE, ROOT, MPI_COMM_WORLD);
        cout << "rank "<<rank<<" has " <<b.size()<<" values of bodies"<<endl;

        //other stuff
        MPI_Finalize();
        return 0;
    }

我正在寻找的输出(4个进程和body的大小= 64)是

rank 0 has 16 values of bodies
rank 1 has 16 values of bodies
rank 2 has 16 values of bodies
rank 3 has 16 values of bodies

我得到的输出

rank 0 has 64 values of bodies
rank 2 has 2818 values of bodies
rank 1 has 0 values of bodies
rank 3 has 11311978710794943764 values of bodies

我确定问题出现在MPI_Scatter行或其下方的行中,即以错误的方式输出b.size()的方式。我的问题也可能是vector<node> bMPI_scatter中传递的方式。其余的代码工作正常,因为我测试了没有这两行。如果代码的这一部分不是问题(我怀疑它),那么我定义数据类型MPI_NODE的方式是错误的,在这种情况下我将编辑我的代码以显示该部分。

1 个答案:

答案 0 :(得分:0)

使用C ++,您不能简单地使用std::vector的地址,而必须使用.data()。您还必须在recvbuf中预留足够的空间,这意味着您必须手动b.resize(pC)

您的代码中可能存在更多问题,请学习编写proper example code(不仅仅是最小的,也是完整且可验证的!)。