#include "mpi.h" #include #include #include /* struct composed { double SWV[2] = {0.0,0.0}; double Range=0.0; int XYdots=0; int Niter=1000; } */ struct composed { double SWV[2]; double Range; int XYdots; int Niter; }; void print_data(struct composed values, int np) { fprintf(stdout,"In process %d data values are:\n",np); fprintf(stdout,"SWV = (%lf, %lf); XYdots = %d\n",values.SWV[0], values.SWV[1], values.XYdots); fprintf(stdout,"Range = %lf; Niter = %d\n\n",values.Range, values.Niter); } void Terminate(int p) { int ierr; fprintf(stdout,"Process %d terminates\n",p); ierr = MPI_Finalize(); return; } int main( int argc, char *argv[]) /* 0301MPIexample-pack */ { struct composed values; double Range, SWV[2]; int Niter, XYdots; double tempo2, tempo1, tempro; char pckd_data[32]; int pos; /* MPI variables */ char server[MPI_MAX_PROCESSOR_NAME]; int ierr, my_rank, numprocs, ls; int num_blk = 4, v_len_blk[4] = {2,1,1,1}; MPI_Aint v_head[4] = {0,16,24,28}; MPI_Datatype v_el_typ[4] = {MPI_DOUBLE,MPI_DOUBLE,MPI_INT,MPI_INT}, new_type; 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 ( my_rank == 0 ) { /* Master process initialize data */ tempo1 = MPI_Wtime(); values.SWV[0] = 0.0; values.SWV[1] = 1.0; values.XYdots = 101; values.Range = 1.0; values.Niter = 1000; } /* num_blk = 4; v_len_blk = {2,1,1,1}; v_head = {0,16,24,28}; v_el_typ = [MPI_DOUBLE_PRECISION,MPI_DOUBLE_PRECISION,MPI_INTEGER, & & MPI_INTEGER] */ ierr = MPI_Type_struct(num_blk,v_len_blk,v_head,v_el_typ,&new_type); ierr = MPI_Type_commit(&new_type); ierr = MPI_Bcast(&values,1,new_type,0,MPI_COMM_WORLD); print_data(values,my_rank); MPI_Barrier(MPI_COMM_WORLD); if ( my_rank == 0 ) { tempo2 = MPI_Wtime(); tempro = (tempo2 - tempo1); fprintf(stdout, "Elapsed time is %lf \n",tempro); } MPI_Barrier(MPI_COMM_WORLD); Terminate(my_rank); return(0); }