#Answer to exercise (C)
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <mpi.h>
double rand_one()
{
return rand() / (RAND_MAX + 1.0);
}
int main(int argc, char **argv)
{
int n_inside, n_outside;
int total_n_inside, total_n_outside;
int rank, nprocs, niters;
int i;
double x, y, r, pi;
= 0;
n_inside = 0;
n_outside
(&argc, &argv);
MPI_Init
// get the number of processors in the cluster
(MPI_COMM_WORLD, &nprocs);
MPI_Comm_size
// make sure that each process has a different random
// number seed
(MPI_COMM_WORLD, &rank);
MPI_Comm_rank
( rank * 473879 );
srand
// calculate the number of iterations - we want 1000000 in total
= 1000000 / nprocs;
niters
// perform this processes batch of iterations
for (i=0; i<niters; ++i)
{
= (2*rand_one()) - 1;
x = (2*rand_one()) - 1;
y
= sqrt( x*x + y*y );
r
if (r < 1.0)
{
++n_inside;
}
else
{
++n_outside;
}
}
if (rank == 0)
{
= n_inside;
total_n_inside = n_outside;
total_n_outside
("Process %d: n_inside = %d, n_outside = %d\n",
printf, n_inside, n_outside);
rank
//collect every other processes result
for (i=1; i<procs; ++i)
{
( &n_inside, 1, MPI_INT, i, 0, MPI_COMM_WORLD, 0 );
MPI_Recv( &n_outside, 1, MPI_INT, i, 0, MPI_COMM_WORLD, 0 );
MPI_Recv
+= n_inside;
total_n_inside += n_outside;
total_n_outside }
= (4.0 * total_n_inside) / (total_n_inside + total_n_outside);
pi ("The estimated value of pi is %f\n", pi);
printf}
else
{
//send the results to the master process
( &n_inside, 1, MPI_INT, 0, 0, MPI_COMM_WORLD );
MPI_Send( &n_outside, 1, MPI_INT, 0, 0, MPI_COMM_WORLD );
MPI_Send
("Process %d: n_inside = %d, n_outside = %d\n",
printf, n_inside, n_outside);
rank}
();
MPI_Finalize
return 0;
}