#include "mpi.h" #include <stdio.h> #define BIGSIZE 10000 #define MAXLITSIZE 1024 int main( argc, argv ) int argc; char *argv[]; { int myrank, numprocs; int i, tag = 50, litsize = 1; double bigdata[BIGSIZE]; double litdata[MAXLITSIZE]; double t1, ts1, ts2; MPI_Status status; MPI_Request request; MPI_Init( &argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&myrank); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); if (numprocs < 3) { fprintf(stderr, "%s must be run with at least %d processes\n", argv[0], 3); MPI_Abort( MPI_COMM_WORLD, 1 ); } if (myrank == 0) { for (i=0; i<argc; i++) { if (!argv[i]) continue; if (strcmp( argv[i], "-n" ) == 0) { litsize = atoi( argv[i+1] ); i++; } } } MPI_Bcast( &litsize, 1, MPI_INT, 0, MPI_COMM_WORLD ); for (i = 0; i < BIGSIZE; i++) bigdata[i] = 1000; for (i = 0; i < litsize; i++) litdata[i] = 1; MPI_Barrier(MPI_COMM_WORLD); if (myrank == 0) { MPI_Send( bigdata, BIGSIZE, MPI_DOUBLE, 1, tag, MPI_COMM_WORLD); MPI_Recv( litdata, litsize, MPI_DOUBLE, 2, tag, MPI_COMM_WORLD, &status) ; } else if (myrank == 1) { MPI_Irecv(litdata, litsize, MPI_DOUBLE, 2, tag, MPI_COMM_WORLD, &request ); MPI_Send (litdata, litsize, MPI_DOUBLE, 2, tag, MPI_COMM_WORLD); MPI_Recv( bigdata, BIGSIZE, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &status) ; MPI_Wait( &request, &status ); } else if (myrank == 2) { MPI_Recv( litdata, litsize, MPI_DOUBLE, 1, tag, MPI_COMM_WORLD, &status) ; t1 = MPI_Wtime(); MPI_Send( litdata, litsize, MPI_DOUBLE, 1, tag, MPI_COMM_WORLD); ts1 = MPI_Wtime() - t1; t1 = MPI_Wtime(); MPI_Send( litdata, litsize, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD); ts2 = MPI_Wtime() - t1; } if (myrank == 2) { printf( "[%d] Litsize = %d, Time for first send = %f, for second = %f\n", myrank, litsize, ts1, ts2 ); } MPI_Finalize(); return 0; }