MPI中需要从多个slave进程接收数据数组到Master进程

问题描述 投票:0回答:0

我正在为 MPI 发送和接收而苦苦挣扎。我有 5 个从属进程,它们正在向根(主)进程发送一个包含 3 个数据的数组。 发送代码如下:

//slave processes
    else{
        std::cout << "Slave process Start" << std::endl;
        MPI_Recv(&a2, 6, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);                   
        std::cout << "Slave process End" << std::endl;
        // MPI_Wait(&request, &status);

        std::cout <<"The value Received from process:"<< pid<< " "<<a2[0] << " "<<a2[1] << " "<< a2[2] << " "<< a2[3] << " "<< a2[4] <<  " "<< a2[5] << std::endl;

        //calculate the partial sum
        double partial_sum[3]={0,0,0};
       
        for(int i=0; i< 4; i++){
            partial_sum[0]= partial_sum[0]+ a2[i];
        }
        partial_sum[0]= partial_sum[0]/4;
        partial_sum[1]= a2[4];
        partial_sum[2]= a2[5];

        //Send the partial sum to the root process  
        MPI_Isend(&partial_sum, 3, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request);
    


    }

根进程(master)收集这些数据,然后将它们放入矩阵中。 问题是我的主进程一次只能处理一个进程。我希望 master 中的接收器应该能够从所有进程中收集数组,然后将这些结果放入矩阵中。

// Master process collects the partial sum from other processes
        double tmp[3];
        MPI_Recv(&tmp, 3, MPI_DOUBLE, 1,0,MPI_COMM_WORLD, &status);// This is PROLBLEM AREA. 
        int index_i = (int)tmp[1];
        int index_k = (int)tmp[2];
        A[index_i][index_k]= tmp[0];

        std::cout << "The value of A[index_i][index_k] is = "<<index_i <<"  "<< index_k <<"  "<< A[index_i][index_k] << std::endl; 

如果不解决这个问题,我就无法进一步完成我的课堂作业。提前谢谢你的帮助。

如果我尝试使用

MPI_ANY_SOURCE
,我开始得到
data packing errors
。不确定如何修复它并确保代码保持可扩展性。

c++ mpi hpc
© www.soinside.com 2019 - 2024. All rights reserved.