reduction-openmp
**This is an old revision of the document!**
Table of Contents
Reduction (OpenMP)
Summing an array in serial C is a straightforward accumulation loop:
double sum = 0.0; for (int i = 0; i < N; i++) sum += a[i];
Adding #pragma omp parallel for to this loop creates a race condition: multiple threads read sum, add to it, and write back simultaneously, so some updates are lost. The reduction clause fixes this. Reduction in OpenMP gives each thread a private copy of the accumulation variable, lets it accumulate locally without contention, then merges all copies at the end of the loop using the specified operator.
double sum = 0.0; #pragma omp parallel for reduction(+:sum) for (int i = 0; i < N; i++) { sum += a[i]; }
Built-in reduction operators include +, *, -, min, max, and the bitwise operators &, |, ^. Custom reducers are possible in C++ via declare reduction.
reduction-openmp.1781169550.txt.gz ยท Last modified: by 127.0.0.1
