#include <omp.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define SEED 35
main(int argc, char* argv)
{
int niter=0;
double x,y;
int i,tid,count=0;
double z;
double pi;
time_t rawtime;
struct tm * timeinfo;
printf("Enter the number of iterations used to estimate pi: ");
scanf("%d",&niter);
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "The current date/time is: %s", asctime (timeinfo) );
srand(SEED);
#pragma omp parallel for private(x,y,z,tid) reduction(+:count)
for ( i=0; i<niter; i++) {
x = (double)rand()/RAND_MAX;
y = (double)rand()/RAND_MAX;
z = (x*x+y*y);
if (z<=1) count++;
if (i==(niter/6)-1) {
tid = omp_get_thread_num();
printf(" thread %i just did iteration %i the count is %i\n",tid,i,count);
}
if (i==(niter/3)-1) {
tid = omp_get_thread_num();
printf(" thread %i just did iteration %i the count is %i\n",tid,i,count);
}
if (i==(niter/2)-1) {
tid = omp_get_thread_num();
printf(" thread %i just did iteration %i the count is %i\n",tid,i,count);
}
if (i==(2*niter/3)-1) {
tid = omp_get_thread_num();
printf(" thread %i just did iteration %i the count is %i\n",tid,i,count);
}
if (i==(5*niter/6)-1) {
tid = omp_get_thread_num();
printf(" thread %i just did iteration %i the count is %i\n",tid,i,count);
}
if (i==niter-1) {
tid = omp_get_thread_num();
printf(" thread %i just did iteration %i the count is %i\n",tid,i,count);
}
}
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "The current date/time is: %s", asctime (timeinfo) );
printf(" the total count is %i\n",count);
pi=(double)count/niter*4;
printf("# of trials= %d , estimate of pi is %g \n",niter,pi);
return 0;
}