Hi Tobias! I do see the new 'libgomp.oacc-c++/declare-pr94120.C' (see below, for reference) FAIL for '-foffload=nvptx-none' execution testing. The reason is that the 'C' array doesn't have the content it's checked to have.
Now, my question, shouldn't it be changed like the attached patch, or similar, because we actually first need to return from function 'f' in order for the 'copyout(C)' to be executed? Or, otherwise, what's the use of the 'copyout' clause with OpenACC 'declare'? I suppose it's only meant to be used with function arguments, because for every locally-defined variable (like 'C' in 'libgomp.oacc-c++/declare-pr94120.C'), that variable will be gone just after the 'copyout' is executed, so the 'copyout' conceptually equals/acts as 'create' in that case. However, OpenACC explicitly does allow 'copyout' in certain scenarios. Do you think my interpretation is correct, or what am I missing? (In case the answer isn't obvious to you, too, please file an issue with OpenACC, linking to this email for reference.) However, GCC doesn't like my changes either; actually two errors are diagnosed: [...]/libgomp.oacc-c++/declare-pr94120.C: In function ‘void f(int*)’: [...]/libgomp.oacc-c++/declare-pr94120.C:21:30: error: array section in ‘#pragma acc declare’ 21 | #pragma acc declare copyout (C[0:N]) | ^ [...]/libgomp.oacc-c++/declare-pr94120.C:21:30: error: ‘C’ must be a variable declared in the same scope as ‘#pragma acc declare’ Please have a look, and as necessary file GCC PRs, and XFAIL the 'libgomp.oacc-c++/declare-pr94120.C' execution testing for '-DACC_MEM_SHARED=0'. Grüße Thomas On 2020-03-11T13:28:44+0100, Tobias Burnus <tob...@codesourcery.com> wrote: > --- /dev/null > +++ b/libgomp/testsuite/libgomp.oacc-c++/declare-pr94120.C > @@ -0,0 +1,57 @@ > +#include <openacc.h> > +#include <stdlib.h> > + > +#define N 8 > + > +namespace one { > + int A[N] = { 1, 2, 3, 4, 5, 6, 7, 8 }; > + #pragma acc declare copyin (A) > +}; > + > +namespace outer { > + namespace inner { > + int B[N]; > + #pragma acc declare create (B) > + }; > +}; > + > +static void > +f (void) > +{ > + int i; > + int C[N]; > + #pragma acc declare copyout (C) > + > + if (!acc_is_present (&one::A, sizeof (one::A))) > + abort (); > + > + if (!acc_is_present (&outer::inner::B, sizeof (outer::inner::B))) > + abort (); > + > +#pragma acc parallel > + for (i = 0; i < N; i++) > + { > + outer::inner::B[i] = one::A[i]; > + C[i] = outer::inner::B[i]; > + } > + > + for (i = 0; i < N; i++) > + { > + if (C[i] != i + 1) > + abort (); > + } > + > +#pragma acc parallel > + for (i = 0; i < N; i++) > + if (outer::inner::B[i] != i + 1) > + abort (); > +} > + > + > +int > +main (int argc, char **argv) > +{ > + f (); > + > + return 0; > +} ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
>From cdb045dbfaec6dfca1cc49aa4d9b1fc79fc7837e Mon Sep 17 00:00:00 2001 From: Thomas Schwinge <tho...@codesourcery.com> Date: Fri, 10 Apr 2020 14:50:28 +0200 Subject: [PATCH] [WIP] Fix 'libgomp.oacc-c++/declare-pr94120.C' [PR94120] --- .../libgomp.oacc-c++/declare-pr94120.C | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/libgomp/testsuite/libgomp.oacc-c++/declare-pr94120.C b/libgomp/testsuite/libgomp.oacc-c++/declare-pr94120.C index 1e1254187ea..bad74865135 100644 --- a/libgomp/testsuite/libgomp.oacc-c++/declare-pr94120.C +++ b/libgomp/testsuite/libgomp.oacc-c++/declare-pr94120.C @@ -16,11 +16,11 @@ namespace outer { }; static void -f (void) +f (int *C) { +#pragma acc declare copyout (C[0:N]) + int i; - int C[N]; - #pragma acc declare copyout (C) if (!acc_is_present (&one::A, sizeof (one::A))) abort (); @@ -28,6 +28,9 @@ f (void) if (!acc_is_present (&outer::inner::B, sizeof (outer::inner::B))) abort (); + if (!acc_is_present (C, N * sizeof *C)) + abort (); + #pragma acc parallel for (i = 0; i < N; i++) { @@ -35,12 +38,6 @@ f (void) C[i] = outer::inner::B[i]; } - for (i = 0; i < N; i++) - { - if (C[i] != i + 1) - abort (); - } - #pragma acc parallel for (i = 0; i < N; i++) if (outer::inner::B[i] != i + 1) @@ -51,7 +48,15 @@ f (void) int main (int argc, char **argv) { - f (); + int C[N]; + + f (C); + + for (int i = 0; i < N; i++) + { + if (C[i] != i + 1) + abort (); + } return 0; } -- 2.17.1