From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16039 invoked by alias); 1 Nov 2018 22:01:14 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 15381 invoked by uid 89); 1 Nov 2018 22:00:59 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: =?ISO-8859-1?Q?No, score=-10.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=gr=c3=bc=c3, to_free, 10783, thr?= X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 01 Nov 2018 22:00:53 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-MBX-03.mgc.mentorg.com) by relay1.mentorg.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-SHA384:256) id 1gIL1F-0004uC-CS from Thomas_Schwinge@mentor.com ; Thu, 01 Nov 2018 15:00:49 -0700 Received: from hertz.schwinge.homeip.net (137.202.0.90) by SVR-IES-MBX-03.mgc.mentorg.com (139.181.222.3) with Microsoft SMTP Server (TLS) id 15.0.1320.4; Thu, 1 Nov 2018 22:00:44 +0000 From: Thomas Schwinge To: Chung-Lin Tang CC: , Jakub Jelinek , Cesar Philippidis Subject: Re: [PATCH, OpenACC 2.5, libgomp] Add *_async versions of runtime library API functions In-Reply-To: <4f2750a1-9935-6629-b7fd-ce6280f902c0@mentor.com> References: <4f2750a1-9935-6629-b7fd-ce6280f902c0@mentor.com> User-Agent: Notmuch/0.9-101-g81dad07 (http://notmuchmail.org) Emacs/25.2.2 (x86_64-pc-linux-gnu) Date: Thu, 01 Nov 2018 22:01:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-SW-Source: 2018-11/txt/msg00064.txt.bz2 Hi Chung-Lin! On Mon, 10 Sep 2018 23:04:18 +0800, Chung-Lin Tang wrote: > This patch adds *_async versions of several OpenACC runtime library API f= unctions, > which is to allow execution of a function asynchronously on particular as= ync > stream, an addition to the standard since 2.5. Specifically, these functi= ons: >=20 > acc_copyin_async > acc_copyout_async > acc_copyout_finalize_async > acc_create_async > acc_delete_async > acc_delete_finalize_async > acc_memcpy_from_device_async > acc_memcpy_to_device_async > acc_update_device_async > acc_update_self_async >=20 > which have an additional 'int async' argument in additional from the non-= async version. >=20 > libgomp tested with offloading with no regressions, is this okay for trun= k? Thanks, approved. To record the review effort, please include "Reviewed-by: Thomas Schwinge " in the commit log, see . Gr=C3=BC=C3=9Fe Thomas > 2018-09-10 Chung-Lin Tang >=20 > libgomp/ > * oacc-mem.c (memcpy_tofrom_device): New function, combined from > acc_memcpy_to/from_device functions, now with async parameter. > (acc_memcpy_to_device): Modify to use memcpy_tofrom_device. > (acc_memcpy_from_device): Likewise. > (acc_memcpy_to_device_async): New API function. > (acc_memcpy_from_device_async): Likewise. > (present_create_copy): Add async parameter and async setting/uns= etting. > (acc_create): Adjust present_create_copy call. > (acc_copyin): Likewise. > (acc_present_or_create): Likewise. > (acc_present_or_copyin): Likewise. > (acc_create_async): New API function. > (acc_copyin_async): New API function. > (delete_copyout): Add async parameter and async setting/unsettin= g. > (acc_delete): Adjust delete_copyout call. > (acc_copyout): Likewise. > (acc_delete_async): New API function. > (acc_copyout_async): Likewise. > (update_dev_host): Add async parameter and async setting/unsetti= ng. > (acc_update_device): Adjust update_dev_host call. > (acc_update_self): Likewise. > (acc_update_device_async): New API function. > (acc_update_self_async): Likewise. > * openacc.h (acc_copyin_async): Declare new API function. > (acc_create_async): Likewise. > (acc_copyout_async): Likewise. > (acc_delete_async): Likewise. > (acc_update_device_async): Likewise. > (acc_update_self_async): Likewise. > (acc_memcpy_to_device_async): Likewise. > (acc_memcpy_from_device_async): Likewise. > * openacc_lib.h (acc_copyin_async_32_h): New subroutine. > (acc_copyin_async_64_h): New subroutine. > (acc_copyin_async_array_h): New subroutine. > (acc_create_async_32_h): New subroutine. > (acc_create_async_64_h): New subroutine. > (acc_create_async_array_h): New subroutine. > (acc_copyout_async_32_h): New subroutine. > (acc_copyout_async_64_h): New subroutine. > (acc_copyout_async_array_h): New subroutine. > (acc_delete_async_32_h): New subroutine. > (acc_delete_async_64_h): New subroutine. > (acc_delete_async_array_h): New subroutine. > (acc_update_device_async_32_h): New subroutine. > (acc_update_device_async_64_h): New subroutine. > (acc_update_device_async_array_h): New subroutine. > (acc_update_self_async_32_h): New subroutine. > (acc_update_self_async_64_h): New subroutine. > (acc_update_self_async_array_h): New subroutine. > * openacc.f90 (acc_copyin_async_32_h): New subroutine. > (acc_copyin_async_64_h): New subroutine. > (acc_copyin_async_array_h): New subroutine. > (acc_create_async_32_h): New subroutine. > (acc_create_async_64_h): New subroutine. > (acc_create_async_array_h): New subroutine. > (acc_copyout_async_32_h): New subroutine. > (acc_copyout_async_64_h): New subroutine. > (acc_copyout_async_array_h): New subroutine. > (acc_delete_async_32_h): New subroutine. > (acc_delete_async_64_h): New subroutine. > (acc_delete_async_array_h): New subroutine. > (acc_update_device_async_32_h): New subroutine. > (acc_update_device_async_64_h): New subroutine. > (acc_update_device_async_array_h): New subroutine. > (acc_update_self_async_32_h): New subroutine. > (acc_update_self_async_64_h): New subroutine. > (acc_update_self_async_array_h): New subroutine. > * libgomp.map (OACC_2.5): Add acc_copyin_async*, acc_copyout_asy= nc*, > acc_copyout_finalize_async*, acc_create_async*, acc_delete_async= *, > acc_delete_finalize_async*, acc_memcpy_from_device_async*, > acc_memcpy_to_device_async*, acc_update_device_async*, and > acc_update_self_async* entries. > * 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. > Index: libgomp/libgomp.map > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- libgomp/libgomp.map (revision 264192) > +++ libgomp/libgomp.map (working copy) > @@ -388,14 +388,48 @@ OACC_2.0.1 { >=20=20 > OACC_2.5 { > global: > + acc_copyin_async; > + acc_copyin_async_32_h_; > + acc_copyin_async_64_h_; > + acc_copyin_async_array_h_; > + acc_copyout_async; > + acc_copyout_async_32_h_; > + acc_copyout_async_64_h_; > + acc_copyout_async_array_h_; > acc_copyout_finalize; > acc_copyout_finalize_32_h_; > acc_copyout_finalize_64_h_; > acc_copyout_finalize_array_h_; > + acc_copyout_finalize_async; > + acc_copyout_finalize_async_32_h_; > + acc_copyout_finalize_async_64_h_; > + acc_copyout_finalize_async_array_h_; > + acc_create_async; > + acc_create_async_32_h_; > + acc_create_async_64_h_; > + acc_create_async_array_h_; > + acc_delete_async; > + acc_delete_async_32_h_; > + acc_delete_async_64_h_; > + acc_delete_async_array_h_; > acc_delete_finalize; > acc_delete_finalize_32_h_; > acc_delete_finalize_64_h_; > acc_delete_finalize_array_h_; > + acc_delete_finalize_async; > + acc_delete_finalize_async_32_h_; > + acc_delete_finalize_async_64_h_; > + acc_delete_finalize_async_array_h_; > + acc_memcpy_from_device_async; > + acc_memcpy_to_device_async; > + acc_update_device_async; > + acc_update_device_async_32_h_; > + acc_update_device_async_64_h_; > + acc_update_device_async_array_h_; > + acc_update_self_async; > + acc_update_self_async_32_h_; > + acc_update_self_async_64_h_; > + acc_update_self_async_array_h_; > } OACC_2.0.1; >=20=20 > GOACC_2.0 { > Index: libgomp/oacc-mem.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- libgomp/oacc-mem.c (revision 264192) > +++ libgomp/oacc-mem.c (working copy) > @@ -153,8 +153,9 @@ acc_free (void *d) > gomp_fatal ("error in freeing device memory in %s", __FUNCTION__); > } >=20=20 > -void > -acc_memcpy_to_device (void *d, void *h, size_t s) > +static void > +memcpy_tofrom_device (bool from, void *d, void *h, size_t s, int async, > + const char *libfnname) > { > /* No need to call lazy open here, as the device pointer must have > been obtained from a routine that did that. */ > @@ -164,31 +165,49 @@ acc_free (void *d) >=20=20 > if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) > { > - memmove (d, h, s); > + if (from) > + memmove (h, d, s); > + else > + memmove (d, h, s); > return; > } >=20=20 > - if (!thr->dev->host2dev_func (thr->dev->target_id, d, h, s)) > - gomp_fatal ("error in %s", __FUNCTION__); > + if (async > acc_async_sync) > + thr->dev->openacc.async_set_async_func (async); > + > + bool ret =3D (from > + ? thr->dev->dev2host_func (thr->dev->target_id, h, d, s) > + : thr->dev->host2dev_func (thr->dev->target_id, d, h, s)); > + > + if (async > acc_async_sync) > + thr->dev->openacc.async_set_async_func (acc_async_sync); > + > + if (!ret) > + gomp_fatal ("error in %s", libfnname); > } >=20=20 > void > -acc_memcpy_from_device (void *h, void *d, size_t s) > +acc_memcpy_to_device (void *d, void *h, size_t s) > { > - /* No need to call lazy open here, as the device pointer must have > - been obtained from a routine that did that. */ > - struct goacc_thread *thr =3D goacc_thread (); > + memcpy_tofrom_device (false, d, h, s, acc_async_sync, __FUNCTION__); > +} >=20=20 > - assert (thr && thr->dev); > +void > +acc_memcpy_to_device_async (void *d, void *h, size_t s, int async) > +{ > + memcpy_tofrom_device (false, d, h, s, async, __FUNCTION__); > +} >=20=20 > - if (thr->dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) > - { > - memmove (h, d, s); > - return; > - } > +void > +acc_memcpy_from_device (void *h, void *d, size_t s) > +{ > + memcpy_tofrom_device (true, d, h, s, acc_async_sync, __FUNCTION__); > +} >=20=20 > - if (!thr->dev->dev2host_func (thr->dev->target_id, h, d, s)) > - gomp_fatal ("error in %s", __FUNCTION__); > +void > +acc_memcpy_from_device_async (void *h, void *d, size_t s, int async) > +{ > + memcpy_tofrom_device (true, d, h, s, async, __FUNCTION__); > } >=20=20 > /* Return the device pointer that corresponds to host data H. Or NULL > @@ -428,7 +447,7 @@ acc_unmap_data (void *h) > #define FLAG_COPY (1 << 2) >=20=20 > static void * > -present_create_copy (unsigned f, void *h, size_t s) > +present_create_copy (unsigned f, void *h, size_t s, int async) > { > void *d; > splay_tree_key n; > @@ -490,11 +509,17 @@ static void * >=20=20 > gomp_mutex_unlock (&acc_dev->lock); >=20=20 > + if (async > acc_async_sync) > + acc_dev->openacc.async_set_async_func (async); > + > tgt =3D gomp_map_vars (acc_dev, mapnum, &hostaddrs, NULL, &s, &kin= ds, true, > GOMP_MAP_VARS_OPENACC); > /* Initialize dynamic refcount. */ > tgt->list[0].key->dynamic_refcount =3D 1; >=20=20 > + if (async > acc_async_sync) > + acc_dev->openacc.async_set_async_func (acc_async_sync); > + > gomp_mutex_lock (&acc_dev->lock); >=20=20 > d =3D tgt->to_free; > @@ -510,19 +535,32 @@ static void * > void * > acc_create (void *h, size_t s) > { > - return present_create_copy (FLAG_PRESENT | FLAG_CREATE, h, s); > + return present_create_copy (FLAG_PRESENT | FLAG_CREATE, h, s, acc_asyn= c_sync); > } >=20=20 > +void > +acc_create_async (void *h, size_t s, int async) > +{ > + present_create_copy (FLAG_PRESENT | FLAG_CREATE, h, s, async); > +} > + > void * > acc_copyin (void *h, size_t s) > { > - return present_create_copy (FLAG_PRESENT | FLAG_CREATE | FLAG_COPY, h,= s); > + return present_create_copy (FLAG_PRESENT | FLAG_CREATE | FLAG_COPY, h,= s, > + acc_async_sync); > } >=20=20 > +void > +acc_copyin_async (void *h, size_t s, int async) > +{ > + present_create_copy (FLAG_PRESENT | FLAG_CREATE | FLAG_COPY, h, s, asy= nc); > +} > + > void * > acc_present_or_create (void *h, size_t s) > { > - return present_create_copy (FLAG_PRESENT | FLAG_CREATE, h, s); > + return present_create_copy (FLAG_PRESENT | FLAG_CREATE, h, s, acc_asyn= c_sync); > } >=20=20 > /* acc_pcreate is acc_present_or_create by a different name. */ > @@ -539,7 +577,8 @@ acc_pcreate (void *h, size_t s) > void * > acc_present_or_copyin (void *h, size_t s) > { > - return present_create_copy (FLAG_PRESENT | FLAG_CREATE | FLAG_COPY, h,= s); > + return present_create_copy (FLAG_PRESENT | FLAG_CREATE | FLAG_COPY, h,= s, > + acc_async_sync); > } >=20=20 > /* acc_pcopyin is acc_present_or_copyin by a different name. */ > @@ -557,7 +596,7 @@ acc_pcopyin (void *h, size_t s) > #define FLAG_FINALIZE (1 << 1) >=20=20 > static void > -delete_copyout (unsigned f, void *h, size_t s, const char *libfnname) > +delete_copyout (unsigned f, void *h, size_t s, int async, const char *li= bfnname) > { > size_t host_size; > splay_tree_key n; > @@ -633,7 +672,13 @@ static void > } >=20=20 > if (f & FLAG_COPYOUT) > - acc_dev->dev2host_func (acc_dev->target_id, h, d, s); > + { > + if (async > acc_async_sync) > + acc_dev->openacc.async_set_async_func (async); > + acc_dev->dev2host_func (acc_dev->target_id, h, d, s); > + if (async > acc_async_sync) > + acc_dev->openacc.async_set_async_func (acc_async_sync); > + } >=20=20 > gomp_remove_var (acc_dev, n); > } > @@ -644,41 +689,54 @@ static void > void > acc_delete (void *h , size_t s) > { > - delete_copyout (0, h, s, __FUNCTION__); > + delete_copyout (0, h, s, acc_async_sync, __FUNCTION__); > } >=20=20 > void > +acc_delete_async (void *h , size_t s, int async) > +{ > + delete_copyout (0, h, s, async, __FUNCTION__); > +} > + > +void > acc_delete_finalize (void *h , size_t s) > { > - delete_copyout (FLAG_FINALIZE, h, s, __FUNCTION__); > + delete_copyout (FLAG_FINALIZE, h, s, acc_async_sync, __FUNCTION__); > } >=20=20 > void > acc_delete_finalize_async (void *h , size_t s, int async) > { > - delete_copyout (FLAG_FINALIZE, h, s, __FUNCTION__); > + delete_copyout (FLAG_FINALIZE, h, s, async, __FUNCTION__); > } >=20=20 > void > acc_copyout (void *h, size_t s) > { > - delete_copyout (FLAG_COPYOUT, h, s, __FUNCTION__); > + delete_copyout (FLAG_COPYOUT, h, s, acc_async_sync, __FUNCTION__); > } >=20=20 > void > +acc_copyout_async (void *h, size_t s, int async) > +{ > + delete_copyout (FLAG_COPYOUT, h, s, async, __FUNCTION__); > +} > + > +void > acc_copyout_finalize (void *h, size_t s) > { > - delete_copyout (FLAG_COPYOUT | FLAG_FINALIZE, h, s, __FUNCTION__); > + delete_copyout (FLAG_COPYOUT | FLAG_FINALIZE, h, s, acc_async_sync, > + __FUNCTION__); > } >=20=20 > void > acc_copyout_finalize_async (void *h, size_t s, int async) > { > - delete_copyout (FLAG_COPYOUT | FLAG_FINALIZE, h, s, __FUNCTION__); > + delete_copyout (FLAG_COPYOUT | FLAG_FINALIZE, h, s, async, __FUNCTION_= _); > } >=20=20 > static void > -update_dev_host (int is_dev, void *h, size_t s) > +update_dev_host (int is_dev, void *h, size_t s, int async) > { > splay_tree_key n; > void *d; > @@ -704,11 +762,17 @@ static void > d =3D (void *) (n->tgt->tgt_start + n->tgt_offset > + (uintptr_t) h - n->host_start); >=20=20 > + if (async > acc_async_sync) > + acc_dev->openacc.async_set_async_func (async); > + > if (is_dev) > acc_dev->host2dev_func (acc_dev->target_id, d, h, s); > else > acc_dev->dev2host_func (acc_dev->target_id, h, d, s); >=20=20 > + if (async > acc_async_sync) > + acc_dev->openacc.async_set_async_func (acc_async_sync); > + > gomp_mutex_unlock (&acc_dev->lock); > } >=20=20 > @@ -715,16 +779,28 @@ static void > void > acc_update_device (void *h, size_t s) > { > - update_dev_host (1, h, s); > + update_dev_host (1, h, s, acc_async_sync); > } >=20=20 > void > +acc_update_device_async (void *h, size_t s, int async) > +{ > + update_dev_host (1, h, s, async); > +} > + > +void > acc_update_self (void *h, size_t s) > { > - update_dev_host (0, h, s); > + update_dev_host (0, h, s, acc_async_sync); > } >=20=20 > void > +acc_update_self_async (void *h, size_t s, int async) > +{ > + update_dev_host (0, h, s, async); > +} > + > +void > gomp_acc_insert_pointer (size_t mapnum, void **hostaddrs, size_t *sizes, > void *kinds) > { > Index: libgomp/openacc.f90 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- libgomp/openacc.f90 (revision 264192) > +++ libgomp/openacc.f90 (working copy) > @@ -332,6 +332,150 @@ module openacc_internal > logical acc_is_present_array_h > type (*), dimension (..), contiguous :: a > end function > + > + subroutine acc_copyin_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyin_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyin_async_array_h (a, async) > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_create_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_create_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_create_async_array_h (a, async) > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyout_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyout_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyout_async_array_h (a, async) > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_delete_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_delete_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_delete_async_array_h (a, async) > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_device_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_device_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_device_async_array_h (a, async) > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_self_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_self_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_self_async_array_h (a, async) > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + end subroutine > end interface >=20=20 > interface > @@ -510,6 +654,60 @@ module openacc_internal > type (*), dimension (*) :: a > integer (c_size_t), value :: len > end function > + > + subroutine acc_copyin_async_l (a, len, async) & > + bind (C, name =3D "acc_copyin_async") > + use iso_c_binding, only: c_size_t, c_int > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_size_t), value :: len > + integer (c_int), value :: async > + end subroutine > + > + subroutine acc_create_async_l (a, len, async) & > + bind (C, name =3D "acc_create_async") > + use iso_c_binding, only: c_size_t, c_int > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_size_t), value :: len > + integer (c_int), value :: async > + end subroutine > + > + subroutine acc_copyout_async_l (a, len, async) & > + bind (C, name =3D "acc_copyout_async") > + use iso_c_binding, only: c_size_t, c_int > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_size_t), value :: len > + integer (c_int), value :: async > + end subroutine > + > + subroutine acc_delete_async_l (a, len, async) & > + bind (C, name =3D "acc_delete_async") > + use iso_c_binding, only: c_size_t, c_int > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_size_t), value :: len > + integer (c_int), value :: async > + end subroutine > + > + subroutine acc_update_device_async_l (a, len, async) & > + bind (C, name =3D "acc_update_device_async") > + use iso_c_binding, only: c_size_t, c_int > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_size_t), value :: len > + integer (c_int), value :: async > + end subroutine > + > + subroutine acc_update_self_async_l (a, len, async) & > + bind (C, name =3D "acc_update_self_async") > + use iso_c_binding, only: c_size_t, c_int > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_size_t), value :: len > + integer (c_int), value :: async > + end subroutine > end interface > end module >=20=20 > @@ -529,6 +727,8 @@ module openacc > public :: acc_copyin, acc_present_or_copyin, acc_pcopyin, acc_create > public :: acc_present_or_create, acc_pcreate, acc_copyout, acc_delete > public :: acc_update_device, acc_update_self, acc_is_present > + public :: acc_copyin_async, acc_create_async, acc_copyout_async > + public :: acc_delete_async, acc_update_device_async, acc_update_self_a= sync >=20=20 > integer, parameter :: openacc_version =3D 201306 >=20=20 > @@ -694,6 +894,42 @@ module openacc > ! acc_memcpy_to_device: Only available in C/C++ > ! acc_memcpy_from_device: Only available in C/C++ >=20=20 > + interface acc_copyin_async > + procedure :: acc_copyin_async_32_h > + procedure :: acc_copyin_async_64_h > + procedure :: acc_copyin_async_array_h > + end interface > + > + interface acc_create_async > + procedure :: acc_create_async_32_h > + procedure :: acc_create_async_64_h > + procedure :: acc_create_async_array_h > + end interface > + > + interface acc_copyout_async > + procedure :: acc_copyout_async_32_h > + procedure :: acc_copyout_async_64_h > + procedure :: acc_copyout_async_array_h > + end interface > + > + interface acc_delete_async > + procedure :: acc_delete_async_32_h > + procedure :: acc_delete_async_64_h > + procedure :: acc_delete_async_array_h > + end interface > + > + interface acc_update_device_async > + procedure :: acc_update_device_async_32_h > + procedure :: acc_update_device_async_64_h > + procedure :: acc_update_device_async_array_h > + end interface > + > + interface acc_update_self_async > + procedure :: acc_update_self_async_32_h > + procedure :: acc_update_self_async_64_h > + procedure :: acc_update_self_async_array_h > + end interface > + > end module >=20=20 > function acc_get_num_devices_h (d) > @@ -1078,3 +1314,189 @@ function acc_is_present_array_h (a) > type (*), dimension (..), contiguous :: a > acc_is_present_array_h =3D acc_is_present_l (a, sizeof (a)) =3D=3D 1 > end function > + > +subroutine acc_copyin_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t, c_size_t, c_int > + use openacc_internal, only: acc_copyin_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + call acc_copyin_async_l (a, int (len, kind =3D c_size_t), int (async, = kind =3D c_int)) > +end subroutine > + > +subroutine acc_copyin_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t, c_size_t, c_int > + use openacc_internal, only: acc_copyin_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + call acc_copyin_async_l (a, int (len, kind =3D c_size_t), int (async, = kind =3D c_int)) > +end subroutine > + > +subroutine acc_copyin_async_array_h (a, async) > + use iso_c_binding, only: c_int > + use openacc_internal, only: acc_copyin_async_l > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + call acc_copyin_async_l (a, sizeof (a), int (async, kind =3D c_int)) > +end subroutine > + > +subroutine acc_create_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t, c_size_t, c_int > + use openacc_internal, only: acc_create_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + call acc_create_async_l (a, int (len, kind =3D c_size_t), int (async, = kind =3D c_int)) > +end subroutine > + > +subroutine acc_create_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t, c_size_t, c_int > + use openacc_internal, only: acc_create_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + call acc_create_async_l (a, int (len, kind =3D c_size_t), int (async, = kind =3D c_int)) > +end subroutine > + > +subroutine acc_create_async_array_h (a, async) > + use iso_c_binding, only: c_int > + use openacc_internal, only: acc_create_async_l > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + call acc_create_async_l (a, sizeof (a), int (async, kind =3D c_int)) > +end subroutine > + > +subroutine acc_copyout_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t, c_size_t, c_int > + use openacc_internal, only: acc_copyout_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + call acc_copyout_async_l (a, int (len, kind =3D c_size_t), int (async,= kind =3D c_int)) > +end subroutine > + > +subroutine acc_copyout_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t, c_size_t, c_int > + use openacc_internal, only: acc_copyout_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + call acc_copyout_async_l (a, int (len, kind =3D c_size_t), int (async,= kind =3D c_int)) > +end subroutine > + > +subroutine acc_copyout_async_array_h (a, async) > + use iso_c_binding, only: c_int > + use openacc_internal, only: acc_copyout_async_l > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + call acc_copyout_async_l (a, sizeof (a), int (async, kind =3D c_int)) > +end subroutine > + > +subroutine acc_delete_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t, c_size_t, c_int > + use openacc_internal, only: acc_delete_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + call acc_delete_async_l (a, int (len, kind =3D c_size_t), int (async, = kind =3D c_int)) > +end subroutine > + > +subroutine acc_delete_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t, c_size_t, c_int > + use openacc_internal, only: acc_delete_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + call acc_delete_async_l (a, int (len, kind =3D c_size_t), int (async, = kind =3D c_int)) > +end subroutine > + > +subroutine acc_delete_async_array_h (a, async) > + use iso_c_binding, only: c_int > + use openacc_internal, only: acc_delete_async_l > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + call acc_delete_async_l (a, sizeof (a), int (async, kind =3D c_int)) > +end subroutine > + > +subroutine acc_update_device_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t, c_size_t, c_int > + use openacc_internal, only: acc_update_device_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + call acc_update_device_async_l (a, int (len, kind =3D c_size_t), int (= async, kind =3D c_int)) > +end subroutine > + > +subroutine acc_update_device_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t, c_size_t, c_int > + use openacc_internal, only: acc_update_device_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + call acc_update_device_async_l (a, int (len, kind =3D c_size_t), int (= async, kind =3D c_int)) > +end subroutine > + > +subroutine acc_update_device_async_array_h (a, async) > + use iso_c_binding, only: c_int > + use openacc_internal, only: acc_update_device_async_l > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + call acc_update_device_async_l (a, sizeof (a), int (async, kind =3D c_= int)) > +end subroutine > + > +subroutine acc_update_self_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t, c_size_t, c_int > + use openacc_internal, only: acc_update_self_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + call acc_update_self_async_l (a, int (len, kind =3D c_size_t), int (as= ync, kind =3D c_int)) > +end subroutine > + > +subroutine acc_update_self_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t, c_size_t, c_int > + use openacc_internal, only: acc_update_self_async_l > + use openacc_kinds, only: acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + call acc_update_self_async_l (a, int (len, kind =3D c_size_t), int (as= ync, kind =3D c_int)) > +end subroutine > + > +subroutine acc_update_self_async_array_h (a, async) > + use iso_c_binding, only: c_int > + use openacc_internal, only: acc_update_self_async_l > + use openacc_kinds, only: acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async > + call acc_update_self_async_l (a, sizeof (a), int (async, kind =3D c_in= t)) > +end subroutine > Index: libgomp/openacc.h > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- libgomp/openacc.h (revision 264192) > +++ libgomp/openacc.h (working copy) > @@ -115,6 +115,16 @@ void acc_copyout_finalize_async (void *, size_t, i > void acc_delete_finalize (void *, size_t) __GOACC_NOTHROW; > void acc_delete_finalize_async (void *, size_t, int) __GOACC_NOTHROW; >=20=20 > +/* Async functions, specified in OpenACC 2.5. */ > +void acc_copyin_async (void *, size_t, int) __GOACC_NOTHROW; > +void acc_create_async (void *, size_t, int) __GOACC_NOTHROW; > +void acc_copyout_async (void *, size_t, int) __GOACC_NOTHROW; > +void acc_delete_async (void *, size_t, int) __GOACC_NOTHROW; > +void acc_update_device_async (void *, size_t, int) __GOACC_NOTHROW; > +void acc_update_self_async (void *, size_t, int) __GOACC_NOTHROW; > +void acc_memcpy_to_device_async (void *, void *, size_t, int) __GOACC_NO= THROW; > +void acc_memcpy_from_device_async (void *, void *, size_t, int) __GOACC_= NOTHROW; > + > /* CUDA-specific routines. */ > void *acc_get_current_cuda_device (void) __GOACC_NOTHROW; > void *acc_get_current_cuda_context (void) __GOACC_NOTHROW; > Index: libgomp/openacc_lib.h > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- libgomp/openacc_lib.h (revision 264192) > +++ libgomp/openacc_lib.h (working copy) > @@ -403,3 +403,159 @@ >=20=20 > ! acc_memcpy_to_device: Only available in C/C++ > ! acc_memcpy_from_device: Only available in C/C++ > + > + interface acc_copyin_async > + subroutine acc_copyin_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyin_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyin_async_array_h (a, async_) > + import acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async_ > + end subroutine > + end interface > + > + interface acc_create_async > + subroutine acc_create_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_create_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_create_async_array_h (a, async_) > + import acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async_ > + end subroutine > + end interface > + > + interface acc_copyout_async > + subroutine acc_copyout_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyout_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_copyout_async_array_h (a, async_) > + import acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async_ > + end subroutine > + end interface > + > + interface acc_delete_async > + subroutine acc_delete_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_delete_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_delete_async_array_h (a, async_) > + import acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async_ > + end subroutine > + end interface > + > + interface acc_update_device_async > + subroutine acc_update_device_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_device_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_device_async_array_h (a, async_) > + import acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async_ > + end subroutine > + end interface > + > + interface acc_update_self_async > + subroutine acc_update_self_async_32_h (a, len, async) > + use iso_c_binding, only: c_int32_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int32_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_self_async_64_h (a, len, async) > + use iso_c_binding, only: c_int64_t > + import acc_handle_kind > + !GCC$ ATTRIBUTES NO_ARG_CHECK :: a > + type (*), dimension (*) :: a > + integer (c_int64_t) len > + integer (acc_handle_kind) async > + end subroutine > + > + subroutine acc_update_self_async_array_h (a, async_) > + import acc_handle_kind > + type (*), dimension (..), contiguous :: a > + integer (acc_handle_kind) async_ > + end subroutine > + end interface > Index: libgomp/testsuite/libgomp.oacc-c-c++-common/lib-94.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- 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=3D0" } } */ > + > +#include > +#include > +#include > + > +int > +main (int argc, char **argv) > +{ > + const int N =3D 256; > + int i; > + int async =3D 8; > + unsigned char *h; > + > + h =3D (unsigned char *) malloc (N); > + > + for (i =3D 0; i < N; i++) > + { > + h[i] =3D i; > + } > + > + acc_copyin_async (h, N, async); > + > + memset (h, 0, N); > + > + acc_wait (async); > + > + acc_copyout_async (h, N, async + 1); > + > + acc_wait (async + 1); > + > + for (i =3D 0; i < N; i++) > + { > + if (h[i] !=3D i) > + abort (); > + } > + > + free (h); > + > + return 0; > +} > Index: libgomp/testsuite/libgomp.oacc-c-c++-common/lib-95.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- 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=3D0" } } */ > + > +#include > +#include > +#include > + > +int > +main (int argc, char **argv) > +{ > + const int N =3D 256; > + int i, q =3D 5; > + unsigned char *h, *g; > + void *d; > + > + h =3D (unsigned char *) malloc (N); > + g =3D (unsigned char *) malloc (N); > + for (i =3D 0; i < N; i++) > + { > + g[i] =3D 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); > + > + acc_update_self_async (h, N, q + 1); > + acc_delete_async (h, N, q + 1); > + > + acc_wait (q + 1); > + > + for (i =3D 0; i < N; i++) > + { > + if (h[i] !=3D i) > + abort (); > + } > + > + free (h); > + free (g); > + > + return 0; > +} > Index: libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90 (nonexistent) > +++ libgomp/testsuite/libgomp.oacc-fortran/lib-16.f90 (working copy) > @@ -0,0 +1,57 @@ > +! { dg-do run } > +! { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=3D0" } } > + > +program main > + use openacc > + implicit none > + > + integer, parameter :: N =3D 256 > + integer, allocatable :: h(:) > + integer :: i > + integer :: async =3D 5 > + > + allocate (h(N)) > + > + do i =3D 1, N > + h(i) =3D i > + end do=20 > + > + call acc_copyin (h) > + > + do i =3D 1, N > + h(i) =3D i + i > + end do=20 > + > + call acc_update_device_async (h, sizeof (h), async) > + > + if (acc_is_present (h) .neqv. .TRUE.) call abort > + > + h(:) =3D 0 > + > + call acc_copyout_async (h, sizeof (h), async) > + > + call acc_wait (async) > + > + do i =3D 1, N > + if (h(i) /=3D i + i) call abort > + end do=20 > + > + call acc_copyin (h, sizeof (h)) > + > + h(:) =3D 0 > + > + call acc_update_self_async (h, sizeof (h), async) > +=20=20 > + if (acc_is_present (h) .neqv. .TRUE.) call abort > + > + do i =3D 1, N > + if (h(i) /=3D i + i) call abort > + end do=20 > + > + call acc_delete_async (h, async) > + > + call acc_wait (async) > + > + if (acc_is_present (h) .neqv. .FALSE.) call abort > +=20=20 > +end program