Mercurial > hg > CbC > CbC_gcc
diff libgomp/openacc.f90 @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/libgomp/openacc.f90 Thu Oct 25 07:37:49 2018 +0900 +++ b/libgomp/openacc.f90 Thu Feb 13 11:34:05 2020 +0900 @@ -1,6 +1,6 @@ ! OpenACC Runtime Library Definitions. -! Copyright (C) 2014-2018 Free Software Foundation, Inc. +! Copyright (C) 2014-2020 Free Software Foundation, Inc. ! Contributed by Tobias Burnus <burnus@net-b.de> ! and Mentor Embedded. @@ -27,37 +27,45 @@ ! see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ! <http://www.gnu.org/licenses/>. +! Keep in sync with config/accel/openacc.f90 and openacc_lib.h. + module openacc_kinds use iso_fortran_env, only: int32 + use iso_c_binding, only: c_size_t implicit none - private :: int32 - public :: acc_device_kind + public + private :: int32, c_size_t + + ! When adding items, also update 'public' setting in 'module openacc' below. integer, parameter :: acc_device_kind = int32 - public :: acc_device_none, acc_device_default, acc_device_host - public :: acc_device_not_host, acc_device_nvidia - ! Keep in sync with include/gomp-constants.h. + integer (acc_device_kind), parameter :: acc_device_current = -3 integer (acc_device_kind), parameter :: acc_device_none = 0 integer (acc_device_kind), parameter :: acc_device_default = 1 integer (acc_device_kind), parameter :: acc_device_host = 2 ! integer (acc_device_kind), parameter :: acc_device_host_nonshm = 3 removed. integer (acc_device_kind), parameter :: acc_device_not_host = 4 integer (acc_device_kind), parameter :: acc_device_nvidia = 5 + integer (acc_device_kind), parameter :: acc_device_radeon = 8 - public :: acc_handle_kind + integer, parameter :: acc_device_property = c_size_t + + ! Keep in sync with 'libgomp/libgomp-plugin.h:goacc_property'. + integer (acc_device_property), parameter :: acc_property_memory = 1 + integer (acc_device_property), parameter :: acc_property_free_memory = 2 + integer (acc_device_property), parameter :: acc_property_name = int(Z'10001') + integer (acc_device_property), parameter :: acc_property_vendor = int(Z'10002') + integer (acc_device_property), parameter :: acc_property_driver = int(Z'10003') integer, parameter :: acc_handle_kind = int32 - public :: acc_async_noval, acc_async_sync - ! Keep in sync with include/gomp-constants.h. integer (acc_handle_kind), parameter :: acc_async_noval = -1 integer (acc_handle_kind), parameter :: acc_async_sync = -2 - -end module +end module openacc_kinds module openacc_internal use openacc_kinds @@ -92,6 +100,24 @@ integer (acc_device_kind) d end function + function acc_get_property_h (n, d, p) + import + implicit none (type, external) + integer (acc_device_property) :: acc_get_property_h + integer, value :: n + integer (acc_device_kind), value :: d + integer (acc_device_property), value :: p + end function + + subroutine acc_get_property_string_h (n, d, p, s) + import + implicit none (type, external) + integer, value :: n + integer (acc_device_kind), value :: d + integer (acc_device_property), value :: p + character (*) :: s + end subroutine + function acc_async_test_h (a) logical acc_async_test_h integer a @@ -332,6 +358,150 @@ 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 interface @@ -367,6 +537,26 @@ integer (c_int), value :: d end function + function acc_get_property_l (n, d, p) & + bind (C, name = "acc_get_property") + use iso_c_binding, only: c_int, c_size_t + implicit none (type, external) + integer (c_size_t) :: acc_get_property_l + integer (c_int), value :: n + integer (c_int), value :: d + integer (c_int), value :: p + end function + + function acc_get_property_string_l (n, d, p) & + bind (C, name = "acc_get_property_string") + use iso_c_binding, only: c_int, c_ptr + implicit none (type, external) + type (c_ptr) :: acc_get_property_string_l + integer (c_int), value :: n + integer (c_int), value :: d + integer (c_int), value :: p + end function + function acc_async_test_l (a) & bind (C, name = "acc_async_test") use iso_c_binding, only: c_int @@ -510,27 +700,99 @@ type (*), dimension (*) :: a integer (c_size_t), value :: len end function + + subroutine acc_copyin_async_l (a, len, async) & + bind (C, name = "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 = "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 = "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 = "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 = "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 = "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 +end module openacc_internal module openacc use openacc_kinds use openacc_internal implicit none + private + + ! From openacc_kinds + public :: acc_device_kind + public :: acc_device_none, acc_device_default, acc_device_host + public :: acc_device_not_host, acc_device_nvidia, acc_device_radeon + + public :: acc_device_property + public :: acc_property_memory, acc_property_free_memory + public :: acc_property_name, acc_property_vendor, acc_property_driver + + public :: acc_handle_kind + public :: acc_async_noval, acc_async_sync + public :: openacc_version public :: acc_get_num_devices, acc_set_device_type, acc_get_device_type - public :: acc_set_device_num, acc_get_device_num, acc_async_test - public :: acc_async_test_all + public :: acc_set_device_num, acc_get_device_num + public :: acc_get_property, acc_get_property_string + public :: acc_async_test, acc_async_test_all public :: acc_wait, acc_async_wait, acc_wait_async public :: acc_wait_all, acc_async_wait_all, acc_wait_all_async public :: acc_init, acc_shutdown, acc_on_device 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_async + public :: acc_copyout_finalize, acc_delete_finalize - integer, parameter :: openacc_version = 201306 + integer, parameter :: openacc_version = 201711 interface acc_get_num_devices procedure :: acc_get_num_devices_h @@ -552,6 +814,14 @@ procedure :: acc_get_device_num_h end interface + interface acc_get_property + procedure :: acc_get_property_h + end interface + + interface acc_get_property_string + procedure :: acc_get_property_string_h + end interface + interface acc_async_test procedure :: acc_async_test_h end interface @@ -694,7 +964,43 @@ ! acc_memcpy_to_device: Only available in C/C++ ! acc_memcpy_from_device: Only available in C/C++ -end module + 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 openacc function acc_get_num_devices_h (d) use openacc_internal, only: acc_get_num_devices_l @@ -734,6 +1040,63 @@ acc_get_device_num_h = acc_get_device_num_l (d) end function +function acc_get_property_h (n, d, p) + use iso_c_binding, only: c_int, c_size_t + use openacc_internal, only: acc_get_property_l + use openacc_kinds + implicit none (type, external) + integer (acc_device_property) :: acc_get_property_h + integer, value :: n + integer (acc_device_kind), value :: d + integer (acc_device_property), value :: p + + integer (c_int) :: pint + + pint = int (p, c_int) + acc_get_property_h = acc_get_property_l (n, d, pint) +end function + +subroutine acc_get_property_string_h (n, d, p, s) + use iso_c_binding, only: c_char, c_int, c_ptr, c_f_pointer, c_associated + use openacc_internal, only: acc_get_property_string_l + use openacc_kinds + implicit none (type, external) + integer, value :: n + integer (acc_device_kind), value :: d + integer (acc_device_property), value :: p + character (*) :: s + + integer (c_int) :: pint + type (c_ptr) :: cptr + integer :: clen + character (kind=c_char, len=1), pointer, contiguous :: sptr (:) + integer :: slen + integer :: i + + interface + function strlen (s) bind (C, name = "strlen") + use iso_c_binding, only: c_ptr, c_size_t + type (c_ptr), intent(in), value :: s + integer (c_size_t) :: strlen + end function strlen + end interface + + pint = int (p, c_int) + cptr = acc_get_property_string_l (n, d, pint) + s = "" + if (.not. c_associated (cptr)) then + return + end if + + clen = int (strlen (cptr)) + call c_f_pointer (cptr, sptr, [clen]) + + slen = min (clen, len (s)) + do i = 1, slen + s (i:i) = sptr (i) + end do +end subroutine + function acc_async_test_h (a) use openacc_internal, only: acc_async_test_l logical acc_async_test_h @@ -1078,3 +1441,189 @@ type (*), dimension (..), contiguous :: a acc_is_present_array_h = acc_is_present_l (a, sizeof (a)) == 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 = c_size_t), int (async, kind = 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 = c_size_t), int (async, kind = 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 = 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 = c_size_t), int (async, kind = 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 = c_size_t), int (async, kind = 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 = 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 = c_size_t), int (async, kind = 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 = c_size_t), int (async, kind = 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 = 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 = c_size_t), int (async, kind = 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 = c_size_t), int (async, kind = 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 = 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 = c_size_t), int (async, kind = 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 = c_size_t), int (async, kind = 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 = 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 = c_size_t), int (async, kind = 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 = c_size_t), int (async, kind = 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 = c_int)) +end subroutine