About subtraction and reduction variables. The following is allowed: s = 0; #pragma omp parallel for reduction(-: s) etc... for(k = 1; k <= n; k++) { expr_k = ...; s = s - expr_k; } The reason is that a thread can compute a partial sum (in any order) and then these partial sums can be added together. The final sum is -(expr_1 + expr_2 + ... + expr_n) and there is no problem to divide the final sum into partial sums. If we change s = s - expr_k; to s = expr_k - s; there will be a problem however. Writing out the value of s for the first iterations we get: k = 1: s = 0 - expr_1 = -expr_1 k = 2: s = expr_2 - s = expr_2 + expr_1 k = 3: s = expr_3 - s = expr_3 - expr_2 - expr_1 k = 4: s = expr_4 - s = expr_4 - expr_3 + expr_2 + expr_1 k = 5: s = expr_5 - s = expr_5 - expr_4 + expr_3 - expr_2 - expr_1 and we that an easy summation of partial sums is not possible due to the alternation of sign.