Search code examples
parallel-processingfortranopenmpdirectiveclause

Why bother to initialize a reduction variable outside the parallel construct?


I am learning how to port my Fortran code to OpenMP. When I read an online tutorial (see here) I came across one question.

At first, I knew from page 28 that the value of a reduction variable is undefined from the moment the first thread reaches the clause till the operation has completed.

To my understanding, the statement implies that it doesn't matter whether I initialize the reduction variable before the program hits the parallel construct, because it is not defined until the complete of the operation. However, the sample code on page 27 of the same tutorial initializes the reduction variable before the parallel construct.

Could anyone please let me know which treatment is correct? Thanks.

Lee

sum = 0.0
!$omp parallel default(none) shared(n,x) private(i)
do i = 1, n
   sum = sum + x(i)
end do
!$omp end do
!$omp end parallel
print*, sum 

Solution

  • After fixing your code:

    integer,parameter :: n = 10000
    real :: x(n)
    
    x = 1
    
    sum = 0
    !$omp parallel do default(none) shared(x) private(i) reduction(+:sum)
    do i = 1, n
       sum = sum + x(i)
    end do
    !$omp end parallel do
    print*, sum 
    end
    

    Notice, that the value to which you initialize sum matters! If you change it you get a different result. It is quite obvious you have to initialize it properly and even the OpenMP version is ill-defined without proper initialization.

    Yes, the value of sum is not defined until completing the loop, but that doesn't mean it can be undefined before the loop.