# Reduction (OpenMP) Summing an array in serial C is a straightforward accumulation loop: ```c 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. ```c 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`.