Advertisement
outoftime

Pi problem with OMP

Feb 2nd, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <limits>
  4.  
  5. #include <omp.h>
  6.  
  7. double sum(const uint32_t &id, const uint64_t &num_steps, const uint8_t &threads_count)
  8. {
  9.     double x, sum{0.};
  10.     const double step = 1. / num_steps;
  11.     const uint32_t chunk_size = num_steps / threads_count;
  12.     for (uint_fast32_t i(id * chunk_size), _n((id + 1) * chunk_size); i < _n; ++i)
  13.     {
  14.         x = (i + 0.5) * step;
  15.         sum += 4. / (1 + x * x);
  16.     }
  17.     return sum;
  18. }
  19.  
  20. int main()
  21. {
  22.     const uint64_t num_steps = 1000 * 1000 * 1000;
  23.     const uint8_t threads_count = 4;
  24.     double res[threads_count];
  25. #pragma omp parallel num_threads(threads_count)
  26.     {
  27.         uint32_t id = ::omp_get_thread_num();
  28.         res[id] = sum(id, num_steps, threads_count);
  29.     }
  30.     ::std::cout.precision(::std::numeric_limits<double>::max_exponent10);
  31.     ::std::cout << ::std::fixed << ::std::accumulate(res, res + 4, 0.) / num_steps << ::std::endl;
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement