#include #include #include #include #define LOOP 300 /* Execute the message passing 300 times */ main(argc,argv) int argc; char **argv; { int rank; int size; int i,j; int packetlength; char *message; char *rmessage; double start[LOOP], middle[LOOP], end[LOOP]; double *mitimes; double avs, avr, av; if (argc<2) { printf("Syntax: gather \n"); exit(-1); } MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); packetlength=atoi(argv[1]); /* param. 1 = mes. len */ message=(char *)malloc(sizeof(char)*packetlength); rmessage=(char *)malloc(sizeof(char)*packetlength*size); memset(message, 'A'+rank, packetlength); memset(rmessage, '.', packetlength*size); /* rmessage[(packetlength*size)-1]=0; printf("%u [%s]\n", rank, rmessage); */ mitimes=(double *)malloc(sizeof(double)*size); memset(mitimes, 0, sizeof(double)*size); /* if (!rank) printf ("Size : %d\n",size); */ for (i=0; i < LOOP; i++) { if (!rank) { MPI_Barrier(MPI_COMM_WORLD); start[i]=MPI_Wtime(); MPI_Gather(message, packetlength, MPI_CHAR, rmessage, packetlength, MPI_CHAR, 0, MPI_COMM_WORLD); end[i]=MPI_Wtime(); } else { MPI_Barrier(MPI_COMM_WORLD); start[i]=MPI_Wtime(); MPI_Gather(message, packetlength, MPI_CHAR, rmessage, packetlength, MPI_CHAR, 0, MPI_COMM_WORLD); end[i]=MPI_Wtime(); } } /* rmessage[packetlength*size-1]=0; printf("%u %s\n", rank, rmessage); */ /* Calculate and print the overheads */ if (!rank) { avs=avr=0.0; for (i=0; i < LOOP; i++) { avs=avs+end[i]-start[i]; } avs=avs/LOOP; printf("%f ", avs); MPI_Gather(&avr, 1, MPI_DOUBLE, mitimes, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); avr=avs=av=mitimes[1]; for(i=2; iavs) avs=mitimes[i]; } printf ("%f %f %f\n", avr, av/(size-1), avs); } else { avs=avr=0; for (i=0; i < LOOP; i++) { avr=avr+end[i]-start[i]; } avr=avr/LOOP; MPI_Gather(&avr, 1, MPI_DOUBLE, mitimes, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); } MPI_Finalize(); }