OpenACC 2.6 deep copy: Fortran execution tests

libgomp/
	* testsuite/libgomp.oacc-fortran/deep-copy-1.f90: New test.
	* testsuite/libgomp.oacc-fortran/deep-copy-2.f90: New test.
	* testsuite/libgomp.oacc-fortran/deep-copy-3.f90: New test.
	* testsuite/libgomp.oacc-fortran/deep-copy-4.f90: New test.
	* testsuite/libgomp.oacc-fortran/deep-copy-5.f90: New test.
	* testsuite/libgomp.oacc-fortran/deep-copy-6.f90: New test.
	* testsuite/libgomp.oacc-fortran/deep-copy-7.f90: New test.
	* testsuite/libgomp.oacc-fortran/deep-copy-8.f90: New test.
	* testsuite/libgomp.oacc-fortran/derived-type-1.f90: New test.
	* testsuite/libgomp.oacc-fortran/derivedtype-1.f95: New test.
	* testsuite/libgomp.oacc-fortran/derivedtype-2.f95: New test.
	* testsuite/libgomp.oacc-fortran/multidim-slice.f95: New test.
	* testsuite/libgomp.oacc-fortran/update-2.f90: New test.

Co-Authored-By: Cesar Philippidis <cesar@codesourcery.com>

From-SVN: r279630
This commit is contained in:
Julian Brown 2019-12-20 01:39:46 +00:00 committed by Julian Brown
parent c2eb021fd2
commit 02817027ca
14 changed files with 849 additions and 0 deletions

View File

@ -1,3 +1,20 @@
2019-12-19 Julian Brown <julian@codesourcery.com>
Cesar Philippidis <cesar@codesourcery.com>
* testsuite/libgomp.oacc-fortran/deep-copy-1.f90: New test.
* testsuite/libgomp.oacc-fortran/deep-copy-2.f90: New test.
* testsuite/libgomp.oacc-fortran/deep-copy-3.f90: New test.
* testsuite/libgomp.oacc-fortran/deep-copy-4.f90: New test.
* testsuite/libgomp.oacc-fortran/deep-copy-5.f90: New test.
* testsuite/libgomp.oacc-fortran/deep-copy-6.f90: New test.
* testsuite/libgomp.oacc-fortran/deep-copy-7.f90: New test.
* testsuite/libgomp.oacc-fortran/deep-copy-8.f90: New test.
* testsuite/libgomp.oacc-fortran/derived-type-1.f90: New test.
* testsuite/libgomp.oacc-fortran/derivedtype-1.f95: New test.
* testsuite/libgomp.oacc-fortran/derivedtype-2.f95: New test.
* testsuite/libgomp.oacc-fortran/multidim-slice.f95: New test.
* testsuite/libgomp.oacc-fortran/update-2.f90: New test.
2019-12-19 Julian Brown <julian@codesourcery.com>
* testsuite/libgomp.oacc-c-c++-common/deep-copy-1.c: New test.

View File

@ -0,0 +1,35 @@
! { dg-do run }
! Test of attach/detach with "acc data".
program dtype
implicit none
integer, parameter :: n = 512
type mytype
integer, allocatable :: a(:)
end type mytype
integer i
type(mytype) :: var
allocate(var%a(1:n))
!$acc data copy(var)
!$acc data copy(var%a)
!$acc parallel loop
do i = 1,n
var%a(i) = i
end do
!$acc end parallel loop
!$acc end data
!$acc end data
do i = 1,n
if (i .ne. var%a(i)) stop 1
end do
deallocate(var%a)
end program dtype

View File

@ -0,0 +1,33 @@
! { dg-do run }
! Test of attach/detach with "acc data", two clauses at once.
program dtype
implicit none
integer, parameter :: n = 512
type mytype
integer, allocatable :: a(:)
end type mytype
integer i
type(mytype) :: var
allocate(var%a(1:n))
!$acc data copy(var) copy(var%a)
!$acc parallel loop
do i = 1,n
var%a(i) = i
end do
!$acc end parallel loop
!$acc end data
do i = 1,n
if (i .ne. var%a(i)) stop 1
end do
deallocate(var%a)
end program dtype

View File

@ -0,0 +1,34 @@
! { dg-do run }
! Test of attach/detach with "acc parallel".
program dtype
implicit none
integer, parameter :: n = 512
type mytype
integer, allocatable :: a(:)
integer, allocatable :: b(:)
end type mytype
integer i
type(mytype) :: var
allocate(var%a(1:n))
allocate(var%b(1:n))
!$acc parallel loop copy(var) copy(var%a(1:n)) copy(var%b(1:n))
do i = 1,n
var%a(i) = i
var%b(i) = i
end do
!$acc end parallel loop
do i = 1,n
if (i .ne. var%a(i)) stop 1
if (i .ne. var%b(i)) stop 2
end do
deallocate(var%a)
deallocate(var%b)
end program dtype

View File

