You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.0 KiB
C++
38 lines
1.0 KiB
C++
#include <iomanip>
|
|
#include <iostream>
|
|
#include <omp.h>
|
|
#include <vector>
|
|
|
|
using namespace std;
|
|
|
|
int main() {
|
|
int num_steps = 100000000; // number of rectangles
|
|
double width = 1.0 / double(num_steps); // width of a rectangle
|
|
double sum = 0.0; // for summing up all heights of rectangles
|
|
|
|
int max_threads = omp_get_max_threads();
|
|
vector<double> thread_sums(max_threads, 0.0); // one sum per thread
|
|
|
|
|
|
double start_time = omp_get_wtime(); // wall clock time in seconds
|
|
#pragma omp parallel
|
|
{
|
|
int thread = omp_get_thread_num();
|
|
|
|
#pragma omp for
|
|
for (int i = 0; i < num_steps; i++) {
|
|
double x = (i + 0.5) * width; // midpoint
|
|
thread_sums[thread] += (1.0 / (1.0 + x * x)); // add new height of a rectangle
|
|
}
|
|
}
|
|
for (int i = 0; i < max_threads; i++) {
|
|
sum+= thread_sums[i];
|
|
}
|
|
|
|
double pi = sum * 4 * width; // compute pi
|
|
double run_time = omp_get_wtime() - start_time;
|
|
|
|
cout << "pi with " << num_steps << " steps is " << setprecision(17)
|
|
<< pi << " in " << setprecision(6) << run_time << " seconds\n";
|
|
}
|