Next: Exercise
Up: Sending and Receiving messages
Previous: Exercise/Example: Translate this Fortran
Contents
This example evaluates
by numerically evaluating the integral
- The master process reads number of intervals from standard input, this number is then broadcast to the pool of processes.
- Having received the number of intervals, each process evaluates the total area of n/pool_size rectangles under the curve
- The contributions to the total area under the curve are collected from participating processes by the master process, which at the same time adds them up, and prints the result on standard output.
This http://siber.cankaya.edu.tr/ParallelComputing/cfiles/pi.cprogram computes PI (with a very simple method) but does not use
MPI_Send and MPI_Recv. Instead, it uses collective operations to send data to and from all of the running processes.
- The routine MPI_Bcast sends data from one process to all others.
- The routine MPI_Reduce combines data from all processes (by adding them in this case), and returning the result to a single process.
#include "mpi.h"
#include <math.h>
int main(argc,argv)
int argc;
char *argv[];
{
int done = 0, n, myid, numprocs, i, rc;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x, a;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
while (!done)
{
if (myid == 0) {
printf("Enter the number of intervals: (0 quits) ");
scanf("%d",&n);
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0) break;
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double)i - 0.5);
sum += 4.0 / (1.0 + x*x);
}
mypi = h * sum;
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD);
if (myid == 0)
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));
}
MPI_Finalize();
}
Next: Exercise
Up: Sending and Receiving messages
Previous: Exercise/Example: Translate this Fortran
Contents
Cem Ozdogan
2006-12-27