我正在为 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
。不确定如何修复它并确保代码保持可扩展性。