【问题标题】:(mpic++)MPI_Scatter producing wrong results (logical error)(mpic++)MPI_Scatter 产生错误结果(逻辑错误)
【发布时间】:2017-05-08 01:15:42
【问题描述】:

我想用这个最少的代码将一个 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 个进程和主体大小 = 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&lt;node&gt; bMPI_scatter 中传递的方式 其余代码工作正常,因为我在没有这两行的情况下进行了测试。如果这部分代码不是问题(我对此表示怀疑),那么我定义数据类型MPI_NODE 的方式是错误的,在这种情况下,我将编辑我的代码以显示该部分。

【问题讨论】:

    标签: c++ vector struct mpi


    【解决方案1】:

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

    你的代码可能还有更多问题,请学着写proper example code(不仅是最小的,也是完整和可验证的!)。

    【讨论】:

    • PC 正在被广播到每个级别,这不是将它“初始化”到每个级别吗?
    • 你还说我应该在MPI_scatter()中尝试b.resize(pC/size)而不是&amp;b
    • 哎呀,我忽略了广播 - 是的,那部分很好。你必须先b.resize(pC/sisze); 然后MPI_Scatter(.... b.data() ...);
    • 我刚刚在我的代码中的MPI_Bcast and MPI_scatter` 之间添加了b.resize(pC/size)。然后将 MPI_Scatter 更改为 `MPI_scatter(&bodies, pC/size,MPI_NODE, b.data(),pC/size,MPI_NODE,ROOT,MPI_COMM_WORLD)。现在发生错误,说明“没有对 node::node() 的匹配函数调用”
    • 不应该是b.resize(pC)吗?最后,它从size 等级中收集pC/size 元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多