From 6103f9544564026be5eed836c93ec880887a0876 Mon Sep 17 00:00:00 2001 From: Isabell Pflug Date: Sun, 20 Jul 2025 20:06:41 +0200 Subject: [PATCH] :bug: Changed my Pi solution to only use #pragma omp for and not already the reduction sum --- answers/02/pi_numerical_integration.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/answers/02/pi_numerical_integration.cpp b/answers/02/pi_numerical_integration.cpp index 5468d44..94a5071 100644 --- a/answers/02/pi_numerical_integration.cpp +++ b/answers/02/pi_numerical_integration.cpp @@ -1,6 +1,7 @@ #include #include #include +#include using namespace std; @@ -9,15 +10,28 @@ int main() { 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 thread_sums(max_threads, 0.0); // one sum per thread + + double start_time = omp_get_wtime(); // wall clock time in seconds - #pragma omp parallel for reduction(+:sum) - for (int i = 0; i < num_steps; i++) { - double x = (i + 0.5) * width; // midpoint - sum = sum + (1.0 / (1.0 + x * x)); // add new height of a rectangle + #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"; + << pi << " in " << setprecision(6) << run_time << " seconds\n"; }