78 lines
1.7 KiB
Fortran
78 lines
1.7 KiB
Fortran
|
! { dg-do run }
|
||
|
integer, pointer :: a, c(:)
|
||
|
integer, target :: b, d(10)
|
||
|
b = 0
|
||
|
a => b
|
||
|
d = 0
|
||
|
c => d
|
||
|
call foo (a, c)
|
||
|
b = 0
|
||
|
d = 0
|
||
|
call bar (a, c)
|
||
|
contains
|
||
|
subroutine foo (a, c)
|
||
|
integer, pointer :: a, c(:), b, d(:)
|
||
|
integer :: r, r2
|
||
|
r = 0
|
||
|
!$omp parallel firstprivate (a, c) reduction (+:r)
|
||
|
!$omp atomic
|
||
|
a = a + 1
|
||
|
!$omp atomic
|
||
|
c(1) = c(1) + 1
|
||
|
r = r + 1
|
||
|
!$omp end parallel
|
||
|
if (a.ne.r.or.c(1).ne.r) call abort
|
||
|
r2 = r
|
||
|
b => a
|
||
|
d => c
|
||
|
r = 0
|
||
|
!$omp parallel firstprivate (b, d) reduction (+:r)
|
||
|
!$omp atomic
|
||
|
b = b + 1
|
||
|
!$omp atomic
|
||
|
d(1) = d(1) + 1
|
||
|
r = r + 1
|
||
|
!$omp end parallel
|
||
|
if (b.ne.r+r2.or.d(1).ne.r+r2) call abort
|
||
|
end subroutine foo
|
||
|
subroutine bar (a, c)
|
||
|
integer, pointer :: a, c(:), b, d(:)
|
||
|
integer, target :: q, r(5)
|
||
|
integer :: i
|
||
|
q = 17
|
||
|
r = 21
|
||
|
b => a
|
||
|
d => c
|
||
|
!$omp parallel do firstprivate (a, c) lastprivate (a, c)
|
||
|
do i = 1, 100
|
||
|
!$omp atomic
|
||
|
a = a + 1
|
||
|
!$omp atomic
|
||
|
c((i+9)/10) = c((i+9)/10) + 1
|
||
|
if (i.eq.100) then
|
||
|
a => q
|
||
|
c => r
|
||
|
end if
|
||
|
end do
|
||
|
!$omp end parallel do
|
||
|
if (b.ne.100.or.any(d.ne.10)) call abort
|
||
|
if (a.ne.17.or.any(c.ne.21)) call abort
|
||
|
a => b
|
||
|
c => d
|
||
|
!$omp parallel do firstprivate (b, d) lastprivate (b, d)
|
||
|
do i = 1, 100
|
||
|
!$omp atomic
|
||
|
b = b + 1
|
||
|
!$omp atomic
|
||
|
d((i+9)/10) = d((i+9)/10) + 1
|
||
|
if (i.eq.100) then
|
||
|
b => q
|
||
|
d => r
|
||
|
end if
|
||
|
end do
|
||
|
!$omp end parallel do
|
||
|
if (a.ne.200.or.any(c.ne.20)) call abort
|
||
|
if (b.ne.17.or.any(d.ne.21)) call abort
|
||
|
end subroutine bar
|
||
|
end
|