xref: /oneTBB/examples/parallel_reduce/pi/pi.cpp (revision 8370742d)
1*8370742dSDmitri Mokhov /*
2*8370742dSDmitri Mokhov     Copyright (c) 2023 Intel Corporation
3*8370742dSDmitri Mokhov 
4*8370742dSDmitri Mokhov     Licensed under the Apache License, Version 2.0 (the "License");
5*8370742dSDmitri Mokhov     you may not use this file except in compliance with the License.
6*8370742dSDmitri Mokhov     You may obtain a copy of the License at
7*8370742dSDmitri Mokhov 
8*8370742dSDmitri Mokhov         http://www.apache.org/licenses/LICENSE-2.0
9*8370742dSDmitri Mokhov 
10*8370742dSDmitri Mokhov     Unless required by applicable law or agreed to in writing, software
11*8370742dSDmitri Mokhov     distributed under the License is distributed on an "AS IS" BASIS,
12*8370742dSDmitri Mokhov     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8370742dSDmitri Mokhov     See the License for the specific language governing permissions and
14*8370742dSDmitri Mokhov     limitations under the License.
15*8370742dSDmitri Mokhov */
16*8370742dSDmitri Mokhov 
17*8370742dSDmitri Mokhov #include "common.h"
18*8370742dSDmitri Mokhov #include "oneapi/tbb/blocked_range.h"
19*8370742dSDmitri Mokhov #include "oneapi/tbb/global_control.h"
20*8370742dSDmitri Mokhov #include "oneapi/tbb/parallel_reduce.h"
21*8370742dSDmitri Mokhov 
22*8370742dSDmitri Mokhov struct reduce_body {
23*8370742dSDmitri Mokhov     double my_pi;
reduce_bodyreduce_body24*8370742dSDmitri Mokhov     reduce_body() : my_pi(0) {}
reduce_bodyreduce_body25*8370742dSDmitri Mokhov     reduce_body(reduce_body& x, tbb::split) : my_pi(0) {}
operator ()reduce_body26*8370742dSDmitri Mokhov     void operator()(const tbb::blocked_range<number_t>& r) {
27*8370742dSDmitri Mokhov         my_pi += pi_slice_kernel(r.begin(), r.size());
28*8370742dSDmitri Mokhov     }
joinreduce_body29*8370742dSDmitri Mokhov     void join(const reduce_body& y) {
30*8370742dSDmitri Mokhov         my_pi += y.my_pi;
31*8370742dSDmitri Mokhov     }
32*8370742dSDmitri Mokhov };
33*8370742dSDmitri Mokhov 
compute_pi_parallel()34*8370742dSDmitri Mokhov double compute_pi_parallel() {
35*8370742dSDmitri Mokhov     step = pi_t(1.0) / num_intervals;
36*8370742dSDmitri Mokhov 
37*8370742dSDmitri Mokhov     double ret = 0.0;
38*8370742dSDmitri Mokhov 
39*8370742dSDmitri Mokhov     reduce_body body;
40*8370742dSDmitri Mokhov     tbb::parallel_reduce(tbb::blocked_range<number_t>(0, num_intervals), body);
41*8370742dSDmitri Mokhov 
42*8370742dSDmitri Mokhov     ret = body.my_pi * step;
43*8370742dSDmitri Mokhov 
44*8370742dSDmitri Mokhov     return ret;
45*8370742dSDmitri Mokhov }
46*8370742dSDmitri Mokhov 
47*8370742dSDmitri Mokhov static std::unique_ptr<tbb::global_control> gc;
48*8370742dSDmitri Mokhov 
threading(int p)49*8370742dSDmitri Mokhov threading::threading(int p) {
50*8370742dSDmitri Mokhov     gc.reset(new tbb::global_control(tbb::global_control::max_allowed_parallelism, p));
51*8370742dSDmitri Mokhov }
52*8370742dSDmitri Mokhov 
~threading()53*8370742dSDmitri Mokhov threading::~threading() {
54*8370742dSDmitri Mokhov     gc.reset();
55*8370742dSDmitri Mokhov }
56