/* test program to find out how much buffering a system supplies */ #include "mpi.h" #include <stdio.h> int main(argc,argv) int argc; char *argv[]; { int myid, numprocs; int namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; char *buf; int bufsize, other, done, i; double t1, t2, tbase; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); /* Output processor names in rank order */ MPI_Get_processor_name(processor_name,&namelen); if (myid > 0) MPI_Recv( MPI_BOTTOM, 0, MPI_INT, myid - 1, 5, MPI_COMM_WORLD, &status ); fprintf(stderr,"Process %d on %s\n", myid, processor_name); fflush( stderr ); if (myid + 1 < numprocs) MPI_Send( MPI_BOTTOM, 0, MPI_INT, myid + 1, 5, MPI_COMM_WORLD ); bufsize = 1024; other = (myid + 1) % 2; done = 0; while (!done && bufsize < 1024*1024*16) { if ((buf = (char *) malloc (bufsize)) == NULL) { fprintf(stderr, "%d could not malloc %d bytes\n", myid, bufsize ); MPI_Abort( MPI_COMM_WORLD, 1 ); exit(-1); } /* fprintf(stderr,"%d sending %d to %d\n", myid, bufsize, other ); */ if ((myid % 2) == 0) { MPI_Send( MPI_BOTTOM, 0, MPI_INT, other, 1, MPI_COMM_WORLD ); MPI_Recv( MPI_BOTTOM, 0, MPI_INT, other, 2, MPI_COMM_WORLD, &status ); /* Compute a time to send when the receive is waiting */ t1 = MPI_Wtime(); MPI_Send( buf, bufsize, MPI_CHAR, other, 100, MPI_COMM_WORLD ); t2 = MPI_Wtime(); tbase = t2 - t1; MPI_Recv( MPI_BOTTOM, 0, MPI_INT, other, 2, MPI_COMM_WORLD, &status ); /* Compute a time when the receive is NOT waiting */ t1 = MPI_Wtime(); MPI_Send( buf, bufsize, MPI_CHAR, other, 100, MPI_COMM_WORLD ); t2 = MPI_Wtime(); if (t2 - t1 > 1.5 && t2 - t1 > 2.0 * tbase) { printf( "MPI_Send blocks with buffers of size %d\n", bufsize ); done = 1; } } else { MPI_Recv( MPI_BOTTOM, 0, MPI_INT, other, 1, MPI_COMM_WORLD, &status ); t1 = MPI_Wtime(); MPI_Send( MPI_BOTTOM, 0, MPI_INT, other, 2, MPI_COMM_WORLD ); MPI_Recv( buf, bufsize, MPI_CHAR, other, 100, MPI_COMM_WORLD, &status ); MPI_Send( MPI_BOTTOM, 0, MPI_INT, other, 2, MPI_COMM_WORLD ); while (MPI_Wtime() - t1 < 2.0) ; MPI_Recv( buf, bufsize, MPI_CHAR, other, 100, MPI_COMM_WORLD, &status ); } fprintf(stderr,"%d received %d fr %d\n", myid, bufsize, other ); free( buf ); i = done; MPI_Allreduce( &i, &done, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); bufsize *= 2; } MPI_Finalize(); return 0; }