@ -0,0 +1,49 @@
! { dg-do run }
! Test of attach/detach with "acc enter/exit data".
program dtype
implicit none
integer, parameter :: n = 512
type mytype
integer, allocatable :: a(:)
integer, allocatable :: b(:)
end type mytype
integer, allocatable :: r(:)
integer i
type(mytype) :: var
allocate(var%a(1:n))
allocate(var%b(1:n))
allocate(r(1:n))
!$acc enter data copyin(var)
!$acc enter data copyin(var%a, var%b, r)
!$acc parallel loop
do i = 1,n
var%a(i) = i
var%b(i) = i * 2
r(i) = i * 3
end do
!$acc end parallel loop
!$acc exit data copyout(var%a)
!$acc exit data copyout(var%b)
!$acc exit data copyout(r)
do i = 1,n
if (i .ne. var%a(i)) stop 1
if (i * 2 .ne. var%b(i)) stop 2
if (i * 3 .ne. r(i)) stop 3
end do
!$acc exit data delete(var)
deallocate(var%a)
deallocate(var%b)
deallocate(r)
end program dtype

View File

@ -0,0 +1,57 @@
! { dg-do run }
! Test of attach/detach, "enter data" inside "data", and subarray.
program dtype
implicit none
integer, parameter :: n = 512
type mytype
integer, allocatable :: a(:)
integer, allocatable :: b(:)
end type mytype
integer i
type(mytype) :: var
allocate(var%a(1:n))
allocate(var%b(1:n))
!$acc data copy(var)
do i = 1, n
var%a(i) = 0
var%b(i) = 0
end do
!$acc enter data copyin(var%a(5:n - 5), var%b(5:n - 5))
!$acc parallel loop
do i = 5,n - 5
var%a(i) = i
var%b(i) = i * 2
end do
!$acc end parallel loop
!$acc exit data copyout(var%a(5:n - 5), var%b(5:n - 5))
!$acc end data
do i = 1,4
if (var%a(i) .ne. 0) stop 1
if (var%b(i) .ne. 0) stop 2
end do
do i = 5,n - 5
if (i .ne. var%a(i)) stop 3
if (i * 2 .ne. var%b(i)) stop 4
end do
do i = n - 4,n
if (var%a(i) .ne. 0) stop 5
if (var%b(i) .ne. 0) stop 6
end do
deallocate(var%a)
deallocate(var%b)
end program dtype

View File

@ -0,0 +1,61 @@
! { dg-do run }
! Test of attachment counters and finalize.
program dtype
implicit none
integer, parameter :: n = 512
type mytype
integer, allocatable :: a(:)
integer, allocatable :: b(:)
end type mytype
integer i
type(mytype) :: var
allocate(var%a(1:n))
allocate(var%b(1:n))
!$acc data copy(var)
do i = 1, n
var%a(i) = 0
var%b(i) = 0
end do
!$acc enter data copyin(var%a(5:n - 5), var%b(5:n - 5))
do i = 1,20
!$acc enter data attach(var%a)
end do
!$acc parallel loop
do i = 5,n - 5
var%a(i) = i
var%b(i) = i * 2
end do
!$acc end parallel loop
!$acc exit data copyout(var%a(5:n - 5), var%b(5:n - 5)) finalize
!$acc end data
do i = 1,4
if (var%a(i) .ne. 0) stop 1
if (var%b(i) .ne. 0) stop 2
end do
do i = 5,n - 5
if (i .ne. var%a(i)) stop 3
if (i * 2 .ne. var%b(i)) stop 4
end do
do i = n - 4,n
if (var%a(i) .ne. 0) stop 5
if (var%b(i) .ne. 0) stop 6
end do
deallocate(var%a)
deallocate(var%b)
end program dtype

View File

@ -0,0 +1,89 @@
! { dg-do run }
! Test of attach/detach with scalar elements and nested derived types.
program dtype
implicit none
integer, parameter :: n = 512
type subtype
integer :: g, h
integer, allocatable :: q(:)
end type subtype
type mytype
integer, allocatable :: a(:)
integer, allocatable :: c, d
integer, allocatable :: b(:)
integer :: f
type(subtype) :: s
end type mytype
integer i
type(mytype) :: var
allocate(var%a(1:n))
allocate(var%b(1:n))
allocate(var%c)
allocate(var%d)
allocate(var%s%q(1:n))
var%c = 16
var%d = 20
var%f = 7
var%s%g = 21
var%s%h = 38
!$acc enter data copyin(var)
do i = 1, n
var%a(i) = 0
var%b(i) = 0
var%s%q(i) = 0
end do
!$acc data copy(var%a(5:n - 5), var%b(5:n - 5), var%c, var%d) &
!$acc & copy(var%s%q)
!$acc parallel loop default(none) present(var)
do i = 5,n - 5
var%a(i) = i
var%b(i) = i * 2
var%s%q(i) = i * 3
var%s%g = 100
var%s%h = 101
end do
!$acc end parallel loop
!$acc end data
!$acc exit data copyout(var)
do i = 1,4
if (var%a(i) .ne. 0) stop 1
if (var%b(i) .ne. 0) stop 2
if (var%s%q(i) .ne. 0) stop 3
end do
do i = 5,n - 5
if (i .ne. var%a(i)) stop 4
if (i * 2 .ne. var%b(i)) stop 5
if (i * 3 .ne. var%s%q(i)) stop 6
end do
do i = n - 4,n
if (var%a(i) .ne. 0) stop 7
if (var%b(i) .ne. 0) stop 8
if (var%s%q(i) .ne. 0) stop 9
end do
if (var%c .ne. 16) stop 10
if (var%d .ne. 20) stop 11
if (var%s%g .ne. 100 .or. var%s%h .ne. 101) stop 12
if (var%f .ne. 7) stop 13
deallocate(var%a)
deallocate(var%b)
deallocate(var%c)
deallocate(var%d)
deallocate(var%s%q)
end program dtype

