Я пытаюсь собрать массив структур, используя MPI_Gather.Я создал производный тип данных "mystruct" из одной структуры "Final", используя MPI_Type_contiguous (каждый элемент является двойным).Затем я использовал этот производный тип данных в простом 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 должен иметь все дочерние результаты для правильного ввода / вывода.