[Omp] Array update inside a parallel loop
Hoeflinger, Jay P
jay.p.hoeflinger at intel.com
Wed Dec 7 06:35:41 PST 2005
The statement quoted is incorrect.
The loop mentioned in the Hermanns paper and that you repeat here is guaranteed to work correctly with an !$OMP DO / !$OMP END DO. The flush operation that occurs at the barrier at the end of the worksharing construct allows data written on one thread to be seen by another thread.
Data written in a thread is immediately available to that thread.
Jay Hoeflinger
-----Original Message-----
From: Omp-bounces at openmp.org [mailto:Omp-bounces at openmp.org] On Behalf Of Francisco Jesús Martínez Serrano
Sent: Wednesday, December 07, 2005 7:38 AM
To: omp at openmp.org
Cc: hermanns at tupi.dmt.upm.es
Subject: [Omp] Array update inside a parallel loop
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.
_______________________________________________
Omp mailing list
Omp at openmp.org
http://openmp.org/mailman/listinfo/omp_openmp.org
More information about the Omp
mailing list