#include "mpi.h" #include #include #include 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 */ { /* Example for pack/unpack functions */ 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; 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(); SWV[0] = 0.0; SWV[1] = 1.0; XYdots = 101; Range = 1.0; Niter = 1000; /* Send data to processes: */ /* SWV, XYdots, Range, Niter */ pos = 0; ierr = MPI_Pack(SWV,2,MPI_DOUBLE,pckd_data,32,&pos,MPI_COMM_WORLD); ierr = MPI_Pack(&XYdots,1,MPI_INT,pckd_data,32,&pos,MPI_COMM_WORLD); ierr = MPI_Pack(&Range,1,MPI_DOUBLE,pckd_data,32,&pos,MPI_COMM_WORLD); ierr = MPI_Pack(&Niter,1,MPI_INT,pckd_data,32,&pos,MPI_COMM_WORLD); printf("Data sent: %lf, %lf, %d, %lf, %d\n",SWV[0], SWV[1], XYdots, Range, Niter); } ierr = MPI_Bcast(pckd_data,32,MPI_PACKED,0,MPI_COMM_WORLD); if ( my_rank != 0 ) { pos = 0; ierr = MPI_Unpack(pckd_data,32,&pos,SWV,2,MPI_DOUBLE,MPI_COMM_WORLD); ierr = MPI_Unpack(pckd_data,32,&pos,&XYdots,1,MPI_INT,MPI_COMM_WORLD); ierr = MPI_Unpack(pckd_data,32,&pos,&Range,1,MPI_DOUBLE,MPI_COMM_WORLD); ierr = MPI_Unpack(pckd_data,32,&pos,&Niter,1,MPI_INT,MPI_COMM_WORLD); printf("Data rcvd: %lf, %lf, %d, %lf, %d\n",SWV[0], SWV[1], XYdots, Range, Niter); } 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); }