Hi Chung-Lin! On Fri, 7 Dec 2018 22:19:14 +0800, Chung-Lin Tang <clt...@pllab.cs.nthu.edu.tw> wrote: > On 2018/12/7 07:32 PM, Thomas Schwinge wrote: > > Does the following make sense? > > I don't quite remember why I simply ensured asyncqueue creation here at the > time, > maybe simply because it allowed simpler code at this level.
Well, I think it's just overhead we can avoid. ;-) > OTOH, the old logic is to GOMP_fatal upon such an unknown queue case, so > maybe that's > the right thing to do (inside lookup_goacc_asyncqueue()), instead of silently > allowing it to pass. > > WDYT? I argued and posted patches (or will post if not yet done) to make this defined, valid behavior, <https://gcc.gnu.org/PR88407> "[OpenACC] Correctly handle unseen async-arguments". Please speak up soon if you disagree. Thus, I still propose that you include the following. Please especially review the "libgomp/oacc-parallel.c:goacc_wait" change, and confirm no corresponding "libgomp/oacc-parallel.c:GOACC_wait" change to be done, because that code is structured differently. commit c96c6607b77bdbf562f35209718d8b8c5705c603 Author: Thomas Schwinge <tho...@codesourcery.com> Date: Fri Dec 7 12:19:56 2018 +0100 into async re-work: don't create an asyncqueue just to then test/synchronize with it --- libgomp/oacc-async.c | 12 ++++++++---- libgomp/oacc-parallel.c | 4 +++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git libgomp/oacc-async.c libgomp/oacc-async.c index 553082fe3d4a..c9b134ac3380 100644 --- libgomp/oacc-async.c +++ libgomp/oacc-async.c @@ -119,8 +119,11 @@ acc_async_test (int async) if (!thr || !thr->dev) gomp_fatal ("no device active"); - goacc_aq aq = lookup_goacc_asyncqueue (thr, true, async); - return thr->dev->openacc.async.test_func (aq); + goacc_aq aq = lookup_goacc_asyncqueue (thr, false, async); + if (!aq) + return 1; + else + return thr->dev->openacc.async.test_func (aq); } int @@ -148,8 +151,9 @@ acc_wait (int async) struct goacc_thread *thr = get_goacc_thread (); - goacc_aq aq = lookup_goacc_asyncqueue (thr, true, async); - thr->dev->openacc.async.synchronize_func (aq); + goacc_aq aq = lookup_goacc_asyncqueue (thr, false, async); + if (aq) + thr->dev->openacc.async.synchronize_func (aq); } /* acc_async_wait is an OpenACC 1.0 compatibility name for acc_wait. */ diff --git libgomp/oacc-parallel.c libgomp/oacc-parallel.c index 2815a10f0386..9519abeccc2c 100644 --- libgomp/oacc-parallel.c +++ libgomp/oacc-parallel.c @@ -493,7 +493,9 @@ goacc_wait (int async, int num_waits, va_list *ap) { int qid = va_arg (*ap, int); - goacc_aq aq = get_goacc_asyncqueue (qid); + goacc_aq aq = lookup_goacc_asyncqueue (thr, false, qid); + if (!aq) + continue; if (acc_dev->openacc.async.test_func (aq)) continue; if (async == acc_async_sync) Grüße Thomas