簡體   English   中英

MPI多次發送和接收

[英]MPI Send and Receive Multiple Times

我正在嘗試做一些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++;
}

您需要從等級0到其他等級的某種反饋。 在其他職級將他們的工作返回到0級之后,他們應該收到一條新消息,告訴他們他們的下一個工作或沒有更多的工作要完成。 隊伍應該繼續循環,直到沒有更多的工作要做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM