【问题标题】:MPI Send and Receive Multiple TimesMPI 多次发送和接收
【发布时间】:2013-12-20 16:29:06
【问题描述】:

我正在尝试做一些 MPI 并行工作。我可以在任意数量的处理器上运行它。问题是每个处理器将执行一项工作,执行它并将其发送回去,然后程序就完成了。我希望能够在完成后向处理器发送另一项工作。我不确定如何实现这一点。基本上我正在尝试向每个核心发送 10 个工作。

if (myRank == 0) {
    int numCores = MPI::COMM_WORLD.Get_size();

    for (int rank = 1; rank < numCores; rank++) {
        MPI::COMM_WORLD.Send(&yarray[0], imax, MPI::DOUBLE, rank, 0);
        MPI::COMM_WORLD.Send(&tarray[0], imax, MPI::DOUBLE, rank, 0);

        MPI::COMM_WORLD.Recv(&ans, imax, MPI::DOUBLE, MPI::ANY_SOURCE, MPI_ANY_TAG, mystatus);
        answers[counter] = ans;
        counter++;
    }
}
else
{
    MPI::COMM_WORLD.Recv(&yarray1, imax, MPI::DOUBLE, MPI::ANY_SOURCE, MPI_ANY_TAG, mystatus);
    MPI::COMM_WORLD.Recv(&tarray1, imax, MPI::DOUBLE, MPI::ANY_SOURCE, MPI_ANY_TAG, mystatus);

    double floor = 0.5, ceiling = 3.5, range = (ceiling - floor);
    double rnd = floor + double((range * rand()) / (RAND_MAX + 1.0));

    yarray [0] = rnd;
    yarray1 [0] = rnd;

    double temp = 0;
    for (int k = 0; k < imax; k++) {
        tarray1[k+1] = tarray1[k] + h;
        yarray1[k+1] = yarray1[k] + h * (2 * yarray1[k] - 2 * tarray1[k] * tarray1[k] - 3);
    }
    temp = yarray1[int(imax)];

    //cout << "Rank = " << myRank << " Solution = " << temp << endl;

    MPI::COMM_WORLD.Send(&temp, 1, MPI::DOUBLE, 0, 0);

}

更新:在 myrank == 0 以内

while(counter != jobs){
    MPI::COMM_WORLD.Recv(&ans, imax, MPI::DOUBLE, MPI::ANY_SOURCE, MPI_ANY_TAG, mystatus);
        answers[counter] = ans;
        counter++;
}

【问题讨论】:

    标签: c++ parallel-processing mpi openmpi


    【解决方案1】:

    您需要从等级 0 到其他等级的某种反馈。在其他等级将他们的工作返回到等级 0 之后,他们应该会收到一条新消息,告诉他们他们的下一个工作或者没有更多工作要完成。排名应该继续循环,直到没有更多工作要做。

    【讨论】:

    • 那么我想在 myrank==0 中包含接收并发送新消息增加计数器的一段时间(计数器
    • 关闭。它更像是while(!more_work) 和排名 0 的 MPI_RECV,用于确定是否还有更多工作。
    • 在 if(myrank == 0) 内我有发送和接收。我想把接收放在 while(!more_work) 吗?我也不需要循环发送部分吗?
    猜你喜欢
    • 2015-08-16
    • 2013-04-15
    • 2018-03-12
    • 2016-06-15
    • 2012-03-13
    • 2011-07-04
    • 2016-10-03
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多