#include #include #include #include "mpi.h" int main( int argc, char *argv[]) { int myrank, size, left, right; double start_time, time, max_time; MPI_Init(&argc, &argv); MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Request request[2]; left = myrank == 0 ? size-1 : myrank-1; right = myrank == size-1 ? 0 : myrank+1; printf("%d > %d > %d\n", left, myrank, right); int BUFSIZE = atoi(argv[1]); int i, j; double comp[BUFSIZE]; double arr[BUFSIZE]; double recv[BUFSIZE]; for ( i=0; i < size; i++ ) { arr[i] = 1.0*myrank+i; comp[i] = 1.0*myrank+i; } start_time = MPI_Wtime(); MPI_Isend(arr, BUFSIZE, MPI_DOUBLE, right, 1, MPI_COMM_WORLD, &request[0]); MPI_Irecv(recv, BUFSIZE, MPI_DOUBLE, left, 1, MPI_COMM_WORLD, &request[1]); for ( j=0; j < 10000; j++ ) { for ( i=0; i < size; i++ ) { comp[i] = 3.14*cos(myrank+i) + tan(arr[i]/2.0); comp[i] = log(pow(comp[i],4)); } } MPI_Waitall(2, request, MPI_STATUSES_IGNORE); time = MPI_Wtime () - start_time; MPI_Reduce (&time, &max_time, 1, MPI_DOUBLE, MPI_MAX, size-1, MPI_COMM_WORLD); if (myrank == size-1) printf ("%lf\n", max_time); MPI_Finalize(); return 0; }