#include #include using namespace std; int MySum(int a, int b) { return a+b; } int main() { int sum{0}; for( int j = 2; j < 10; ++j) { sum = 0; #pragma omp parallel { #pragma omp for reduction (+: sum) for(int i = 1; i <= j; ++i) { sum += i; } } cout << "The sum to " << j << " is " << sum << endl; } cout << endl << endl; int maxValue{-1}; #pragma omp parallel reduction (max: maxValue) { int id{omp_get_thread_num()}; unsigned int seed{(id+1) * static_cast(time(nullptr))}; for(int i = 1; i < 3; ++i) { int tmpValue = rand_r(&seed) % 1000; maxValue = max(maxValue, tmpValue); #pragma omp critical cout << "\t" << id << " has " << tmpValue << endl; } #pragma omp barrier #pragma omp critical { cout << endl; cout << "Thread " << id << " has " << maxValue << endl; } } cout << "The max value is " << maxValue << endl; cout << endl << endl; sum = 0; #pragma omp declare reduction \ (mySum: int : omp_out = omp_in + omp_out) \ initializer(omp_priv = 0) { #pragma omp parallel { #pragma omp for reduction (mySum: sum) for(int i = 1; i <= 10; ++i) { sum += i; } } } cout << "The sum is " << sum << endl; cout << endl << endl; sum = 0; #pragma omp declare reduction \ (sumFun: int : omp_out = MySum(omp_out, omp_in)) \ initializer(omp_priv = 0) #pragma omp parallel { #pragma omp for reduction (sumFun: sum) for(int i = 1; i <= 10; ++i) { sum += i; } } cout << "The sum is " << sum << endl; return 0; }