Question

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 
Was it helpful?

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.

OTHER TIPS

For one thing, one of the nice features of OpenMP is that if you compile the program without enabling OpenMP, the program can/(should!) be a valid serial program as well. The serial version of your example would be ill-defined without initializing "sum" before the loop.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top