| ! { dg-do run } |
| ! |
| ! Test data located inside common blocks. This test does not exercise |
| ! ACC DECLARE. |
| |
| module const |
| integer, parameter :: n = 100 |
| end module const |
| |
| subroutine check |
| use const |
| |
| implicit none |
| integer i, x(n), y |
| common /BLOCK/ x, y |
| |
| do i = 1, n |
| if (x(i) .ne. y) stop 1 |
| end do |
| end subroutine check |
| |
| module m |
| use const |
| integer a(n), b |
| common /BLOCK/ a, b |
| |
| contains |
| subroutine mod_implicit_incr |
| implicit none |
| integer i |
| |
| !$acc parallel loop |
| do i = 1, n |
| a(i) = b |
| end do |
| !$acc end parallel loop |
| |
| call check |
| end subroutine mod_implicit_incr |
| |
| subroutine mod_explicit_incr |
| implicit none |
| integer i |
| |
| !$acc parallel loop copy(a(1:n)) copyin(b) |
| do i = 1, n |
| a(i) = b |
| end do |
| !$acc end parallel loop |
| |
| call check |
| end subroutine mod_explicit_incr |
| end module m |
| |
| subroutine sub_implicit_incr |
| use const |
| |
| implicit none |
| integer i, x(n), y |
| common /BLOCK/ x, y |
| |
| !$acc parallel loop |
| do i = 1, n |
| x(i) = y |
| end do |
| !$acc end parallel loop |
| |
| call check |
| end subroutine sub_implicit_incr |
| |
| subroutine sub_explicit_incr |
| use const |
| |
| implicit none |
| integer i, x(n), y |
| common /BLOCK/ x, y |
| |
| !$acc parallel loop copy(x(1:n)) copyin(y) |
| do i = 1, n |
| x(i) = y |
| end do |
| !$acc end parallel loop |
| |
| call check |
| end subroutine sub_explicit_incr |
| |
| program main |
| use m |
| |
| implicit none |
| |
| a(:) = -1 |
| b = 5 |
| call mod_implicit_incr |
| |
| a(:) = -2 |
| b = 6 |
| call mod_explicit_incr |
| |
| a(:) = -3 |
| b = 7 |
| call sub_implicit_incr |
| |
| a(:) = -4 |
| b = 8 |
| call sub_explicit_incr |
| end program main |