我正在尝试使用MPI_Gather收集一组结构。我通过使用MPI_Type_contiguous(每个元素是一个double)创建了一个结构“Final”的派生数据类型“mystruct”。然后我在一个简单的MPI_Send和MPI_Receive中使用这个派生数据类型来检查它是否正确并且它可以工作。现在,我想使用MPI_Gather来收集整个结构数组,每个结构数组都有派生数据类型“mystruct”。
使用Send和Recv,我知道MPI_Type_contiguous部分是正确的。在MPI_Gather之后,MASTER只会在应该从子进程收集信息的位置打印出元素的零。
typedef struct{
double Angle;
double E_ODD;
double OD_KE;
double OD_L;
double D_E;
}Final;
int main(int argc, char** argv)
{
ierr = MPI_Init(&argc,&argv);
ierr = MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
ierr = MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
int totalnum_trajectories = file_size/9 //File that has xyz cartesian
//coordinates for three atoms
int localnum_trajectories = totalnum_trajectories/numprocs;
Final worker_results[localnum_trajectory];
//Each processor does some analysis for its local number of trajectories
//and results go into worker_results buffer for each trajectory.
//Create a datatype for the nth worker_results[n] struct
MPI_Datatype mystruct;
MPI_Type_contiguous(5,MPI_DOUBLE,&mystruct);
MPI_Type_commit(&mystruct);
//MASTER buffer: should get all local struct arrays from
//children processors to one larger array of structs, equaling
//the total number of trajectories
Final master_results[totalnum_trajectories];
ierr = MPI_Gather(worker_results, localnum_trajectory, mystruct, \
master_results, totalnum_trajectories, \
mystruct, MASTER, MPI_COMM_World);
//Do some I/O with MASTER; everything should be in master_results buffer
MPI_Finalize();
return(0);
}
在正确的MPI_Gather之后,MASTER应该为所有子项提供适当的I / O结果。
我想到了。正如评论所暗示的那样,MASTER的接收计数应该是每个处理器的项目数(所以localnum_trajectoires),而不是所有处理器的计数总数。所以一切都是正确的,除了MPI_Gather MASTER计数,应该是这样的
ierr = MPI_Gather(worker_results, localnum_trajectories, mystruct,\
master_results, localnum_trajectories, mystruct,\
MASTER, MPI_COMM_WORLD);
干杯!!!