blob: 60cb63006c3c75ee81dde7a0a5b54d002d14c6f7 [file] [log] [blame]
! Test cases of nested 'reduction' clauses expected to compile cleanly.
! See also 'c-c++-common/goacc/nested-reductions-1-kernels.c'.
subroutine acc_kernels ()
implicit none (type, external)
integer :: i, j, k, sum, diff
!$acc kernels
!$acc loop reduction(+:sum)
do i = 1, 10
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop collapse(2) reduction(+:sum)
do i = 1, 10
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop reduction(+:sum)
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop collapse(2) reduction(+:sum)
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop reduction(+:sum)
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum) reduction(-:diff)
do i = 1, 10
!$acc loop reduction(+:sum)
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
!$acc loop reduction(-:diff)
do j = 1, 10
!$acc loop reduction(-:diff)
do k = 1, 10
diff = 1
end do
end do
end do
!$acc end kernels
end subroutine acc_kernels
! The same tests as above, but using a combined kernels loop construct.
subroutine acc_kernels_loop ()
implicit none (type, external)
integer :: h, i, j, k, l, sum, diff
!$acc kernels loop
do h = 1, 10
!$acc loop reduction(+:sum)
do i = 1, 10
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop collapse(2) reduction(+:sum)
do i = 1, 10
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop reduction(+:sum)
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop collapse(2) reduction(+:sum)
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop reduction(+:sum) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum) reduction(-:diff)
do i = 1, 10
!$acc loop reduction(+:sum) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
!$acc loop reduction(-:diff) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(-:diff)
do k = 1, 10
diff = 1
end do
end do
end do
end do
end subroutine acc_kernels_loop
! The same tests as above, but now the outermost reduction clause is on
! the kernels region, not the outermost loop. */
subroutine acc_kernels_reduction ()
implicit none (type, external)
! In contrast to the 'parallel' construct, the 'reduction' clause is not
! supported on the 'kernels' construct.
end subroutine acc_kernels_reduction
! The same tests as above, but using a combined kernels loop construct, and
! the outermost reduction clause is on that one, not the outermost loop. */
subroutine acc_kernels_loop_reduction ()
implicit none (type, external)
integer :: h, i, j, k, sum, diff
!$acc kernels loop reduction(+:sum)
do h = 1, 10
do i = 1, 10
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
do i = 1, 10
!$acc loop
do j = 1, 10
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
end do
do i = 1, 10
do j = 1, 10
!$acc loop
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop reduction(+:sum) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
end do
!$acc loop reduction(+:sum) reduction(-:diff)
do i = 1, 10
!$acc loop reduction(+:sum) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
!$acc loop reduction(-:diff) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(-:diff)
do k = 1, 10
diff = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop reduction(+:sum) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
!$acc loop reduction(-:diff) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(-:diff)
do k = 1, 10
diff = 1
end do
end do
end do
!$acc loop reduction(+:sum)
do i = 1, 10
!$acc loop reduction(+:sum) ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(+:sum)
do k = 1, 10
sum = 1
end do
end do
!$acc loop ! { dg-warning "insufficient partitioning available to parallelize loop" "TODO" { xfail *-*-* } }
do j = 1, 10
!$acc loop reduction(-:diff)
do k = 1, 10
diff = 1
end do
end do
end do
end do
end subroutine acc_kernels_loop_reduction