/* ========================================================================== OpenMP program: compute Pi by integrating the function 1/SQRT(1-x^2) parallel for construct ========================================================================== */ #include #include #include #include #include using namespace std; double f(double a) { return( 2.0 / sqrt(1 - a*a) ); } /* ======================= MAIN ======================= */ int main(int argc, char *argv[]) { int N; double sum; double w, x; struct timeval start_time, stop_time; int elapsed; /* ----- Check command line ----- */ if ( argc != 2 ) { cout << "Usage: " << argv[0] << " Num_Intervals" << endl; exit(1); } /* ----- Get number of intervals and number of threads ----- */ N = atoi(argv[1]); w = 1.0/(double) N; sum = 0.0; gettimeofday(&start_time, NULL); #pragma omp parallel { int i; double mypi, x; mypi = 0.0; #pragma omp for for (i = 0; i < N; i = i + 1) { x = w*(i + 0.5); // Save us the trouble of dividing mypi = mypi + w*f(x); // the work up... } #pragma omp critical { sum = sum + mypi; } } cout << "Computed Pi = " << sum << endl << endl; gettimeofday(&stop_time, NULL); elapsed = (stop_time.tv_sec*1000000 + stop_time.tv_usec) - (start_time.tv_sec*1000000 + start_time.tv_usec); cout << "Elapsed time = " << elapsed << " microseconds" << endl; }