https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102698
Bug ID: 102698
Summary: omp atomic capture Abnormal results after running
multiple times
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: han...@compiler-dev.com
Target Milestone: ---
test case:
program main
interface
subroutine aaaa_ieor(x, o, idx, idy, n)
integer(2) :: x(8, 2), o(8, 2)
integer :: n, idx(*), idy(*)
end subroutine
end interface
integer, parameter :: n = 64, n1 = 8, n2 = 2
integer(2) :: x(8, 2), o(8, 2), expect1(8, 2), a(64), b(64), c(64)
integer :: idx(n), idy(n)
logical(1) :: rst(32), res(32)
integer :: i, j
do i = 1, n
idx(i) = mod(i, n1) + 1
if (i > 32) then
idy(i) = mod(i, n2) + 1
else
idy(i) = mod(i + 1, n2) + 1
end if
end do
expect1 = reshape([120 ,25, 58, 27, 60, 29, 62, 31, &
56, 57, 26, 59, 28, 61, 30, 63], (/8, 2/))
x = 0
call aaaa_ieor(x, o, idx, idy, n)
res(1:16) = reshape((x .eq. expect1), (/16/))
res(17:32) = reshape((o .eq. expect1), (/16/))
!print *, x
do i = 1, 32
if (res(i) .neqv. .true.) print *, i
end do
if (any(res .neqv. .true.)) stop 1
!print *, "PASS"
end program
function fun(i) result(c)
integer :: i
integer(2) :: c
c = i
end function
subroutine aaaa_ieor(x, o, idx, idy, n)
integer(2) :: x(8, 2), o(8, 2)
integer :: n, idx(*), idy(*)
interface
function fun(i) result(c)
integer :: i
integer(2) :: c
end function
end interface
!num_threads(4)
!$omp parallel do shared(x, o)
do i = 1, 64
!$omp atomic capture
x(idx(i), idy(i)) = ior(x(idx(i), idy(i)), fun(i))
o(idx(i), idy(i)) = x(idx(i), idy(i))
!$omp end atomic
end do
end subroutine
next is the shell to exec:
#!/bin/bash
gfortran -fopenmp ieor1.f90
for((i=1;i<=1000;i++))
do
./a.out
done
Once executed 1,000 times in one shell, the result may be wrong one time
If you are lucky, run a.out 6000 times may only one result is wrong
How did the error happen? Looking forward to your help