1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 | // Copyright 2021 Jeisson Hidalgo <jeisson.hidalgo@ucr.ac.cr> CC-BY 4.0
#include <omp.h>
#include <iostream>
#include <vector>
int main(int argc, char* argv[]) {
int thread_count = omp_get_max_threads();
if (argc >= 2) {
thread_count = atoi(argv[1]);
}
std::vector<double> values;
double value = 0.0;
while (std::cin >> value) {
values.push_back(value);
}
double total_sum = 0.0;
#pragma omp parallel num_threads(thread_count) \
default(none) shared(values, total_sum)
{
double my_partial_sum = 0.0;
#pragma omp for schedule(runtime)
for (size_t index = 0; index < values.size(); ++index) {
my_partial_sum += values[index];
}
// #pragma omp critical(can_add)
#pragma omp atomic
total_sum += my_partial_sum;
}
const double average = values.size() ? total_sum / values.size() : 0.0;
std::cout << average << std::endl;
}
|