diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2016-03-30 17:08:47 +0200 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gcc.gnu.org> | 2016-03-30 17:08:47 +0200 |
commit | 2620c80db02d5e32ffb5b54b80be67fcc7843d20 (patch) | |
tree | 644cb73427c8a0d16b846a71d030b324e252a3af /libgomp/testsuite/libgomp.oacc-fortran | |
parent | ba9c755f257ad36eaa7335c48008c76c27c0b30c (diff) | |
download | gcc-2620c80db02d5e32ffb5b54b80be67fcc7843d20.zip gcc-2620c80db02d5e32ffb5b54b80be67fcc7843d20.tar.gz gcc-2620c80db02d5e32ffb5b54b80be67fcc7843d20.tar.bz2 |
Update OpenACC test cases
gcc/testsuite/
* c-c++-common/goacc/combined-directives.c: Clean up dg-*
directives.
* c-c++-common/goacc/loop-clauses.c: Likewise.
* g++.dg/goacc/template.C: Likewise.
* gfortran.dg/goacc/combined-directives.f90: Likewise.
* gfortran.dg/goacc/loop-1.f95: Likewise.
* gfortran.dg/goacc/loop-5.f95: Likewise.
* gfortran.dg/goacc/loop-6.f95: Likewise.
* gfortran.dg/goacc/loop-tree-1.f90: Likewise.
* c-c++-common/goacc-gomp/nesting-1.c: Update.
* c-c++-common/goacc-gomp/nesting-fail-1.c: Likewise.
* c-c++-common/goacc/clauses-fail.c: Likewise.
* c-c++-common/goacc/parallel-1.c: Likewise.
* c-c++-common/goacc/reduction-1.c: Likewise.
* c-c++-common/goacc/reduction-2.c: Likewise.
* c-c++-common/goacc/reduction-3.c: Likewise.
* c-c++-common/goacc/reduction-4.c: Likewise.
* c-c++-common/goacc/routine-3.c: Likewise.
* c-c++-common/goacc/routine-4.c: Likewise.
* c-c++-common/goacc/routine-5.c: Likewise.
* c-c++-common/goacc/tile.c: Likewise.
* g++.dg/goacc/template.C: Likewise.
* gfortran.dg/goacc/combined-directives.f90: Likewise.
* c-c++-common/goacc/nesting-1.c: Move dg-error test cases into...
* c-c++-common/goacc/nesting-fail-1.c: ... this file. Update.
* c-c++-common/goacc/kernels-1.c: Update. Incorporate...
* c-c++-common/goacc/kernels-empty.c: ... this file, and...
* c-c++-common/goacc/kernels-eternal.c: ... this file, and...
* c-c++-common/goacc/kernels-noreturn.c: ... this file.
* c-c++-common/goacc/host_data-1.c: New file. Incorporate...
* c-c++-common/goacc/use_device-1.c: ... this file.
* c-c++-common/goacc/host_data-2.c: New file. Incorporate...
* c-c++-common/goacc/host_data-5.c: ... this file, and...
* c-c++-common/goacc/host_data-6.c: ... this file.
* c-c++-common/goacc/loop-2-kernels.c: New file.
* c-c++-common/goacc/loop-2-parallel.c: Likewise.
* c-c++-common/goacc/loop-3.c: Likewise.
* g++.dg/goacc/reference.C: Likewise.
* g++.dg/goacc/routine-1.C: Likewise.
* g++.dg/goacc/routine-2.C: Likewise.
libgomp/
* testsuite/libgomp.oacc-c-c++-common/clauses-1.c: Update.
* testsuite/libgomp.oacc-c-c++-common/deviceptr-1.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/if-1.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/vector-loop.c: Likewise.
* testsuite/libgomp.oacc-fortran/asyncwait-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/asyncwait-2.f90: Likewise.
* testsuite/libgomp.oacc-fortran/asyncwait-3.f90: Likewise.
* testsuite/libgomp.oacc-fortran/declare-1.f90: Likewise.
* testsuite/libgomp.oacc-c-c++-common/asyncwait-1.c: Likewise.
XFAIL.
* testsuite/libgomp.oacc-c-c++-common/firstprivate-1.c: Update.
Incorporate...
* testsuite/libgomp.oacc-c-c++-common/firstprivate-2.c: ... this
file.
* testsuite/libgomp.oacc-c++/template-reduction.C: New file.
* testsuite/libgomp.oacc-c-c++-common/gang-static-1.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/gang-static-2.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/kernels-loop-clauses.c:
Likewise.
* testsuite/libgomp.oacc-c-c++-common/private-variables.c:
Likewise.
* testsuite/libgomp.oacc-c-c++-common/reduction-7.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/routine-1.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/routine-4.c: Likewise.
* testsuite/libgomp.oacc-c-c++-common/routine-wv-2.c: Likewise.
* testsuite/libgomp.oacc-fortran/clauses-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/default-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/firstprivate-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/gang-static-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/if-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/implicit-firstprivate-ref.f90:
Likewise.
* testsuite/libgomp.oacc-fortran/pr68813.f90: Likewise.
* testsuite/libgomp.oacc-fortran/private-variables.f90: Likewise.
* testsuite/libgomp.oacc-c-c++-common/kernels-1.c: Merge this
file...
* testsuite/libgomp.oacc-c-c++-common/parallel-1.c: ..., and this
file into...
* testsuite/libgomp.oacc-c-c++-common/data-clauses.h: ... this new
file. Update.
* testsuite/libgomp.oacc-c-c++-common/data-clauses-kernels.c: New
file.
* testsuite/libgomp.oacc-c-c++-common/data-clauses-parallel.c:
Likewise.
* testsuite/libgomp.oacc-c-c++-common/kernels-2.c: Rename to...
* testsuite/libgomp.oacc-c-c++-common/data-clauses-kernels-ipa-pta.c:
... this new file. Update.
* testsuite/libgomp.oacc-c-c++-common/parallel-2.c: Rename to...
* testsuite/libgomp.oacc-c-c++-common/data-clauses-parallel-ipa-pta.c:
... this new file. Update.
* testsuite/libgomp.oacc-c-c++-common/mode-transitions.c: New
file. Incorporate...
* testsuite/libgomp.oacc-c-c++-common/worker-single-1a.c: ... this
file, and...
* testsuite/libgomp.oacc-c-c++-common/worker-single-4.c: ... this
file, and...
* testsuite/libgomp.oacc-c-c++-common/worker-single-6.c: ... this
file.
* testsuite/libgomp.oacc-c-c++-common/update-1-2.c: Remove file.
Co-Authored-By: Cesar Philippidis <cesar@codesourcery.com>
Co-Authored-By: Chung-Lin Tang <cltang@codesourcery.com>
Co-Authored-By: James Norris <jnorris@codesourcery.com>
Co-Authored-By: Julian Brown <julian@codesourcery.com>
Co-Authored-By: Nathan Sidwell <nathan@codesourcery.com>
Co-Authored-By: Tom de Vries <tom@codesourcery.com>
From-SVN: r234575
Diffstat (limited to 'libgomp/testsuite/libgomp.oacc-fortran')
12 files changed, 2146 insertions, 33 deletions
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-1.f90 index b6e637b..01728bd 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-1.f90 +++ b/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-1.f90 @@ -132,4 +132,126 @@ program asyncwait if (d(i) .ne. 1.0) call abort if (e(i) .ne. 11.0) call abort end do + + a(:) = 3.0 + b(:) = 0.0 + + !$acc data copy (a(1:N)) copy (b(1:N)) + + !$acc kernels async + !$acc loop + do i = 1, N + b(i) = a(i) + end do + !$acc end kernels + + !$acc wait + !$acc end data + + do i = 1, N + if (a(i) .ne. 3.0) call abort + if (b(i) .ne. 3.0) call abort + end do + + a(:) = 2.0 + b(:) = 0.0 + + !$acc data copy (a(1:N)) copy (b(1:N)) + + !$acc kernels async (1) + !$acc loop + do i = 1, N + b(i) = a(i) + end do + !$acc end kernels + + !$acc wait (1) + !$acc end data + + do i = 1, N + if (a(i) .ne. 2.0) call abort + if (b(i) .ne. 2.0) call abort + end do + + a(:) = 3.0 + b(:) = 0.0 + c(:) = 0.0 + d(:) = 0.0 + + !$acc data copy (a(1:N)) copy (b(1:N)) copy (c(1:N)) copy (d(1:N)) + + !$acc kernels async (1) + do i = 1, N + b(i) = (a(i) * a(i) * a(i)) / a(i) + end do + !$acc end kernels + + !$acc kernels async (1) + do i = 1, N + c(i) = (a(i) * 4) / a(i) + end do + !$acc end kernels + + !$acc kernels async (1) + !$acc loop + do i = 1, N + d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i) + end do + !$acc end kernels + + !$acc wait (1) + !$acc end data + + do i = 1, N + if (a(i) .ne. 3.0) call abort + if (b(i) .ne. 9.0) call abort + if (c(i) .ne. 4.0) call abort + if (d(i) .ne. 1.0) call abort + end do + + a(:) = 2.0 + b(:) = 0.0 + c(:) = 0.0 + d(:) = 0.0 + e(:) = 0.0 + + !$acc data copy (a(1:N), b(1:N), c(1:N), d(1:N), e(1:N)) + + !$acc kernels async (1) + do i = 1, N + b(i) = (a(i) * a(i) * a(i)) / a(i) + end do + !$acc end kernels + + !$acc kernels async (1) + !$acc loop + do i = 1, N + c(i) = (a(i) * 4) / a(i) + end do + !$acc end kernels + + !$acc kernels async (1) + !$acc loop + do i = 1, N + d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i) + end do + !$acc end kernels + + !$acc kernels wait (1) async (1) + !$acc loop + do i = 1, N + e(i) = a(i) + b(i) + c(i) + d(i) + end do + !$acc end kernels + + !$acc wait (1) + !$acc end data + + do i = 1, N + if (a(i) .ne. 2.0) call abort + if (b(i) .ne. 4.0) call abort + if (c(i) .ne. 4.0) call abort + if (d(i) .ne. 1.0) call abort + if (e(i) .ne. 11.0) call abort + end do end program asyncwait diff --git a/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-2.f90 b/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-2.f90 index bade52b..fe131b6 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-2.f90 +++ b/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-2.f90 @@ -1,6 +1,6 @@ ! { dg-do run } -program parallel_wait +program asyncwait integer, parameter :: N = 64 real, allocatable :: a(:), b(:), c(:) integer i @@ -33,8 +33,33 @@ program parallel_wait do i = 1, N if (c(i) .ne. 2.0) call abort end do + + !$acc kernels async (0) + !$acc loop + do i = 1, N + a(i) = 1 + end do + !$acc end kernels + + !$acc kernels async (1) + !$acc loop + do i = 1, N + b(i) = 1 + end do + !$acc end kernels + + !$acc kernels wait (0, 1) + !$acc loop + do i = 1, N + c(i) = a(i) + b(i) + end do + !$acc end kernels + + do i = 1, N + if (c(i) .ne. 2.0) call abort + end do deallocate (a) deallocate (b) deallocate (c) -end program parallel_wait +end program asyncwait diff --git a/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-3.f90 b/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-3.f90 index d48dc11..fa96a01 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-3.f90 +++ b/libgomp/testsuite/libgomp.oacc-fortran/asyncwait-3.f90 @@ -1,6 +1,6 @@ ! { dg-do run } -program parallel_wait +program asyncwait integer, parameter :: N = 64 real, allocatable :: a(:), b(:), c(:) integer i @@ -35,8 +35,35 @@ program parallel_wait do i = 1, N if (c(i) .ne. 2.0) call abort end do + + !$acc kernels async (0) + !$acc loop + do i = 1, N + a(i) = 1 + end do + !$acc end kernels + + !$acc kernels async (1) + !$acc loop + do i = 1, N + b(i) = 1 + end do + !$acc end kernels + + !$acc wait (0, 1) + + !$acc kernels + !$acc loop + do i = 1, N + c(i) = a(i) + b(i) + end do + !$acc end kernels + + do i = 1, N + if (c(i) .ne. 2.0) call abort + end do deallocate (a) deallocate (b) deallocate (c) -end program parallel_wait +end program asyncwait diff --git a/libgomp/testsuite/libgomp.oacc-fortran/clauses-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/clauses-1.f90 new file mode 100644 index 0000000..e6ab78d --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/clauses-1.f90 @@ -0,0 +1,290 @@ +! { dg-do run } +! { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } + +program main + use openacc + implicit none + + integer, parameter :: N = 32 + real, allocatable :: a(:), b(:), c(:) + integer i + + i = 0 + + allocate (a(N)) + allocate (b(N)) + allocate (c(N)) + + a(:) = 3.0 + b(:) = 0.0 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 3.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 5.0 + b(:) = 1.0 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 5.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 6.0 + b(:) = 0.0 + + call acc_copyin (a, sizeof (a)) + + a(:) = 9.0 + + !$acc parallel present_or_copyin (a(1:N)) copyout (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 6.0) call abort + end do + + call acc_copyout (a, sizeof (a)) + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 6.0 + b(:) = 0.0 + + !$acc parallel copyin (a(1:N)) present_or_copyout (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 6.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 5.0 + b(:) = 2.0 + + call acc_copyin (b, sizeof (b)) + + !$acc parallel copyin (a(1:N)) present_or_copyout (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + do i = 1, N + if (a(i) .ne. 5.0) call abort + if (b(i) .ne. 2.0) call abort + end do + + call acc_copyout (b, sizeof (b)) + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 3.0; + b(:) = 4.0; + + !$acc parallel copy (a(1:N)) copyout (b(1:N)) + do i = 1, N + a(i) = a(i) + 1 + b(i) = a(i) + 2 + end do + !$acc end parallel + + do i = 1, N + if (a(i) .ne. 4.0) call abort + if (b(i) .ne. 6.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 4.0 + b(:) = 7.0 + + !$acc parallel present_or_copy (a(1:N)) present_or_copy (b(1:N)) + do i = 1, N + a(i) = a(i) + 1 + b(i) = b(i) + 2 + end do + !$acc end parallel + + do i = 1, N + if (a(i) .ne. 5.0) call abort + if (b(i) .ne. 9.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 3.0 + b(:) = 7.0 + + call acc_copyin (a, sizeof (a)) + call acc_copyin (b, sizeof (b)) + + !$acc parallel present_or_copy (a(1:N)) present_or_copy (b(1:N)) + do i = 1, N + a(i) = a(i) + 1 + b(i) = b(i) + 2 + end do + !$acc end parallel + + do i = 1, N + if (a(i) .ne. 3.0) call abort + if (b(i) .ne. 7.0) call abort + end do + + call acc_copyout (a, sizeof (a)) + call acc_copyout (b, sizeof (b)) + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 3.0 + b(:) = 7.0 + + !$acc parallel copyin (a(1:N)) create (c(1:N)) copyout (b(1:N)) + do i = 1, N + c(i) = a(i) + b(i) = c(i) + end do + !$acc end parallel + + do i = 1, N + if (a(i) .ne. 3.0) call abort + if (b(i) .ne. 3.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + if (acc_is_present (c) .eqv. .TRUE.) call abort + + a(:) = 4.0 + b(:) = 8.0 + + !$acc parallel copyin (a(1:N)) present_or_create (c(1:N)) copyout (b(1:N)) + do i = 1, N + c(i) = a(i) + b(i) = c(i) + end do + !$acc end parallel + + do i = 1, N + if (a(i) .ne. 4.0) call abort + if (b(i) .ne. 4.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + if (acc_is_present (c) .eqv. .TRUE.) call abort + + a(:) = 4.0 + + call acc_copyin (a, sizeof (a)) + call acc_copyin (b, sizeof (b)) + call acc_copyin (c, sizeof (c)) + + !$acc parallel present (a(1:N)) present (c(1:N)) present (b(1:N)) + do i = 1, N + c(i) = a(i) + b(i) = c(i) + end do + !$acc end parallel + + call acc_copyout (a, sizeof (a)) + call acc_copyout (b, sizeof (b)) + call acc_copyout (c, sizeof (c)) + + do i = 1, N + if (a(i) .ne. 4.0) call abort + if (b(i) .ne. 4.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + if (acc_is_present (c) .eqv. .TRUE.) call abort + + a(:) = 6.0 + b(:) = 0.0 + + call acc_copyin (a, sizeof (a)) + + a(:) = 9.0 + + !$acc parallel pcopyin (a(1:N)) copyout (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 6.0) call abort + end do + + call acc_copyout (a, sizeof (a)) + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 6.0 + b(:) = 0.0 + + !$acc parallel copyin (a(1:N)) pcopyout (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 6.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + + a(:) = 5.0 + b(:) = 7.0 + + !$acc parallel copyin (a(1:N)) pcreate (c(1:N)) copyout (b(1:N)) + do i = 1, N + c(i) = a(i) + b(i) = c(i) + end do + !$acc end parallel + + do i = 1, N + if (a(i) .ne. 5.0) call abort + if (b(i) .ne. 5.0) call abort + end do + + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort + if (acc_is_present (c) .eqv. .TRUE.) call abort + +end program main diff --git a/libgomp/testsuite/libgomp.oacc-fortran/declare-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/declare-1.f90 index f717d1b..2d4b707 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/declare-1.f90 +++ b/libgomp/testsuite/libgomp.oacc-fortran/declare-1.f90 @@ -1,29 +1,22 @@ ! { dg-do run { target openacc_nvidia_accel_selected } } +! Tests to exercise the declare directive along with +! the clauses: copy +! copyin +! copyout +! create +! present +! present_or_copy +! present_or_copyin +! present_or_copyout +! present_or_create + module vars implicit none integer z !$acc declare create (z) end module vars -subroutine subr6 (a, d) - implicit none - integer, parameter :: N = 8 - integer :: i - integer :: a(N) - !$acc declare deviceptr (a) - integer :: d(N) - - i = 0 - - !$acc parallel copy (d) - do i = 1, N - d(i) = a(i) + a(i) - end do - !$acc end parallel - -end subroutine - subroutine subr5 (a, b, c, d) implicit none integer, parameter :: N = 8 @@ -201,15 +194,6 @@ subroutine subr0 (a, b, c, d) if (d(i) .ne. 13) call abort end do - call subr6 (a, d) - - call test (a, .true.) - call test (d, .false.) - - do i = 1, N - if (d(i) .ne. 16) call abort - end do - end subroutine program main @@ -241,8 +225,7 @@ program main if (a(i) .ne. 8) call abort if (b(i) .ne. 8) call abort if (c(i) .ne. 8) call abort - if (d(i) .ne. 16) call abort + if (d(i) .ne. 13) call abort end do - end program diff --git a/libgomp/testsuite/libgomp.oacc-fortran/default-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/default-1.f90 new file mode 100644 index 0000000..1059089 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/default-1.f90 @@ -0,0 +1,54 @@ +! { dg-do run } + +program main + implicit none + real a, b + real c + !$acc declare create (c) + + a = 2.0 + b = 0.0 + + !$acc parallel copy (a) create (b) default (none) + b = a + a = 1.0 + a = a + b + !$acc end parallel + + if (a .ne. 3.0) call abort + + !$acc kernels copy (a) create (b) default (none) + b = a + a = 1.0 + a = a + b + !$acc end kernels + + if (a .ne. 4.0) call abort + + !$acc parallel default (none) copy (a) create (b) + b = a + a = 1.0 + a = a + b + !$acc end parallel + + if (a .ne. 5.0) call abort + + !$acc parallel default (none) copy (a) + c = a + a = 1.0 + a = a + c + !$acc end parallel + + if (a .ne. 6.0) call abort + + !$acc data copy (a) + !$acc parallel default (none) + c = a + a = 1.0 + a = a + c + !$acc end parallel + !$acc end data + + if (a .ne. 7.0) call abort + +end program main diff --git a/libgomp/testsuite/libgomp.oacc-fortran/firstprivate-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/firstprivate-1.f90 new file mode 100644 index 0000000..d3f9093 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/firstprivate-1.f90 @@ -0,0 +1,42 @@ +! { dg-do run } + +program firstprivate + integer, parameter :: Nupper=100 + integer :: a, b(Nupper), c, d, n + include "openacc_lib.h" + + if (acc_get_device_type () .eq. acc_device_nvidia) then + n = Nupper + else + n = 1 + end if + + b(:) = -1 + a = 5 + + !$acc parallel firstprivate (a) num_gangs (n) + !$acc loop gang + do i = 1, n + a = a + i + b(i) = a + end do + !$acc end parallel + + do i = 1, n + if (b(i) .ne. i + a) call abort () + end do + + !$acc data copy (a) + !$acc parallel firstprivate (a) copyout (c) + a = 10 + c = a + !$acc end parallel + + !$acc parallel copyout (d) present (a) + d = a + !$acc end parallel + !$acc end data + + if (c .ne. 10) call abort () + if (d .ne. 5) call abort () +end program firstprivate diff --git a/libgomp/testsuite/libgomp.oacc-fortran/gang-static-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/gang-static-1.f90 new file mode 100644 index 0000000..7d56060 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/gang-static-1.f90 @@ -0,0 +1,79 @@ +! { dg-do run } + +program main + integer, parameter :: n = 100 + integer i, a(n), b(n) + integer x + + do i = 1, n + b(i) = i + end do + + !$acc parallel loop gang (static:*) num_gangs (10) + do i = 1, n + a(i) = b(i) + 0 + end do + !$acc end parallel loop + + call test (a, b, 0, n) + + !$acc parallel loop gang (static:1) num_gangs (10) + do i = 1, n + a(i) = b(i) + 1 + end do + !$acc end parallel loop + + call test (a, b, 1, n) + + !$acc parallel loop gang (static:2) num_gangs (10) + do i = 1, n + a(i) = b(i) + 2 + end do + !$acc end parallel loop + + call test (a, b, 2, n) + + !$acc parallel loop gang (static:5) num_gangs (10) + do i = 1, n + a(i) = b(i) + 5 + end do + !$acc end parallel loop + + call test (a, b, 5, n) + + !$acc parallel loop gang (static:20) num_gangs (10) + do i = 1, n + a(i) = b(i) + 20 + end do + !$acc end parallel loop + + call test (a, b, 20, n) + + x = 5 + !$acc parallel loop gang (static:0+x) num_gangs (10) + do i = 1, n + a(i) = b(i) + 5 + end do + !$acc end parallel loop + + call test (a, b, 5, n) + + x = 10 + !$acc parallel loop gang (static:x) num_gangs (10) + do i = 1, n + a(i) = b(i) + 10 + end do + !$acc end parallel loop + + call test (a, b, 10, n) +end program main + +subroutine test (a, b, sarg, n) + integer n + integer a (n), b(n), sarg + integer i + + do i = 1, n + if (a(i) .ne. b(i) + sarg) call abort () + end do +end subroutine test diff --git a/libgomp/testsuite/libgomp.oacc-fortran/if-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/if-1.f90 new file mode 100644 index 0000000..44055e1 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/if-1.f90 @@ -0,0 +1,886 @@ +! { dg-do run } +! { dg-additional-options "-cpp" } + +program main + use openacc + implicit none + + integer, parameter :: N = 8 + integer, parameter :: one = 1 + integer, parameter :: zero = 0 + integer i, nn + real, allocatable :: a(:), b(:) + real exp, exp2 + + i = 0 + + allocate (a(N)) + allocate (b(N)) + + a(:) = 4.0 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if (1 == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + +#if ACC_MEM_SHARED + exp = 5.0 +#else + exp = 4.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 16.0 + + !$acc parallel if (0 == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 17.0) call abort + end do + + a(:) = 8.0 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if (one == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + +#if ACC_MEM_SHARED + exp = 9.0 +#else + exp = 8.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 22.0 + + !$acc parallel if (zero == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 23.0) call abort + end do + + a(:) = 16.0 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if (.TRUE.) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + +#if ACC_MEM_SHARED + exp = 17.0; +#else + exp = 16.0; +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 76.0 + + !$acc parallel if (.FALSE.) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 77.0) call abort + end do + + a(:) = 22.0 + + nn = 1 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if (nn == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + +#if ACC_MEM_SHARED + exp = 23.0; +#else + exp = 22.0; +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 18.0 + + nn = 0 + + !$acc parallel if (nn == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 19.0) call abort + end do + + a(:) = 49.0 + + nn = 1 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if ((nn + nn) > 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + +#if ACC_MEM_SHARED + exp = 50.0 +#else + exp = 49.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 38.0 + + nn = 0; + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if ((nn + nn) > 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 39.0) call abort + end do + + a(:) = 91.0 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if (-2 > 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 92.0) call abort + end do + + a(:) = 43.0 + + !$acc parallel copyin (a(1:N)) copyout (b(1:N)) if (one == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + +#if ACC_MEM_SHARED + exp = 44.0 +#else + exp = 43.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 87.0 + + !$acc parallel if (one == 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end parallel + + do i = 1, N + if (b(i) .ne. 88.0) call abort + end do + + a(:) = 3.0 + b(:) = 9.0 + +#if ACC_MEM_SHARED + exp = 0.0 + exp2 = 0.0 +#else + call acc_copyin (a, sizeof (a)) + call acc_copyin (b, sizeof (b)) + exp = 3.0; + exp2 = 9.0; +#endif + + !$acc update device (a(1:N), b(1:N)) if (1 == 1) + + a(:) = 0.0 + b(:) = 0.0 + + !$acc update host (a(1:N), b(1:N)) if (1 == 1) + + do i = 1, N + if (a(i) .ne. exp) call abort + if (b(i) .ne. exp2) call abort + end do + + a(:) = 6.0 + b(:) = 12.0 + + !$acc update device (a(1:N), b(1:N)) if (0 == 1) + + a(:) = 0.0 + b(:) = 0.0 + + !$acc update host (a(1:N), b(1:N)) if (1 == 1) + + do i = 1, N + if (a(i) .ne. exp) call abort + if (b(i) .ne. exp2) call abort + end do + + a(:) = 26.0 + b(:) = 21.0 + + !$acc update device (a(1:N), b(1:N)) if (1 == 1) + + a(:) = 0.0 + b(:) = 0.0 + + !$acc update host (a(1:N), b(1:N)) if (0 == 1) + + do i = 1, N + if (a(i) .ne. 0.0) call abort + if (b(i) .ne. 0.0) call abort + end do + +#if !ACC_MEM_SHARED + call acc_copyout (a, sizeof (a)) + call acc_copyout (b, sizeof (b)) +#endif + + a(:) = 4.0 + b(:) = 0.0 + + !$acc data copyin (a(1:N)) copyout (b(1:N)) if (1 == 1) + + !$acc parallel present (a(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + !$acc end data + + do i = 1, N + if (b(i) .ne. 4.0) call abort + end do + + a(:) = 8.0 + b(:) = 1.0 + + !$acc data copyin (a(1:N)) copyout (b(1:N)) if (0 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc end data + + a(:) = 18.0 + b(:) = 21.0 + + !$acc data copyin (a(1:N)) if (1 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (a) .eqv. .FALSE.) call abort +#endif + + !$acc data copyout (b(1:N)) if (0 == 1) +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + !$acc data copyout (b(1:N)) if (1 == 1) + + !$acc parallel present (a(1:N)) present (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc end data + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + !$acc end data + !$acc end data + + do i = 1, N + if (b(1) .ne. 18.0) call abort + end do + + !$acc enter data copyin (b(1:N)) if (0 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (0 == 1) + + !$acc enter data copyin (b(1:N)) if (1 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .FALSE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (1 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc enter data copyin (b(1:N)) if (zero == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (zero == 1) + + !$acc enter data copyin (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .FALSE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc enter data copyin (b(1:N)) if (one == 0) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (one == 0) + + !$acc enter data copyin (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .FALSE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + a(:) = 4.0 + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if (1 == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + +#if ACC_MEM_SHARED + exp = 5.0 +#else + exp = 4.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 16.0 + + !$acc kernels if (0 == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + + do i = 1, N + if (b(i) .ne. 17.0) call abort + end do + + a(:) = 8.0 + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if (one == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + +#if ACC_MEM_SHARED + exp = 9.0 +#else + exp = 8.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 22.0 + + !$acc kernels if (zero == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + + do i = 1, N + if (b(i) .ne. 23.0) call abort + end do + + a(:) = 16.0 + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if (.TRUE.) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + +#if ACC_MEM_SHARED + exp = 17.0; +#else + exp = 16.0; +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 76.0 + + !$acc kernels if (.FALSE.) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + + do i = 1, N + if (b(i) .ne. 77.0) call abort + end do + + a(:) = 22.0 + + nn = 1 + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if (nn == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + +#if ACC_MEM_SHARED + exp = 23.0; +#else + exp = 22.0; +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 18.0 + + nn = 0 + + !$acc kernels if (nn == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + + do i = 1, N + if (b(i) .ne. 19.0) call abort + end do + + a(:) = 49.0 + + nn = 1 + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if ((nn + nn) > 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + +#if ACC_MEM_SHARED + exp = 50.0 +#else + exp = 49.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 38.0 + + nn = 0; + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if ((nn + nn) > 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + + do i = 1, N + if (b(i) .ne. 39.0) call abort + end do + + a(:) = 91.0 + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if (-2 > 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + + do i = 1, N + if (b(i) .ne. 92.0) call abort + end do + + a(:) = 43.0 + + !$acc kernels copyin (a(1:N)) copyout (b(1:N)) if (one == 1) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + +#if ACC_MEM_SHARED + exp = 44.0 +#else + exp = 43.0 +#endif + + do i = 1, N + if (b(i) .ne. exp) call abort + end do + + a(:) = 87.0 + + !$acc kernels if (one == 0) + do i = 1, N + if (acc_on_device (acc_device_host) .eqv. .TRUE.) then + b(i) = a(i) + 1 + else + b(i) = a(i) + end if + end do + !$acc end kernels + + do i = 1, N + if (b(i) .ne. 88.0) call abort + end do + + a(:) = 3.0 + b(:) = 9.0 + +#if ACC_MEM_SHARED + exp = 0.0 + exp2 = 0.0 +#else + call acc_copyin (a, sizeof (a)) + call acc_copyin (b, sizeof (b)) + exp = 3.0; + exp2 = 9.0; +#endif + + !$acc update device (a(1:N), b(1:N)) if (1 == 1) + + a(:) = 0.0 + b(:) = 0.0 + + !$acc update host (a(1:N), b(1:N)) if (1 == 1) + + do i = 1, N + if (a(i) .ne. exp) call abort + if (b(i) .ne. exp2) call abort + end do + + a(:) = 6.0 + b(:) = 12.0 + + !$acc update device (a(1:N), b(1:N)) if (0 == 1) + + a(:) = 0.0 + b(:) = 0.0 + + !$acc update host (a(1:N), b(1:N)) if (1 == 1) + + do i = 1, N + if (a(i) .ne. exp) call abort + if (b(i) .ne. exp2) call abort + end do + + a(:) = 26.0 + b(:) = 21.0 + + !$acc update device (a(1:N), b(1:N)) if (1 == 1) + + a(:) = 0.0 + b(:) = 0.0 + + !$acc update host (a(1:N), b(1:N)) if (0 == 1) + + do i = 1, N + if (a(i) .ne. 0.0) call abort + if (b(i) .ne. 0.0) call abort + end do + +#if !ACC_MEM_SHARED + call acc_copyout (a, sizeof (a)) + call acc_copyout (b, sizeof (b)) +#endif + + a(:) = 4.0 + b(:) = 0.0 + + !$acc data copyin (a(1:N)) copyout (b(1:N)) if (1 == 1) + + !$acc kernels present (a(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end kernels + !$acc end data + + do i = 1, N + if (b(i) .ne. 4.0) call abort + end do + + a(:) = 8.0 + b(:) = 1.0 + + !$acc data copyin (a(1:N)) copyout (b(1:N)) if (0 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (a) .eqv. .TRUE.) call abort + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc end data + + a(:) = 18.0 + b(:) = 21.0 + + !$acc data copyin (a(1:N)) if (1 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (a) .eqv. .FALSE.) call abort +#endif + + !$acc data copyout (b(1:N)) if (0 == 1) +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + !$acc data copyout (b(1:N)) if (1 == 1) + + !$acc kernels present (a(1:N)) present (b(1:N)) + do i = 1, N + b(i) = a(i) + end do + !$acc end kernels + + !$acc end data + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + !$acc end data + !$acc end data + + do i = 1, N + if (b(1) .ne. 18.0) call abort + end do + + !$acc enter data copyin (b(1:N)) if (0 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (0 == 1) + + !$acc enter data copyin (b(1:N)) if (1 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .FALSE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (1 == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc enter data copyin (b(1:N)) if (zero == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (zero == 1) + + !$acc enter data copyin (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .FALSE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc enter data copyin (b(1:N)) if (one == 0) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (one == 0) + + !$acc enter data copyin (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .FALSE.) call abort +#endif + + !$acc exit data delete (b(1:N)) if (one == 1) + +#if !ACC_MEM_SHARED + if (acc_is_present (b) .eqv. .TRUE.) call abort +#endif + +end program main diff --git a/libgomp/testsuite/libgomp.oacc-fortran/implicit-firstprivate-ref.f90 b/libgomp/testsuite/libgomp.oacc-fortran/implicit-firstprivate-ref.f90 new file mode 100644 index 0000000..a5f3840 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/implicit-firstprivate-ref.f90 @@ -0,0 +1,42 @@ +! This test checks if the runtime can properly handle implicit +! firstprivate varaibles inside subroutines in modules. + +! { dg-do run } + +module test_mod + contains + subroutine test(x) + + IMPLICIT NONE + + INTEGER :: x, y, j + + x = 5 + + !$ACC PARALLEL LOOP copyout (y) + DO j=1,10 + y=x + ENDDO + !$ACC END PARALLEL LOOP + + y = -1; + + !$ACC PARALLEL LOOP firstprivate (y) copyout (x) + DO j=1,10 + x=y + ENDDO + !$ACC END PARALLEL LOOP + end subroutine test +end module test_mod + +program t + use test_mod + + INTEGER :: x_min + + x_min = 8 + + CALL test(x_min) + + if (x_min .ne. -1) call abort +end program t diff --git a/libgomp/testsuite/libgomp.oacc-fortran/pr68813.f90 b/libgomp/testsuite/libgomp.oacc-fortran/pr68813.f90 new file mode 100644 index 0000000..735350f --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/pr68813.f90 @@ -0,0 +1,19 @@ +program foo + implicit none + integer, parameter :: n = 100 + integer, dimension(n,n) :: a + integer :: i, j, sum = 0 + + a = 1 + + !$acc parallel copyin(a(1:n,1:n)) firstprivate (sum) + !$acc loop gang reduction(+:sum) + do i=1, n + !$acc loop vector reduction(+:sum) + do j=1, n + sum = sum + a(i, j) + enddo + enddo + !$acc end parallel + +end program foo diff --git a/libgomp/testsuite/libgomp.oacc-fortran/private-variables.f90 b/libgomp/testsuite/libgomp.oacc-fortran/private-variables.f90 new file mode 100644 index 0000000..3c1940b --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/private-variables.f90 @@ -0,0 +1,544 @@ +! Miscellaneous tests for private variables. + +! { dg-do run } + + +! Test of gang-private variables declared on loop directive. + +subroutine t1() + integer :: x, i, arr(32) + + do i = 1, 32 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang private(x) + do i = 1, 32 + x = i * 2; + arr(i) = arr(i) + x + end do + !$acc end parallel + + do i = 1, 32 + if (arr(i) .ne. i * 3) call abort + end do +end subroutine t1 + + +! Test of gang-private variables declared on loop directive, with broadcasting +! to partitioned workers. + +subroutine t2() + integer :: x, i, j, arr(0:32*32) + + do i = 0, 32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang private(x) + do i = 0, 31 + x = i * 2; + + !$acc loop worker + do j = 0, 31 + arr(i * 32 + j) = arr(i * 32 + j) + x + end do + end do + !$acc end parallel + + do i = 0, 32 * 32 - 1 + if (arr(i) .ne. i + (i / 32) * 2) call abort + end do +end subroutine t2 + + +! Test of gang-private variables declared on loop directive, with broadcasting +! to partitioned vectors. + +subroutine t3() + integer :: x, i, j, arr(0:32*32) + + do i = 0, 32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang private(x) + do i = 0, 31 + x = i * 2; + + !$acc loop vector + do j = 0, 31 + arr(i * 32 + j) = arr(i * 32 + j) + x + end do + end do + !$acc end parallel + + do i = 0, 32 * 32 - 1 + if (arr(i) .ne. i + (i / 32) * 2) call abort + end do +end subroutine t3 + + +! Test of gang-private addressable variable declared on loop directive, with +! broadcasting to partitioned workers. + +subroutine t4() + type vec3 + integer x, y, z, attr(13) + end type vec3 + + integer i, j, arr(0:32*32) + type(vec3) pt + + do i = 0, 32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang private(pt) + do i = 0, 31 + pt%x = i + pt%y = i * 2 + pt%z = i * 4 + pt%attr(5) = i * 6 + + !$acc loop vector + do j = 0, 31 + arr(i * 32 + j) = arr(i * 32 + j) + pt%x + pt%y + pt%z + pt%attr(5); + end do + end do + !$acc end parallel + + do i = 0, 32 * 32 - 1 + if (arr(i) .ne. i + (i / 32) * 13) call abort + end do +end subroutine t4 + + +! Test of vector-private variables declared on loop directive. + +subroutine t5() + integer :: x, i, j, k, idx, arr(0:32*32*32) + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker + do j = 0, 31 + !$acc loop vector private(x) + do k = 0, 31 + x = ieor(i, j * 3) + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + !$acc loop vector private(x) + do k = 0, 31 + x = ior(i, j * 5) + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then + call abort + end if + end do + end do + end do +end subroutine t5 + + +! Test of vector-private variables declared on loop directive. Array type. + +subroutine t6() + integer :: i, j, k, idx, arr(0:32*32*32), pt(2) + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker + do j = 0, 31 + !$acc loop vector private(x, pt) + do k = 0, 31 + pt(1) = ieor(i, j * 3) + pt(2) = ior(i, j * 5) + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(1) * k + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(2) * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then + call abort + end if + end do + end do + end do +end subroutine t6 + + +! Test of worker-private variables declared on a loop directive. + +subroutine t7() + integer :: x, i, j, arr(0:32*32) + common x + + do i = 0, 32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang private(x) + do i = 0, 31 + !$acc loop worker private(x) + do j = 0, 31 + x = ieor(i, j * 3) + arr(i * 32 + j) = arr(i * 32 + j) + x + end do + end do + !$acc end parallel + + do i = 0, 32 * 32 - 1 + if (arr(i) .ne. i + ieor(i / 32, mod(i, 32) * 3)) call abort + end do +end subroutine t7 + + +! Test of worker-private variables declared on a loop directive, broadcasting +! to vector-partitioned mode. + +subroutine t8() + integer :: x, i, j, k, idx, arr(0:32*32*32) + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker private(x) + do j = 0, 31 + x = ieor(i, j * 3) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k) call abort + end do + end do + end do +end subroutine t8 + + +! Test of worker-private variables declared on a loop directive, broadcasting +! to vector-partitioned mode. Back-to-back worker loops. + +subroutine t9() + integer :: x, i, j, k, idx, arr(0:32*32*32) + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker private(x) + do j = 0, 31 + x = ieor(i, j * 3) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + end do + + !$acc loop worker private(x) + do j = 0, 31 + x = ior(i, j * 5) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then + call abort + end if + end do + end do + end do +end subroutine t9 + + +! Test of worker-private variables declared on a loop directive, broadcasting +! to vector-partitioned mode. Successive vector loops. */ + +subroutine t10() + integer :: x, i, j, k, idx, arr(0:32*32*32) + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker private(x) + do j = 0, 31 + x = ieor(i, j * 3) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + + x = ior(i, j * 5) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then + call abort + end if + end do + end do + end do +end subroutine t10 + + +! Test of worker-private variables declared on a loop directive, broadcasting +! to vector-partitioned mode. Addressable worker variable. + +subroutine t11() + integer :: i, j, k, idx, arr(0:32*32*32) + integer, target :: x + integer, pointer :: p + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker private(x, p) + do j = 0, 31 + p => x + x = ieor(i, j * 3) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + + p = ior(i, j * 5) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then + call abort + end if + end do + end do + end do +end subroutine t11 + + +! Test of worker-private variables declared on a loop directive, broadcasting +! to vector-partitioned mode. Aggregate worker variable. + +subroutine t12() + type vec2 + integer x, y + end type vec2 + + integer :: i, j, k, idx, arr(0:32*32*32) + type(vec2) :: pt + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker private(pt) + do j = 0, 31 + pt%x = ieor(i, j * 3) + pt%y = ior(i, j * 5) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt%x * k + end do + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt%y * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then + call abort + end if + end do + end do + end do +end subroutine t12 + + +! Test of worker-private variables declared on loop directive, broadcasting +! to vector-partitioned mode. Array worker variable. + +subroutine t13() + integer :: i, j, k, idx, arr(0:32*32*32), pt(2) + + do i = 0, 32*32*32-1 + arr(i) = i + end do + + !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32) + !$acc loop gang + do i = 0, 31 + !$acc loop worker private(pt) + do j = 0, 31 + pt(1) = ieor(i, j * 3) + pt(2) = ior(i, j * 5) + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(1) * k + end do + + !$acc loop vector + do k = 0, 31 + arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(2) * k + end do + end do + end do + !$acc end parallel + + do i = 0, 32 - 1 + do j = 0, 32 -1 + do k = 0, 32 - 1 + idx = i * 1024 + j * 32 + k + if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then + call abort + end if + end do + end do + end do +end subroutine t13 + + +! Test of gang-private variables declared on the parallel directive. + +subroutine t14() + use openacc + integer :: x = 5 + integer, parameter :: n = 32 + integer :: arr(n) + + do i = 1, n + arr(i) = 3 + end do + + !$acc parallel private(x) copy(arr) num_gangs(n) num_workers(8) vector_length(32) + !$acc loop gang(static:1) + do i = 1, n + x = i * 2; + end do + + !$acc loop gang(static:1) + do i = 1, n + if (acc_on_device (acc_device_host) .eqv. .TRUE.) x = i * 2 + arr(i) = arr(i) + x + end do + !$acc end parallel + + do i = 1, n + if (arr(i) .ne. (3 + i * 2)) call abort + end do + +end subroutine t14 + + +program main + call t1() + call t2() + call t3() + call t4() + call t5() + call t6() + call t7() + call t8() + call t9() + call t10() + call t11() + call t12() + call t13() + call t14() +end program main |