Передача данных в цикле MPI - PullRequest
0 голосов
/ 30 июня 2018

После того, как я передал свой окончательный массив в ранге 0 всем остальным узлам. Затем следует вернуться к циклу, и все узлы имеют одинаковый массив. Но на самом деле я получил оригинальный массив вместо массива после трансляции. Я использую MPI, чтобы сделать это. Я уверен, как использовать цикл в MPI. У меня есть программа, похожая на эту. Во-первых, мне нужно иметь дело с некоторыми вычислениями с массивом в каждом узле. Затем найдите один массив среди нужных мне узлов, затем я повторяю шаг с начала и делаю это снова и снова. Может ли кто-нибудь помочь мне с этим или дать мне лучшие способы сделать это? Спасибо всем.

int main(int argc, char** argv) {

    //set array of long double to send
    long double array[4][4]{0}, compenergy=0;
    int size, rank;
    int i, j;
    int rank_lowest_energy, lowrank;
    MPI_Status status;

    struct {
        long double val;
        int rank;
    } energy, lowenergy;

    lowenergy.val = 0;

    MPI_Init(NULL, NULL);
    // Get the number of processes
    size = MPI::COMM_WORLD.Get_size();
    // Get the rank of the process
    rank = MPI::COMM_WORLD.Get_rank();

    for (int m = 0; m < 3; ++m)
    {
        //MPI::COMM_WORLD.Bcast(&array, 4*4, MPI::LONG_DOUBLE, 0);
        if (rank == 0) 
        {
            energy.val = 10000;
            energy.rank = rank;
        }
        else
        {
            for (i = 0; i < rank; ++i)
                array[rank][i] += rank;

            energy.val = rank + 10 - array[rank][0]- lowenergy.val;
            energy.rank = rank;
        }

        MPI_Allreduce(&energy, &lowenergy, 1, MPI_LONG_DOUBLE_INT, MPI_MINLOC, MPI_COMM_WORLD);
        if (rank == lowenergy.rank)
            MPI::COMM_WORLD.Send(&array, 4 * 4, MPI::LONG_DOUBLE, 0, 0);

        if (rank == 0) 
        {
            MPI::COMM_WORLD.Recv(&array, 4 * 4, MPI::LONG_DOUBLE, MPI::ANY_SOURCE, MPI::ANY_TAG);
            cout << "Its rank is: " << lowenergy.rank << "\n";
            cout<< "Its value is: "<<lowenergy.val<<"\n";
            for (i = 0; i < 4; ++i) 
            {
                for (j = 0; j < 4; ++j)
                    cout << array[i][j] << "  ";
                cout << "\n";
            }
            MPI::COMM_WORLD.Bcast(&lowenergy, 1, MPI::LONG_DOUBLE_INT, 0);
        }
        MPI::COMM_WORLD.Bcast(&array, 4*4, MPI::LONG_DOUBLE, 0);
    }

    MPI::Finalize();
}
...