1! { dg-do run }
2!
3MODULE reduction_test
4
5CONTAINS
6
7SUBROUTINE reduction_kernel(x_min,x_max,y_min,y_max,arr,sum)
8
9  IMPLICIT NONE
10
11  INTEGER      :: x_min,x_max,y_min,y_max
12  REAL(KIND=8), DIMENSION(x_min-2:x_max+2,y_min-2:y_max+2) :: arr
13  REAL(KIND=8) :: sum
14
15  INTEGER      :: j,k
16
17!$ACC DATA PRESENT(arr) COPY(sum)
18!$ACC PARALLEL LOOP REDUCTION(+ : sum)
19  DO k=y_min,y_max
20    DO j=x_min,x_max
21      sum=sum+arr(j,k)
22    ENDDO
23  ENDDO
24!$ACC END PARALLEL LOOP
25!$ACC END DATA
26END SUBROUTINE reduction_kernel
27
28END MODULE reduction_test
29
30program main
31    use reduction_test
32
33    integer :: x_min,x_max,y_min,y_max
34    real(kind=8), dimension(1:10,1:10) :: arr
35    real(kind=8) :: sum
36
37    x_min = 1
38    x_max = 2
39    y_min = 1
40    y_max = 2
41
42    arr(:,:) = 1.0
43
44    sum = 0.0
45
46    !$acc data copy(arr)
47
48    call reduction_kernel(x_min,x_max,y_min,y_max,arr,sum)
49
50    !$acc end data
51
52    if (sum .ne. 4.0) STOP 1
53end program
54