Hi! On 2021-07-27T11:41:19+0200, I wrote: > On 2018-01-09T11:57:00+0100, Tom de Vries wrote: >> On 01/09/2018 12:17 AM, Julian Brown wrote: >>> + (b) modifications to the copied data between the "spawning" point of >>> + the asynchronous kernel and when it is executed will not be seen. >>> + But, that is probably correct. */ >> >> Consider this example: >> [...] >> It passes without [certain code/changes], >> but fails with. So, this looks like a regression. > > Confirmed (for GCN offloading). Based on Tom's example, I've pushed > "Add 'libgomp.oacc-c-c++-common/async-data-1-{1,2}.c'" to master branch > in commit 88c40c36db8a52d2c630aa61ee54e33908e9daec, see attached.
Now really attached. > GCN XFAIL 'libgomp.oacc-c-c++-common/async-data-1-1.c' to be removed by > 'Fix OpenACC "ephemeral" asynchronous host-to-device copies' and > GCN XFAIL 'libgomp.oacc-c-c++-common/async-data-1-2.c' to be removed by > "Don't use libgomp 'cbuf' buffering with OpenACC 'async'". Grüße Thomas ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
>From 88c40c36db8a52d2c630aa61ee54e33908e9daec Mon Sep 17 00:00:00 2001 From: Thomas Schwinge <tho...@codesourcery.com> Date: Tue, 9 Jan 2018 11:57:00 +0100 Subject: [PATCH] Add 'libgomp.oacc-c-c++-common/async-data-1-{1,2}.c' libgomp/ * testsuite/libgomp.oacc-c-c++-common/async-data-1-1.c: New file. * testsuite/libgomp.oacc-c-c++-common/async-data-1-2.c: Likewise. Co-Authored-By: Tom de Vries <t...@codesourcery.com> --- .../async-data-1-1.c | 90 ++++++++++++++++ .../async-data-1-2.c | 100 ++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-1.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-2.c diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-1.c new file mode 100644 index 00000000000..cd87aec56ff --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-1.c @@ -0,0 +1,90 @@ +/* Verify back to back 'async' operations, one data mapping. + + Due to one data mapping, this isn't using the libgomp 'cbuf' buffering. +*/ + +/* { dg-xfail-run-if "TODO" { openacc_radeon_accel_selected } } */ + + +#include <stdlib.h> + + +#define N 128 + + +static void +t1 (void) +{ + unsigned int *a; + int i; + int nbytes; + + nbytes = N * sizeof (unsigned int); + + a = (unsigned int *) malloc (nbytes); + + for (i = 0; i < N; i++) + a[i] = 3; + +#pragma acc parallel async copy (a[0:N]) + for (int ii = 0; ii < N; ii++) + a[ii] += 1; + +#pragma acc parallel async copy (a[0:N]) + for (int ii = 0; ii < N; ii++) + a[ii] += 1; + +#pragma acc wait + + for (i = 0; i < N; i++) + if (a[i] != 5) + abort (); +} + + +static void +t2 (void) +{ + unsigned int *a; + int i; + int nbytes; + + nbytes = N * sizeof (unsigned int); + + a = (unsigned int *) malloc (nbytes); + +#pragma acc data copyin (a[0:N]) + { + for (i = 0; i < N; i++) + a[i] = 3; + +#pragma acc update async device (a[0:N]) +#pragma acc parallel async present (a[0:N]) + for (int ii = 0; ii < N; ii++) + a[ii] += 1; +#pragma acc update async host (a[0:N]) + +#pragma acc update async device (a[0:N]) +#pragma acc parallel async present (a[0:N]) + for (int ii = 0; ii < N; ii++) + a[ii] += 1; +#pragma acc update async host (a[0:N]) + +#pragma acc wait + } + + for (i = 0; i < N; i++) + if (a[i] != 5) + abort (); +} + + +int +main (void) +{ + t1 (); + + t2 (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-2.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-2.c new file mode 100644 index 00000000000..385237698e2 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/async-data-1-2.c @@ -0,0 +1,100 @@ +/* Verify back to back 'async' operations, two data mappings. + + Due to two data mappings, this is using the libgomp 'cbuf' buffering. +*/ + +/* { dg-xfail-run-if "TODO" { openacc_radeon_accel_selected } } */ + + +#include <stdlib.h> + + +#define N 128 + + +static void +t1 (void) +{ + unsigned int *a, *b; + int i; + int nbytes; + + nbytes = N * sizeof (unsigned int); + + a = (unsigned int *) malloc (nbytes); + b = (unsigned int *) malloc (nbytes); + + for (i = 0; i < N; i++) + b[i] = a[i] = 3; + +#pragma acc parallel async copy (a[0:N], b[0:N]) + for (int ii = 0; ii < N; ii++) + b[ii] += (a[ii] += 1); + +#pragma acc parallel async copy (a[0:N], b[0:N]) + for (int ii = 0; ii < N; ii++) + b[ii] += (a[ii] += 1); + +#pragma acc wait + + for (i = 0; i < N; i++) + { + if (a[i] != 5) + abort (); + if (b[i] != 12) + abort (); + } +} + + +static void +t2 (void) +{ + unsigned int *a, *b; + int i; + int nbytes; + + nbytes = N * sizeof (unsigned int); + + a = (unsigned int *) malloc (nbytes); + b = (unsigned int *) malloc (nbytes); + +#pragma acc data copyin (a[0:N], b[0:N]) + { + for (i = 0; i < N; i++) + b[i] = a[i] = 3; + +#pragma acc update async device (a[0:N], b[0:N]) +#pragma acc parallel async present (a[0:N], b[0:N]) + for (int ii = 0; ii < N; ii++) + b[ii] += (a[ii] += 1); +#pragma acc update async host (a[0:N], b[0:N]) + +#pragma acc update async device (a[0:N], b[0:N]) +#pragma acc parallel async present (a[0:N], b[0:N]) + for (int ii = 0; ii < N; ii++) + b[ii] += (a[ii] += 1); +#pragma acc update async host (a[0:N], b[0:N]) + +#pragma acc wait + } + + for (i = 0; i < N; i++) + { + if (a[i] != 5) + abort (); + if (b[i] != 12) + abort (); + } +} + + +int +main (void) +{ + t1 (); + + t2 (); + + return 0; +} -- 2.30.2