MPI_Gather массив структур в C - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь собрать массив структур, используя 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 должен иметь все дочерние результаты для правильного ввода / вывода.

1 Ответ

0 голосов
/ 29 апреля 2019

Я понял это. Как намекает комментарий, счетчик приёма MASTER должен быть числом элементов от каждого процессора (то есть localnum_trajectoires), а НЕ общим количеством импульсов от всех процессоров. Так что все правильно, кроме MPI_Gather MASTER count, которое должно быть как

ierr = MPI_Gather(worker_results, localnum_trajectories, mystruct,\
                  master_results, localnum_trajectories, mystruct,\
                  MASTER, MPI_COMM_WORLD);

Ура !!! * * 1004

...