View File

@ -0,0 +1,41 @@
! { dg-do run }
! Test of explicit attach/detach clauses and attachment counters. There are no
! acc_attach/acc_detach API routines in Fortran.
program dtype
use openacc
implicit none
integer, parameter :: n = 512
type mytype
integer, allocatable :: a(:)
end type mytype
integer i
type(mytype) :: var
allocate(var%a(1:n))
call acc_copyin(var)
call acc_copyin(var%a)
!$acc enter data attach(var%a)
!$acc parallel loop attach(var%a)
do i = 1,n
var%a(i) = i
end do
!$acc end parallel loop
!$acc exit data detach(var%a)
call acc_copyout(var%a)
call acc_copyout(var)
do i = 1,n
if (i .ne. var%a(i)) stop 1
end do
deallocate(var%a)
end program dtype

View File

@ -0,0 +1,28 @@
! Test derived types with subarrays
! { dg-do run }
implicit none
type dtype
integer :: a, b, c
end type dtype
integer, parameter :: n = 100
integer i
type (dtype), dimension(n) :: d
!$acc data copy(d(1:n))
!$acc parallel loop
do i = 1, n
d(i)%a = i
d(i)%b = i-1
d(i)%c = i+1
end do
!$acc end data
do i = 1, n
if (d(i)%a /= i) stop 1
if (d(i)%b /= i-1) stop 2
if (d(i)%c /= i+1) stop 3
end do
end program

View File

@ -0,0 +1,30 @@
! { dg-do run }
program main
implicit none
type mytype
integer :: a, b, c
end type mytype
type(mytype) :: myvar
integer :: i
myvar%a = 0
myvar%b = 0
myvar%c = 0
!$acc enter data copyin(myvar)
!$acc parallel present(myvar)
myvar%a = 1
myvar%b = 2
myvar%c = 3
!$acc end parallel
!$acc exit data copyout(myvar)
if (myvar%a .ne. 1) stop 1
if (myvar%b .ne. 2) stop 2
if (myvar%c .ne. 3) stop 3
end program main

View File

@ -0,0 +1,41 @@
! { dg-do run }
program main
implicit none
type tnest
integer :: ia, ib, ic
end type tnest
type mytype
type(tnest) :: nest
integer :: a, b, c
end type mytype
type(mytype) :: myvar
integer :: i
myvar%a = 0
myvar%b = 0
myvar%c = 0
myvar%nest%ia = 0
myvar%nest%ib = 0
myvar%nest%ic = 0
!$acc enter data copyin(myvar%nest)
!$acc parallel present(myvar%nest)
myvar%nest%ia = 4
myvar%nest%ib = 5
myvar%nest%ic = 6
!$acc end parallel
!$acc exit data copyout(myvar%nest)
if (myvar%a .ne. 0) stop 1
if (myvar%b .ne. 0) stop 2
if (myvar%c .ne. 0) stop 3
if (myvar%nest%ia .ne. 4) stop 4
if (myvar%nest%ib .ne. 5) stop 5
if (myvar%nest%ic .ne. 6) stop 6
end program main

View File

@ -0,0 +1,50 @@
! { dg-do run }
program main
implicit none
real, allocatable :: myarr(:,:,:,:,:)
integer i, j, k, l, m
allocate(myarr(1:10,1:10,1:10,1:10,1:10))
do i=1,10
do j=1,10
do k=1,10
do l=1,10
do m=1,10
myarr(m,l,k,j,i) = i+j+k+l+m
end do
end do
end do
end do
end do
do i=1,10
!$acc data copy(myarr(:,:,:,:,i))
!$acc parallel loop collapse(4) present(myarr(:,:,:,:,i))
do j=1,10
do k=1,10
do l=1,10
do m=1,10
myarr(m,l,k,j,i) = myarr(m,l,k,j,i) + 1
end do
end do
end do
end do
!$acc end parallel loop
!$acc end data
end do
do i=1,10
do j=1,10
do k=1,10
do l=1,10
do m=1,10
if (myarr(m,l,k,j,i) .ne. i+j+k+l+m+1) stop 1
end do
end do
end do
end do
end do
end program main

View File

@ -0,0 +1,284 @@
! 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