78 lines
1.2 KiB
Fortran
78 lines
1.2 KiB
Fortran
! { dg-do run }
|
|
|
|
module mod1
|
|
contains
|
|
|
|
subroutine foo (x, y)
|
|
integer :: x, y
|
|
|
|
!$omp taskgroup task_reduction (+: x, y)
|
|
|
|
!$omp target in_reduction (+: x, y)
|
|
x = x + 8
|
|
y = y + 16
|
|
!$omp end target
|
|
|
|
!$omp task in_reduction (+: x, y)
|
|
x = x + 2
|
|
y = y + 4
|
|
!$omp end task
|
|
|
|
!$omp end taskgroup
|
|
end subroutine foo
|
|
|
|
integer function bar (x)
|
|
integer, value :: x
|
|
|
|
!$omp taskgroup task_reduction (+: x)
|
|
|
|
!$omp target in_reduction (+: x)
|
|
x = x + 16
|
|
!$omp end target
|
|
|
|
!$omp task in_reduction (+: x)
|
|
x = x + 32
|
|
!$omp end task
|
|
|
|
!$omp end taskgroup
|
|
|
|
bar = x
|
|
end function bar
|
|
end module mod1
|
|
|
|
program main
|
|
use mod1
|
|
integer :: x, y
|
|
real :: f;
|
|
|
|
x = 1
|
|
y = 1
|
|
|
|
call foo (x, y)
|
|
|
|
if (x .ne. 11) stop 1
|
|
if (y .ne. 21) stop 2
|
|
|
|
y = bar (8)
|
|
if (y .ne. 56) stop 3
|
|
|
|
x = 0
|
|
f = 0.0
|
|
|
|
!$omp taskgroup task_reduction (+: x, f)
|
|
!$omp target in_reduction (+: x, f)
|
|
x = x + 1
|
|
f = f + 2.0
|
|
!$omp end target
|
|
|
|
!$omp task in_reduction (+: x, f)
|
|
x = x + 2
|
|
f = f + 3.0
|
|
!$omp end task
|
|
|
|
!$omp end taskgroup
|
|
|
|
if (x .ne. 3) stop 4
|
|
if (f .ne. 5.0) stop 5
|
|
|
|
end program main
|