From: Thomas Schwinge <thomas@codesourcery.com>
To: <gcc-patches@gcc.gnu.org>
Cc: Chung-Lin Tang <cltang@codesourcery.com>,
Julian Brown <julian@codesourcery.com>
Subject: Re: [PATCH, OpenACC 2.5, libgomp] Add *_async versions of runtime library API functions
Date: Tue, 27 Jul 2021 11:22:45 +0200 [thread overview]
Message-ID: <871r7kun4q.fsf@euler.schwinge.homeip.net> (raw)
In-Reply-To: <87sg1s9s9l.fsf@euler.schwinge.homeip.net>
[-- Attachment #1: Type: text/plain, Size: 5648 bytes --]
Hi!
On 2021-06-08T19:32:22+0200, I wrote:
> Hi Chung-Lin!
>
> ;-) It's been a while:
>
> On 2018-09-10T23:04:18+0800, Chung-Lin Tang <chunglin_tang@mentor.com> wrote:
>> * testsuite/libgomp.oacc-c-c++-common/lib-94.c: New test.
>> * testsuite/libgomp.oacc-c-c++-common/lib-95.c: New test.
>> * testsuite/libgomp.oacc-fortran/lib-16.f90: New test.
>
> Do you happen to remember why in these testcases you're using the
> following pattern:
Apparently not ;-) -- no answer/objection, I've thus now pushed
"Fix OpenACC 'async'/'wait' issues in
'libgomp.oacc-c-c++-common/lib-{94,95}.c',
'libgomp.oacc-fortran/lib-16{,-2}.f90'" to master branch in
commit 599e275d7e0b3fb79ff704d4cb2d8fdb0231116e, see attached.
Grüße
Thomas
>> --- libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c (nonexistent)
>> +++ libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c (working copy)
>> @@ -0,0 +1,42 @@
>> +/* { dg-do run } */
>> +/* { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } */
>> +
>> +#include <string.h>
>> +#include <stdlib.h>
>> +#include <openacc.h>
>> +
>> +int
>> +main (int argc, char **argv)
>> +{
>> + const int N = 256;
>> + int i;
>> + int async = 8;
>> + unsigned char *h;
>> +
>> + h = (unsigned char *) malloc (N);
>> +
>> + for (i = 0; i < N; i++)
>> + {
>> + h[i] = i;
>> + }
>> +
>> + acc_copyin_async (h, N, async);
>> +
>> + memset (h, 0, N);
>> +
>> + acc_wait (async);
>
> You first issue 'acc_copyin_async', then (while potentially that's still
> accessing 'h') already 'memset' 'h' (potentially overwriting data that
> 'acc_copyin_async' is still working on), and only then 'acc_wait'?
>
> My understanding of OpenACC would swap 'memset' and 'acc_wait', but maybe
> you have a specific reason to do it in this way?
>
> In particular, the GCC nvptx offloading implementation "doesn't seem to
> care" (as discussed elsewhere; 'OpenACC "ephemeral" asynchronous
> host-to-device copies', etc.) -- but I suppose if you meant to test such
> implementation traits here, you'd have commented that?
>
>> +
>> + acc_copyout_async (h, N, async + 1);
>> +
>> + acc_wait (async + 1);
>> +
>> + for (i = 0; i < N; i++)
>> + {
>> + if (h[i] != i)
>> + abort ();
>> + }
>> +
>> + free (h);
>> +
>> + return 0;
>> +}
>
>> --- libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c (nonexistent)
>> +++ libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c (working copy)
>> @@ -0,0 +1,45 @@
>> +/* { dg-do run } */
>> +/* { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } */
>> +
>> +#include <string.h>
>> +#include <stdlib.h>
>> +#include <openacc.h>
>> +
>> +int
>> +main (int argc, char **argv)
>> +{
>> + const int N = 256;
>> + int i, q = 5;
>> + unsigned char *h, *g;
>> + void *d;
>> +
>> + h = (unsigned char *) malloc (N);
>> + g = (unsigned char *) malloc (N);
>> + for (i = 0; i < N; i++)
>> + {
>> + g[i] = i;
>> + }
>> +
>> + acc_create_async (h, N, q);
>> +
>> + acc_memcpy_to_device_async (acc_deviceptr (h), g, N, q);
>> + memset (&h[0], 0, N);
>> +
>> + acc_wait (q);
>
> Similar here.
>
>> + acc_update_self_async (h, N, q + 1);
>> + acc_delete_async (h, N, q + 1);
>> +
>> + acc_wait (q + 1);
>> +
>> + for (i = 0; i < N; i++)
>> + {
>> + if (h[i] != i)
>> + abort ();
>> + }
>> +
>> + free (h);
>> + free (g);
>> +
>> + return 0;
>> +}
>
>> --- libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90 (nonexistent)
>> +++ libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90 (working copy)
>
> (Later also similarly copied into 'libgomp.oacc-fortran/lib-16-2.f90'.)
>
> Similar:
>
>> @@ -0,0 +1,57 @@
>> +! { dg-do run }
>> +! { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } }
>> +
>> +program main
>> + use openacc
>> + implicit none
>> +
>> + integer, parameter :: N = 256
>> + integer, allocatable :: h(:)
>> + integer :: i
>> + integer :: async = 5
>> +
>> + allocate (h(N))
>> +
>> + do i = 1, N
>> + h(i) = i
>> + end do
>> +
>> + call acc_copyin (h)
>> +
>> + do i = 1, N
>> + h(i) = i + i
>> + end do
>> +
>> + call acc_update_device_async (h, sizeof (h), async)
>> +
>> + if (acc_is_present (h) .neqv. .TRUE.) call abort
>
> Don't we need 'acc_wait' here (while 'acc_update_device_async' may still
> be reading from 'h'), before overwriting 'h' here:
>
>> +
>> + h(:) = 0
>> +
>> + call acc_copyout_async (h, sizeof (h), async)
>> +
>> + call acc_wait (async)
>> +
>> + do i = 1, N
>> + if (h(i) /= i + i) call abort
>> + end do
>> +
>> + call acc_copyin (h, sizeof (h))
>> +
>> + h(:) = 0
>> +
>> + call acc_update_self_async (h, sizeof (h), async)
>> +
>> + if (acc_is_present (h) .neqv. .TRUE.) call abort
>
> Don't we need 'acc_wait' here (to make sure we finish device to host copy
> of 'h'), before evaluating 'h' here:
>
>> +
>> + do i = 1, N
>> + if (h(i) /= i + i) call abort
>> + end do
>> +
>> + call acc_delete_async (h, async)
>> +
>> + call acc_wait (async)
>> +
>> + if (acc_is_present (h) .neqv. .FALSE.) call abort
>> +
>> +end program
>
> Julian has patches for most of these (as part of other commits).
-----------------
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
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fix-OpenACC-async-wait-issues-in-libgomp.oacc-c-c-co.patch --]
[-- Type: text/x-diff, Size: 3375 bytes --]
From 599e275d7e0b3fb79ff704d4cb2d8fdb0231116e Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Tue, 8 Jun 2021 19:32:22 +0200
Subject: [PATCH] Fix OpenACC 'async'/'wait' issues in
'libgomp.oacc-c-c++-common/lib-{94,95}.c',
'libgomp.oacc-fortran/lib-16{,-2}.f90'
Fix-up for r265842 (commit 58168bbf6f8fb456280cca13343a498ad94878c7)
"[OpenACC 2.5, libgomp] Add *_async versions of runtime library API functions".
libgomp/
* testsuite/libgomp.oacc-c-c++-common/lib-94.c: Fix OpenACC
'async'/'wait' issue.
* testsuite/libgomp.oacc-c-c++-common/lib-95.c: Likewise.
* testsuite/libgomp.oacc-fortran/lib-16-2.f90: Likewise.
* testsuite/libgomp.oacc-fortran/lib-16.f90: Likewise.
Co-Authored-By: Julian Brown <julian@codesourcery.com>
---
libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c | 4 ++--
libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c | 3 ++-
libgomp/testsuite/libgomp.oacc-fortran/lib-16-2.f90 | 4 ++++
libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90 | 4 ++++
4 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c
index 54497237b0c..baa3ac83f04 100644
--- a/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c
@@ -22,10 +22,10 @@ main (int argc, char **argv)
acc_copyin_async (h, N, async);
- memset (h, 0, N);
-
acc_wait (async);
+ memset (h, 0, N);
+
acc_copyout_async (h, N, async + 1);
acc_wait (async + 1);
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c
index 85b238d78c8..842fb849e79 100644
--- a/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c
@@ -23,10 +23,11 @@ main (int argc, char **argv)
acc_create_async (h, N, q);
acc_memcpy_to_device_async (acc_deviceptr (h), g, N, q);
- memset (&h[0], 0, N);
acc_wait (q);
+ memset (h, 0, N);
+
acc_update_self_async (h, N, q + 1);
acc_delete_async (h, N, q + 1);
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/lib-16-2.f90 b/libgomp/testsuite/libgomp.oacc-fortran/lib-16-2.f90
index ddd557d3be0..2be75dca98c 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/lib-16-2.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/lib-16-2.f90
@@ -27,6 +27,8 @@ program main
if (acc_is_present (h) .neqv. .TRUE.) stop 1
+ call acc_wait (async)
+
h(:) = 0
call acc_copyout_async (h, sizeof (h), async)
@@ -45,6 +47,8 @@ program main
if (acc_is_present (h) .neqv. .TRUE.) stop 3
+ call acc_wait (async)
+
do i = 1, N
if (h(i) /= i + i) stop 4
end do
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90 b/libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90
index ccd1ce6ee18..fae0d1031ed 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90
@@ -27,6 +27,8 @@ program main
if (acc_is_present (h) .neqv. .TRUE.) stop 1
+ call acc_wait (async)
+
h(:) = 0
call acc_copyout_async (h, sizeof (h), async)
@@ -45,6 +47,8 @@ program main
if (acc_is_present (h) .neqv. .TRUE.) stop 3
+ call acc_wait (async)
+
do i = 1, N
if (h(i) /= i + i) stop 4
end do
--
2.30.2
prev parent reply other threads:[~2021-07-27 9:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-10 15:04 Chung-Lin Tang
2018-09-10 17:22 ` Cesar Philippidis
2018-09-11 10:35 ` Chung-Lin Tang
2018-11-30 20:42 ` Thomas Schwinge
2018-11-01 22:01 ` Thomas Schwinge
2021-06-08 17:32 ` Thomas Schwinge
2021-07-27 9:22 ` Thomas Schwinge [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871r7kun4q.fsf@euler.schwinge.homeip.net \
--to=thomas@codesourcery.com \
--cc=cltang@codesourcery.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=julian@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).