#include "mpi.h" #include #include int main(int argc,char *argv[]) { int done = 0, n, myid, numprocs, i; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, mflops; double startwtime = 0.0, endwtime; int namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; /* set up MPI and get number of processes, the current id, and the processor (node) name */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Get_processor_name(processor_name,&namelen); /* if we don't get the right number of arguments, print help string (if we're the master node) and exit (all nodes) */ if (argc != 2) { if (myid == 0) { printf("Usage: mpirun -np %s \n"); } MPI_Finalize(); exit(0); } /* print out MPI info for each node */ printf("Process %d of %d on %s\n", myid, numprocs, processor_name); /* get loop counter from argument list */ n = atoi(argv[1]); /* if we're the master, get the start time */ if (myid == 0) { startwtime = MPI_Wtime(); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); h = 1.0 / (double) n; sum = 0.0; /* step through the loop, from myid to n, stepping numprocs */ /* A slightly better approach starts from large i and works back */ for (i = myid + 1; i <= n; i += numprocs) { x = h * ((double)i - 0.5); sum += ( 4.0 / ( 1.0 + x * x )); } mypi = h * sum; /* we're done, gather the results from all the nodes and sum them up */ MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); /* if we're the master, print out the results */ if (myid == 0) { printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); endwtime = MPI_Wtime(); printf("wall clock time = %f\n", endwtime-startwtime); mflops = ((6.0 * (double)n) / (endwtime - startwtime)) / 1000000.0; printf("Estimated MFLOPs = %f\n", mflops); fflush( stdout ); } /* shut down MPI *? MPI_Finalize(); /* exit the program */ return 0; } /* end main */