/* * numerical integration example, as discussed in textbook: * * compute pi by approximating the area under the curve f(x) = 4 / (1 + x*x) * between 0 and 1. * * sequential version, done as a single-process MPI program so we can use * the MPI timing function. */ #include #include #include /* MPI header file */ #define NUM_STEPS 100000000 /* a short function to print a message, clean up, and exit */ void error_exit(char msg[]) { fprintf(stderr, "%s", msg); MPI_Finalize(); exit(EXIT_FAILURE); } /* main program */ int main(int argc, char *argv[]) { int nprocs; double start_time, end_time; int i; double x, pi; double sum = 0.0; double step = 1.0/(double) NUM_STEPS; /* initialize for MPI */ if (MPI_Init(&argc, &argv) != MPI_SUCCESS) { fprintf(stderr, "MPI initialization error\n"); return EXIT_FAILURE; } /* get number of processes */ MPI_Comm_size(MPI_COMM_WORLD, &nprocs); if (nprocs != 1) error_exit("number of processes must be 1\n"); /* record start time */ start_time = MPI_Wtime(); /* do computation */ for (i=0; i < NUM_STEPS; ++i) { x = (i+0.5)*step; sum = sum + 4.0/(1.0+x*x); } pi = step * sum; /* record end time */ end_time = MPI_Wtime(); /* print results */ printf("sequential program results:\n"); printf("pi = %g (%17.15f)\n",pi, pi); printf("time to compute = %g seconds\n", end_time - start_time); /* clean up for MPI */ MPI_Finalize(); return EXIT_SUCCESS; }