#include "mpi.h" #include #include #include struct person { char Name[80], Surname[80]; int Birth_date[3]; int Position, Id; }; void print_person(struct person p, int np) { fprintf(stdout,"In process %d person: ",np); fprintf(stdout,"Id: %d, %s %s, born: %d-%d-%d, position: %d\n", p.Id,p.Name,p.Surname,p.Birth_date[0],p.Birth_date[1],p.Birth_date[2], p.Position); return; } void define_person(struct person *p, char *name, char *surname, int m, int d, int y, int position, int id) { strcpy(p->Name,name); strcpy(p->Surname,surname); p->Birth_date[0] = m; p->Birth_date[1] = d; p->Birth_date[2] = y; p->Position = position; p->Id = id; return; } void Terminate(int p) { int ierr; fprintf(stdout,"Process %d terminates\n",p); ierr = MPI_Finalize(); return; } int main( int argc, char *argv[]) { struct person lteam[8], team[8]; double Range, SWV[2]; int Niter, XYdots; double tempo2, tempo1, tempro; char pckd_data[32]; int i, j; /* MPI variables */ char server[MPI_MAX_PROCESSOR_NAME]; int ierr, my_rank, numprocs, ls, hm; int num_el, num_blk = 5, v_len_blk[5] = {80,80,3,1,1}; MPI_Aint v_head[5]; MPI_Datatype v_el_typ[5] = {MPI_CHAR,MPI_CHAR,MPI_INT,MPI_INT,MPI_INT}; MPI_Datatype person_type, el_type, pair_type; MPI_Status status; MPI_Aint ext, a0, a1; MPI_File fh; ierr = MPI_Init(&argc,&argv); ierr = MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); ierr = MPI_Comm_size(MPI_COMM_WORLD,&numprocs); ierr = MPI_Get_processor_name(server,&ls); if ( numprocs != 4 ) { fprintf(stderr,"There must be 4 processes!\n"); exit(-1); } // should be read from an archive define_person(&team[0],"John","Dalton",4,1,1979,0,0); define_person(&team[1],"Timothy","Dunlop",6,5,1981,0,0); define_person(&team[2],"Mary","Bond",12,7,1977,0,0); define_person(&team[3],"Helen","Fittipaldi",1,1,1982,0,0); define_person(&team[4],"Jossef","Kongrua",11,30,1989,0,0); define_person(&team[5],"Niky","Red",2,29,1980,0,0); define_person(&team[6],"Nikita","Palmer",10,18,1988,0,0); define_person(&team[7],"Mortimer","Smith",3,3,1983,0,0); j = 0; for (i = 0; i < 8; i++ ) { if ( (i%numprocs) == my_rank ) { lteam[j] = team[i]; lteam[j].Position = my_rank; lteam[j].Id = my_rank*100+j; j++; } } if ( my_rank == 0 ) { tempo1 = MPI_Wtime(); } v_head[0] = 0; ierr = MPI_Address(&team[2].Name,&a0); ierr = MPI_Address(&team[2].Surname,&a1); v_head[1] = a1-a0; ierr = MPI_Address(&team[2].Birth_date,&a1); v_head[2] = a1-a0; ierr = MPI_Address(&team[2].Position,&a1); v_head[3] = a1-a0; ierr = MPI_Address(&team[2].Id,&a1); v_head[4] = a1-a0; ierr = MPI_Type_struct(num_blk,v_len_blk,v_head,v_el_typ,&person_type); ierr = MPI_Type_commit(&person_type); ierr = MPI_Type_extent(person_type, &ext ); num_el=2; ierr = MPI_Type_contiguous(num_el, person_type, &pair_type); ierr = MPI_Type_commit(&pair_type); ierr = MPI_File_open(MPI_COMM_WORLD,"team.dat",MPI_MODE_WRONLY|MPI_MODE_CREATE, MPI_INFO_NULL,&fh); hm = 0; ierr = MPI_File_write_ordered(fh,lteam,1,pair_type,&status); ierr = MPI_Get_count(&status, pair_type, &hm); printf("HM=%d\n",hm); ierr = MPI_File_close(&fh); if ( my_rank == 0 ) { ierr = MPI_File_open(MPI_COMM_SELF,"team.dat",MPI_MODE_RDONLY,MPI_INFO_NULL,&fh); for ( i=0; i < 8; i++ ) { ierr = MPI_File_read(fh,&team[i],1,person_type,&status); } ierr = MPI_File_close(&fh); } if ( my_rank == 0 ) { for (i = 0; i < 8; i++ ) { print_person(team[i],my_rank); } tempo2 = MPI_Wtime(); tempro = (tempo2 - tempo1); fprintf(stdout, "Elapsed time is %lf \n",tempro); } ierr = MPI_Barrier(MPI_COMM_WORLD); Terminate(my_rank); return(0); }