Hi! On Thu, 7 Apr 2016 13:29:58 +0200, Jakub Jelinek <ja...@redhat.com> wrote: > On Thu, Apr 07, 2016 at 01:28:48PM +0200, Thomas Schwinge wrote: > > On Wed, 23 Mar 2016 14:10:31 +0100, Jakub Jelinek <ja...@redhat.com> wrote: > > > On Wed, Mar 23, 2016 at 08:05:19AM -0500, James Norris wrote: > > > > On 03/23/2016 05:24 AM, Jakub Jelinek wrote: > > > > 2016-03-23 James Norris <jnor...@codesourcery.com> > > > > Daichi Fukuoka <dc-fuku...@sgi.com> > > > > > PR libgomp/69414 > > > > * oacc-mem.c (delete_copyout, update_dev_host): Fix device > > > > address. > > > > * testsuite/libgomp.oacc-c-c++-common/update-1.c: Additional > > > > tests. > > > > * testsuite/libgomp.oacc-c-c++-common/update-1-2.c: Likewise. > > > > * testsuite/libgomp.oacc-fortran/update-1.f90: New file. > > > > > > Ok with that change. > > > > OK to backport that commit to gcc-5-branch (which it has been reported > > against)? > > Ok.
In r234806 committed to gcc-5-branch (without changes): commit 09222d2f8af5e1d4b07d56a56b6806b674af2952 Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Thu Apr 7 11:43:30 2016 +0000 [PR libgomp/69414] Fix handling of subarrays with update directive libgomp/ Backport trunk r234428: 2016-03-23 James Norris <jnor...@codesourcery.com> Daichi Fukuoka <dc-fuku...@sgi.com> PR libgomp/69414 * oacc-mem.c (delete_copyout, update_dev_host): Fix device address. * testsuite/libgomp.oacc-c-c++-common/update-1.c: Additional tests. * testsuite/libgomp.oacc-c-c++-common/update-1-2.c: Likewise. * testsuite/libgomp.oacc-fortran/update-1.f90: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@234806 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgomp/ChangeLog | 13 ++ libgomp/oacc-mem.c | 6 +- .../libgomp.oacc-c-c++-common/update-1-2.c | 85 ++++++- .../testsuite/libgomp.oacc-c-c++-common/update-1.c | 87 ++++++- .../testsuite/libgomp.oacc-fortran/update-1.f90 | 242 ++++++++++++++++++++ 5 files changed, 424 insertions(+), 9 deletions(-) diff --git libgomp/ChangeLog libgomp/ChangeLog index 3da9fa1..ed890e0 100644 --- libgomp/ChangeLog +++ libgomp/ChangeLog @@ -1,3 +1,16 @@ +2016-04-07 Thomas Schwinge <tho...@codesourcery.com> + + Backport trunk r234428: + + 2016-03-23 James Norris <jnor...@codesourcery.com> + Daichi Fukuoka <dc-fuku...@sgi.com> + + PR libgomp/69414 + * oacc-mem.c (delete_copyout, update_dev_host): Fix device address. + * testsuite/libgomp.oacc-c-c++-common/update-1.c: Additional tests. + * testsuite/libgomp.oacc-c-c++-common/update-1-2.c: Likewise. + * testsuite/libgomp.oacc-fortran/update-1.f90: New file. + 2016-02-16 Tom de Vries <t...@codesourcery.com> backport from trunk: diff --git libgomp/oacc-mem.c libgomp/oacc-mem.c index 89ef5fc..c3e12fa 100644 --- libgomp/oacc-mem.c +++ libgomp/oacc-mem.c @@ -447,7 +447,8 @@ delete_copyout (unsigned f, void *h, size_t s) if (!n) gomp_fatal ("[%p,%d] is not mapped", (void *)h, (int)s); - d = (void *) (n->tgt->tgt_start + n->tgt_offset); + d = (void *) (n->tgt->tgt_start + n->tgt_offset + + (uintptr_t) h - n->host_start); host_size = n->host_end - n->host_start; @@ -490,7 +491,8 @@ update_dev_host (int is_dev, void *h, size_t s) if (!n) gomp_fatal ("[%p,%d] is not mapped", h, (int)s); - d = (void *) (n->tgt->tgt_start + n->tgt_offset); + d = (void *) (n->tgt->tgt_start + n->tgt_offset + + (uintptr_t) h - n->host_start); if (is_dev) acc_dev->host2dev_func (acc_dev->target_id, d, h, s); diff --git libgomp/testsuite/libgomp.oacc-c-c++-common/update-1-2.c libgomp/testsuite/libgomp.oacc-c-c++-common/update-1-2.c index c7e7257..82c3192 100644 --- libgomp/testsuite/libgomp.oacc-c-c++-common/update-1-2.c +++ libgomp/testsuite/libgomp.oacc-c-c++-common/update-1-2.c @@ -13,6 +13,7 @@ int main (int argc, char **argv) { int N = 8; + int NDIV2 = N / 2; float *a, *b, *c; float *d_a, *d_b, *d_c; int i; @@ -242,7 +243,7 @@ main (int argc, char **argv) a[i] = 6.0; } -#pragma acc update device (a[0:N >> 1]) +#pragma acc update device (a[0:NDIV2]) #pragma acc parallel present (a[0:N], b[0:N]) { @@ -254,7 +255,7 @@ main (int argc, char **argv) #pragma acc update self (a[0:N], b[0:N]) - for (i = 0; i < (N >> 1); i++) + for (i = 0; i < NDIV2; i++) { if (a[i] != 6.0) abort (); @@ -263,7 +264,7 @@ main (int argc, char **argv) abort (); } - for (i = (N >> 1); i < N; i++) + for (i = NDIV2; i < N; i++) { if (a[i] != 5.0) abort (); @@ -278,5 +279,83 @@ main (int argc, char **argv) if (!acc_is_present (&b[0], (N * sizeof (float)))) abort (); + for (i = 0; i < N; i++) + { + a[i] = 0.0; + } + +#pragma acc update device (a[0:4]) + +#pragma acc parallel present (a[0:N]) + { + int ii; + + for (ii = 0; ii < N; ii++) + a[ii] = a[ii] + 1.0; + } + +#pragma acc update self (a[4:4]) + + for (i = 0; i < NDIV2; i++) + { + if (a[i] != 0.0) + abort (); + } + + for (i = NDIV2; i < N; i++) + { + if (a[i] != 6.0) + abort (); + } + +#pragma acc update self (a[0:4]) + + for (i = 0; i < NDIV2; i++) + { + if (a[i] != 1.0) + abort (); + } + + for (i = NDIV2; i < N; i++) + { + if (a[i] != 6.0) + abort (); + } + + a[2] = 9; + a[3] = 9; + a[4] = 9; + a[5] = 9; + +#pragma acc update device (a[2:4]) + +#pragma acc parallel present (a[0:N]) + { + int ii; + + for (ii = 0; ii < N; ii++) + a[ii] = a[ii] + 1.0; + } + +#pragma acc update self (a[2:4]) + + for (i = 0; i < 2; i++) + { + if (a[i] != 1.0) + abort (); + } + + for (i = 2; i < 6; i++) + { + if (a[i] != 10.0) + abort (); + } + + for (i = 6; i < N; i++) + { + if (a[i] != 6.0) + abort (); + } + return 0; } diff --git libgomp/testsuite/libgomp.oacc-c-c++-common/update-1.c libgomp/testsuite/libgomp.oacc-c-c++-common/update-1.c index dff139f..1b2a460 100644 --- libgomp/testsuite/libgomp.oacc-c-c++-common/update-1.c +++ libgomp/testsuite/libgomp.oacc-c-c++-common/update-1.c @@ -11,6 +11,7 @@ int main (int argc, char **argv) { int N = 8; + int NDIV2 = N / 2; float *a, *b, *c; float *d_a, *d_b, *d_c; int i; @@ -109,7 +110,7 @@ main (int argc, char **argv) b[ii] = a[ii]; } -#pragma acc update self (a[0:N], b[0:N]) +#pragma acc update host (a[0:N], b[0:N]) for (i = 0; i < N; i++) { @@ -240,7 +241,7 @@ main (int argc, char **argv) a[i] = 6.0; } -#pragma acc update device (a[0:N >> 1]) +#pragma acc update device (a[0:NDIV2]) #pragma acc parallel present (a[0:N], b[0:N]) { @@ -252,7 +253,7 @@ main (int argc, char **argv) #pragma acc update host (a[0:N], b[0:N]) - for (i = 0; i < (N >> 1); i++) + for (i = 0; i < NDIV2; i++) { if (a[i] != 6.0) abort (); @@ -261,7 +262,7 @@ main (int argc, char **argv) abort (); } - for (i = (N >> 1); i < N; i++) + for (i = NDIV2; i < N; i++) { if (a[i] != 5.0) abort (); @@ -276,5 +277,83 @@ main (int argc, char **argv) if (!acc_is_present (&b[0], (N * sizeof (float)))) abort (); + for (i = 0; i < N; i++) + { + a[i] = 0.0; + } + +#pragma acc update device (a[0:4]) + +#pragma acc parallel present (a[0:N]) + { + int ii; + + for (ii = 0; ii < N; ii++) + a[ii] = a[ii] + 1.0; + } + +#pragma acc update host (a[4:4]) + + for (i = 0; i < NDIV2; i++) + { + if (a[i] != 0.0) + abort (); + } + + for (i = NDIV2; i < N; i++) + { + if (a[i] != 6.0) + abort (); + } + +#pragma acc update host (a[0:4]) + + for (i = 0; i < NDIV2; i++) + { + if (a[i] != 1.0) + abort (); + } + + for (i = NDIV2; i < N; i++) + { + if (a[i] != 6.0) + abort (); + } + + a[2] = 9; + a[3] = 9; + a[4] = 9; + a[5] = 9; + +#pragma acc update device (a[2:4]) + +#pragma acc parallel present (a[0:N]) + { + int ii; + + for (ii = 0; ii < N; ii++) + a[ii] = a[ii] + 1.0; + } + +#pragma acc update host (a[2:4]) + + for (i = 0; i < 2; i++) + { + if (a[i] != 1.0) + abort (); + } + + for (i = 2; i < 6; i++) + { + if (a[i] != 10.0) + abort (); + } + + for (i = 6; i < N; i++) + { + if (a[i] != 6.0) + abort (); + } + return 0; } diff --git libgomp/testsuite/libgomp.oacc-fortran/update-1.f90 libgomp/testsuite/libgomp.oacc-fortran/update-1.f90 new file mode 100644 index 0000000..4e1d2c0 --- /dev/null +++ libgomp/testsuite/libgomp.oacc-fortran/update-1.f90 @@ -0,0 +1,242 @@ +! { dg-do run } +! { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } + +program update + use openacc + implicit none + integer, parameter :: N = 8 + integer, parameter :: NDIV2 = N / 2 + real :: a(N), b(N) + integer i + + do i = 1, N + a(i) = 3.0 + b(i) = 0.0 + end do + + !$acc enter data copyin (a, b) + + !$acc parallel present (a, b) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc update host (a, b) + + 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) .neqv. .TRUE.) call abort + if (acc_is_present (b) .neqv. .TRUE.) call abort + + do i = 1, N + a(i) = 5.0 + b(i) = 1.0 + end do + + !$acc update device (a, b) + + !$acc parallel present (a, b) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc update host (a, b) + + 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) .neqv. .TRUE.) call abort + if (acc_is_present (b) .neqv. .TRUE.) call abort + + !$acc parallel present (a, b) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc update host (a, b) + + 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) .neqv. .TRUE.) call abort + if (acc_is_present (b) .neqv. .TRUE.) call abort + + do i = 1, N + a(i) = 6.0 + b(i) = 0.0 + end do + + !$acc update device (a, b) + + do i = 1, N + a(i) = 9.0 + end do + + !$acc parallel present (a, b) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc update host (a, b) + + do i = 1, N + if (a(i) .ne. 6.0) call abort + if (b(i) .ne. 6.0) call abort + end do + + if (acc_is_present (a) .neqv. .TRUE.) call abort + if (acc_is_present (b) .neqv. .TRUE.) call abort + + do i = 1, N + a(i) = 7.0 + b(i) = 2.0 + end do + + !$acc update device (a, b) + + do i = 1, N + a(i) = 9.0 + end do + + !$acc parallel present (a, b) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc update host (a, b) + + do i = 1, N + if (a(i) .ne. 7.0) call abort + if (b(i) .ne. 7.0) call abort + end do + + do i = 1, N + a(i) = 9.0 + end do + + !$acc update device (a) + + !$acc parallel present (a, b) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc update host (a, b) + + do i = 1, N + if (a(i) .ne. 9.0) call abort + if (b(i) .ne. 9.0) call abort + end do + + if (acc_is_present (a) .neqv. .TRUE.) call abort + if (acc_is_present (b) .neqv. .TRUE.) call abort + + do i = 1, N + a(i) = 5.0 + end do + + !$acc update device (a) + + do i = 1, N + a(i) = 6.0 + end do + + !$acc update device (a(1:NDIV2)) + + !$acc parallel present (a, b) + do i = 1, N + b(i) = a(i) + end do + !$acc end parallel + + !$acc update host (a, b) + + do i = 1, NDIV2 + if (a(i) .ne. 6.0) call abort + if (b(i) .ne. 6.0) call abort + end do + + do i = NDIV2 + 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) .neqv. .TRUE.) call abort + if (acc_is_present (b) .neqv. .TRUE.) call abort + + do i = 1, N + a(i) = 0.0 + end do + + !$acc update device (a(1:4)) + + !$acc parallel present (a) + do i = 1, N + a(i) = a(i) + 1.0 + end do + !$acc end parallel + + !$acc update host (a(5:N)) + + do i = 1, NDIV2 + if (a(i) .ne. 0.0) call abort + end do + + do i = NDIV2 + 1, N + if (a(i) .ne. 6.0) call abort + end do + + !$acc update host (a(1:4)) + + do i = 1, NDIV2 + if (a(i) .ne. 1.0) call abort + end do + + do i = NDIV2 + 1, N + if (a(i) .ne. 6.0) call abort + end do + + a(3) = 9 + a(4) = 9 + a(5) = 9 + a(6) = 9 + + !$acc update device (a(3:6)) + + !$acc parallel present (a(1:N)) + do i = 1, N + a(i) = a(i) + 1.0 + end do + !$acc end parallel + + !$acc update host (a(3:6)) + + do i = 1, 2 + if (a(i) .ne. 1.0) call abort + end do + + do i = 3, 6 + if (a(i) .ne. 10.0) call abort + end do + + do i = 7, N + if (a(i) .ne. 6.0) call abort + end do + + !$acc exit data delete (a, b) + +end program + Grüße Thomas