[Omp] Array update inside a parallel loop

Francisco Jesús Martínez Serrano franjesus at gmail.com
Wed Dec 7 05:38:03 PST 2005


Is it safe to access parts of an array previously updated inside the
same parallel loop if you are only accessing the parts "belonging" to
the current thread?

According to Miguel Hermanns
(http://www.openmp.org/presentations/miguel/F95_OpenMPv1_v2.pdf), it's
not, since:

"Since each thread is executing part of the iterations of the do-loop
and the updates of
the modifications made to the variables are not ensured until the end
of the work-sharing
construct, the following example will not work correctly using the
!$OMP DO/!$OMP END
DO directive-pair for its parallelization:

real(8) :: A(1000), B(1000)
do i = 1, 1000
  B(i) = 10 * i
  A(i) = A(i) + B(i)
end do
   because the correct value of the matrix B is not ensured until the
end of the work-
sharing construct !$OMP END DO.
"

However, i'm doing precisely that to make a parallel 3D convolution
routine using fftw and multiple calls to fftw 1D (the 3D version of
fftw does not work for us because of special boundary conditions).

In fact, trying this same example with the latest public version of
Intel's Fortran compiler (9.0.028):

      program test4
      implicit none
      integer,parameter :: N=10000000
      real(4) :: A(N), B(N)
      integer(4) :: i
!$OMP PARALLEL DEFAULT(PRIVATE) SHARED(A,B)
!$OMP DO
      do i = 1,N
        A(i)=0.
      end do
!$OMP END DO

!$OMP DO
      do i = 1,N
        B(i) = float(i)
        A(i) = A(i) + B(i)
      end do
!$OMP END DO
!$OMP END PARALLEL

      do i = 1,N
        if(A(i) .ne. float(i)) then
          print*, 'OOOOOOOOooooooooops!!'
          exit
        end if
      end do

      end program

works fine and does not yield any error. What am i missing? Is the
fortran compiler implementing some sort of data-consistency that I am
unaware of?

Thanks.


More information about the Omp mailing list