| ! { dg-do run } |
| ! |
| MODULE reduction_test |
| |
| CONTAINS |
| |
| SUBROUTINE reduction_kernel(x_min,x_max,y_min,y_max,arr,sum) |
| |
| IMPLICIT NONE |
| |
| INTEGER :: x_min,x_max,y_min,y_max |
| REAL(KIND=8), DIMENSION(x_min-2:x_max+2,y_min-2:y_max+2) :: arr |
| REAL(KIND=8) :: sum |
| |
| INTEGER :: j,k |
| |
| !$ACC DATA PRESENT(arr) COPY(sum) |
| !$ACC PARALLEL LOOP REDUCTION(+ : sum) |
| DO k=y_min,y_max |
| DO j=x_min,x_max |
| sum=sum+arr(j,k) |
| ENDDO |
| ENDDO |
| !$ACC END PARALLEL LOOP |
| !$ACC END DATA |
| END SUBROUTINE reduction_kernel |
| |
| END MODULE reduction_test |
| |
| program main |
| use reduction_test |
| |
| integer :: x_min,x_max,y_min,y_max |
| real(kind=8), dimension(1:10,1:10) :: arr |
| real(kind=8) :: sum |
| |
| x_min = 1 |
| x_max = 2 |
| y_min = 1 |
| y_max = 2 |
| |
| arr(:,:) = 1.0 |
| |
| sum = 0.0 |
| |
| !$acc data copy(arr) |
| |
| call reduction_kernel(x_min,x_max,y_min,y_max,arr,sum) |
| |
| !$acc end data |
| |
| if (sum .ne. 4.0) STOP 1 |
| end program |