C++ MPI循环中的数据传递

C++ MPI循环中的数据传递,c++,arrays,loops,mpi,broadcast,C++,Arrays,Loops,Mpi,Broadcast,在我向所有其他节点广播秩为0的最终数组之后。然后它应该返回到循环,所有节点都具有相同的数组。但事实上,我得到的是原始阵列,而不是广播后的阵列。我正在使用MPI来做这件事。我确信如何在MPI中使用循环。我有一个类似的程序。首先,我需要对每个节点中的数组进行一些计算。然后在我需要的节点中找到一个数组,然后从头开始重复这个步骤,并一次又一次地重复。有人能帮我吗,或者给我更好的方法吗?谢谢大家 int main(int argc, char** argv) { //set array of l

在我向所有其他节点广播秩为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();
}
int main(int argc,char**argv){
//设置要发送的长双精度数组
长双数组[4][4]{0},compenergy=0;
整数大小、等级;
int i,j;
最低能量,低秩;
MPI_状态;
结构{
长双瓣;
整数秩;
}能量,低能量;
lowenergy.val=0;
MPI_Init(NULL,NULL);
//获取进程数
size=MPI::COMM_WORLD.Get_size();
//获取进程的等级
rank=MPI::COMM_WORLD.Get_rank();
对于(int m=0;m<3;++m)
{
//MPI::COMM_WORLD.Bcast(&array,4*4,MPI::LONG_DOUBLE,0);
如果(秩==0)
{
energy.val=10000;
能量等级=等级;
}
其他的
{
对于(i=0;i无法正确设置代码格式。您不应该广播
lowenergy
@ptb抱歉,我不明白您的意思。请您详细解释一下好吗?@GillesGouaillardet,如果我不广播lowenergy,我可以在开始新循环时获得值吗?格式已经更正。