284 lines
4.6 KiB
Fortran
284 lines
4.6 KiB
Fortran
! Test ACC UPDATE with derived types.
|
|
|
|
! { dg-do run }
|
|
|
|
module dt
|
|
integer, parameter :: n = 10
|
|
type inner
|
|
integer :: d(n)
|
|
end type inner
|
|
type mytype
|
|
integer(8) :: a, b, c(n)
|
|
type(inner) :: in
|
|
end type mytype
|
|
end module dt
|
|
|
|
program derived_acc
|
|
use dt
|
|
|
|
implicit none
|
|
integer i, res
|
|
type(mytype) :: var
|
|
|
|
var%a = 0
|
|
var%b = 1
|
|
var%c(:) = 10
|
|
var%in%d(:) = 100
|
|
|
|
var%c(:) = 10
|
|
|
|
!$acc enter data copyin(var)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 1, 1
|
|
var%a = var%b
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%a)
|
|
|
|
if (var%a /= var%b) stop 1
|
|
|
|
var%b = 100
|
|
|
|
!$acc update device(var%b)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 1, 1
|
|
var%a = var%b
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%a)
|
|
|
|
if (var%a /= var%b) stop 2
|
|
|
|
!$acc parallel loop present (var)
|
|
do i = 1, n
|
|
var%c(i) = i
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%c)
|
|
|
|
var%a = -1
|
|
|
|
do i = 1, n
|
|
if (var%c(i) /= i) stop 3
|
|
var%c(i) = var%a
|
|
end do
|
|
|
|
!$acc update device(var%a)
|
|
!$acc update device(var%c)
|
|
|
|
res = 0
|
|
|
|
!$acc parallel loop present(var) reduction(+:res)
|
|
do i = 1, n
|
|
if (var%c(i) /= var%a) res = res + 1
|
|
end do
|
|
|
|
if (res /= 0) stop 4
|
|
|
|
var%c(:) = 0
|
|
|
|
!$acc update device(var%c)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 5, 5
|
|
var%c(i) = 1
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%c(5))
|
|
|
|
do i = 1, n
|
|
if (i /= 5 .and. var%c(i) /= 0) stop 5
|
|
if (i == 5 .and. var%c(i) /= 1) stop 6
|
|
end do
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 1, n
|
|
var%in%d = var%a
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%in%d)
|
|
|
|
do i = 1, n
|
|
if (var%in%d(i) /= var%a) stop 7
|
|
end do
|
|
|
|
var%c(:) = 0
|
|
|
|
!$acc update device(var%c)
|
|
|
|
var%c(:) = -1
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = n/2, n
|
|
var%c(i) = i
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%c(n/2:n))
|
|
|
|
do i = 1,n
|
|
if (i < n/2 .and. var%c(i) /= -1) stop 8
|
|
if (i >= n/2 .and. var%c(i) /= i) stop 9
|
|
end do
|
|
|
|
var%in%d(:) = 0
|
|
!$acc update device(var%in%d)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 5, 5
|
|
var%in%d(i) = 1
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%in%d(5))
|
|
|
|
do i = 1, n
|
|
if (i /= 5 .and. var%in%d(i) /= 0) stop 10
|
|
if (i == 5 .and. var%in%d(i) /= 1) stop 11
|
|
end do
|
|
|
|
!$acc exit data delete(var)
|
|
|
|
call derived_acc_subroutine(var)
|
|
end program derived_acc
|
|
|
|
subroutine derived_acc_subroutine(var)
|
|
use dt
|
|
|
|
implicit none
|
|
integer i, res
|
|
type(mytype) :: var
|
|
|
|
var%a = 0
|
|
var%b = 1
|
|
var%c(:) = 10
|
|
var%in%d(:) = 100
|
|
|
|
var%c(:) = 10
|
|
|
|
!$acc enter data copyin(var)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 1, 1
|
|
var%a = var%b
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%a)
|
|
|
|
if (var%a /= var%b) stop 12
|
|
|
|
var%b = 100
|
|
|
|
!$acc update device(var%b)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 1, 1
|
|
var%a = var%b
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%a)
|
|
|
|
if (var%a /= var%b) stop 13
|
|
|
|
!$acc parallel loop present (var)
|
|
do i = 1, n
|
|
var%c(i) = i
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%c)
|
|
|
|
var%a = -1
|
|
|
|
do i = 1, n
|
|
if (var%c(i) /= i) stop 14
|
|
var%c(i) = var%a
|
|
end do
|
|
|
|
!$acc update device(var%a)
|
|
!$acc update device(var%c)
|
|
|
|
res = 0
|
|
|
|
!$acc parallel loop present(var) reduction(+:res)
|
|
do i = 1, n
|
|
if (var%c(i) /= var%a) res = res + 1
|
|
end do
|
|
|
|
if (res /= 0) stop 15
|
|
|
|
var%c(:) = 0
|
|
|
|
!$acc update device(var%c)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 5, 5
|
|
var%c(i) = 1
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%c(5))
|
|
|
|
do i = 1, n
|
|
if (i /= 5 .and. var%c(i) /= 0) stop 16
|
|
if (i == 5 .and. var%c(i) /= 1) stop 17
|
|
end do
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 1, n
|
|
var%in%d = var%a
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%in%d)
|
|
|
|
do i = 1, n
|
|
if (var%in%d(i) /= var%a) stop 18
|
|
end do
|
|
|
|
var%c(:) = 0
|
|
|
|
!$acc update device(var%c)
|
|
|
|
var%c(:) = -1
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = n/2, n
|
|
var%c(i) = i
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%c(n/2:n))
|
|
|
|
do i = 1,n
|
|
if (i < n/2 .and. var%c(i) /= -1) stop 19
|
|
if (i >= n/2 .and. var%c(i) /= i) stop 20
|
|
end do
|
|
|
|
var%in%d(:) = 0
|
|
!$acc update device(var%in%d)
|
|
|
|
!$acc parallel loop present(var)
|
|
do i = 5, 5
|
|
var%in%d(i) = 1
|
|
end do
|
|
!$acc end parallel loop
|
|
|
|
!$acc update host(var%in%d(5))
|
|
|
|
do i = 1, n
|
|
if (i /= 5 .and. var%in%d(i) /= 0) stop 21
|
|
if (i == 5 .and. var%in%d(i) /= 1) stop 22
|
|
end do
|
|
|
|
!$acc exit data delete(var)
|
|
end subroutine derived_acc_subroutine
|