Home | History | Annotate | Line # | Download | only in libgomp
      1 !  OpenACC Runtime Library Definitions.			-*- mode: fortran -*-
      2 
      3 !  Copyright (C) 2014-2024 Free Software Foundation, Inc.
      4 
      5 !  Contributed by Tobias Burnus <burnus@net-b.de>
      6 !              and Mentor Embedded.
      7 
      8 !  This file is part of the GNU Offloading and Multi Processing Library
      9 !  (libgomp).
     10 
     11 !  Libgomp is free software; you can redistribute it and/or modify it
     12 !  under the terms of the GNU General Public License as published by
     13 !  the Free Software Foundation; either version 3, or (at your option)
     14 !  any later version.
     15 
     16 !  Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
     17 !  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     18 !  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
     19 !  more details.
     20 
     21 !  Under Section 7 of GPL version 3, you are granted additional
     22 !  permissions described in the GCC Runtime Library Exception, version
     23 !  3.1, as published by the Free Software Foundation.
     24 
     25 !  You should have received a copy of the GNU General Public License and
     26 !  a copy of the GCC Runtime Library Exception along with this program;
     27 !  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     28 !  <http://www.gnu.org/licenses/>.
     29 
     30 ! NOTE: Due to the use of dimension (..), the code only works when compiled
     31 ! with -std=f2008ts/gnu/legacy but not with other standard settings.
     32 ! Alternatively, the user can use the module version, which permits
     33 ! compilation with -std=f95.
     34 
     35 ! Keep in sync with openacc.f90 and config/accel/openacc.f90.
     36 
     37       integer, parameter :: acc_device_kind = 4
     38 
     39 !     Keep in sync with include/gomp-constants.h.
     40       integer (acc_device_kind), parameter :: acc_device_current = -1
     41       integer (acc_device_kind), parameter :: acc_device_none = 0
     42       integer (acc_device_kind), parameter :: acc_device_default = 1
     43       integer (acc_device_kind), parameter :: acc_device_host = 2
     44 !     integer (acc_device_kind), parameter :: acc_device_host_nonshm = 3
     45 !     removed.
     46       integer (acc_device_kind), parameter :: acc_device_not_host = 4
     47       integer (acc_device_kind), parameter :: acc_device_nvidia = 5
     48       integer (acc_device_kind), parameter :: acc_device_radeon = 8
     49 
     50       integer, parameter :: acc_device_property_kind = 4
     51 ! OpenACC 2.6/2.7/3.0 used acc_device_property; in a spec update the
     52 ! missing '_kind' was added for consistency.  For backward compatibility, keep:
     53       integer, parameter :: acc_device_property                         &
     54      &    = acc_device_property_kind
     55 
     56       integer (acc_device_property_kind), parameter ::                  &
     57      &    acc_property_memory = 1
     58       integer (acc_device_property_kind), parameter ::                  &
     59      &    acc_property_free_memory = 2
     60       integer (acc_device_property_kind), parameter ::                  &
     61      &    acc_property_name = int(Z'10001')
     62       integer (acc_device_property_kind), parameter ::                  &
     63      &    acc_property_vendor = int(Z'10002')
     64       integer (acc_device_property_kind), parameter ::                  &
     65      &    acc_property_driver = int(Z'10003')
     66 
     67       integer, parameter :: acc_handle_kind = 4
     68 
     69 !     Keep in sync with include/gomp-constants.h.
     70       integer (acc_handle_kind), parameter :: acc_async_noval = -1
     71       integer (acc_handle_kind), parameter :: acc_async_sync = -2
     72 
     73       integer, parameter :: openacc_version = 201711
     74 
     75       interface acc_get_num_devices
     76         function acc_get_num_devices_h (devicetype)
     77           import acc_device_kind
     78           integer acc_get_num_devices_h
     79           integer (acc_device_kind) devicetype
     80         end function
     81       end interface
     82 
     83       interface acc_set_device_type
     84         subroutine acc_set_device_type_h (devicetype)
     85           import acc_device_kind
     86           integer (acc_device_kind) devicetype
     87         end subroutine
     88       end interface
     89 
     90       interface acc_get_device_type
     91         function acc_get_device_type_h ()
     92           import acc_device_kind
     93           integer (acc_device_kind) acc_get_device_type_h
     94         end function
     95       end interface
     96 
     97       interface acc_set_device_num
     98         subroutine acc_set_device_num_h (devicenum, devicetype)
     99           import acc_device_kind
    100           integer devicenum
    101           integer (acc_device_kind) devicetype
    102         end subroutine
    103       end interface
    104 
    105       interface acc_get_device_num
    106         function acc_get_device_num_h (devicetype)
    107           import acc_device_kind
    108           integer acc_get_device_num_h
    109           integer (acc_device_kind) devicetype
    110         end function
    111       end interface
    112 
    113       interface acc_get_property
    114         function acc_get_property_h (devicenum, devicetype,             &
    115      &                               property)
    116           use iso_c_binding, only: c_size_t
    117           import acc_device_kind, acc_device_property_kind
    118           implicit none (type, external)
    119           integer (c_size_t) :: acc_get_property_h
    120           integer, value :: devicenum
    121           integer (acc_device_kind), value :: devicetype
    122           integer (acc_device_property_kind), value :: property
    123         end function
    124       end interface
    125 
    126       interface acc_get_property_string
    127         subroutine acc_get_property_string_h (devicenum, devicetype,    &
    128      &                                        property, string)
    129           import acc_device_kind, acc_device_property_kind
    130           implicit none (type, external)
    131           integer, value :: devicenum
    132           integer (acc_device_kind), value :: devicetype
    133           integer (acc_device_property_kind), value :: property
    134           character (*) :: string
    135         end subroutine
    136       end interface
    137 
    138       interface acc_async_test
    139         function acc_async_test_h (arg)
    140           logical acc_async_test_h
    141           integer arg
    142         end function
    143       end interface
    144 
    145       interface acc_async_test_all
    146         function acc_async_test_all_h ()
    147           logical acc_async_test_all_h
    148         end function
    149       end interface
    150 
    151       interface acc_wait
    152         subroutine acc_wait_h (arg)
    153           integer arg
    154         end subroutine
    155       end interface
    156 
    157 !     acc_async_wait is an OpenACC 1.0 compatibility name for acc_wait.
    158       interface acc_async_wait
    159         procedure :: acc_wait_h
    160       end interface
    161 
    162       interface acc_wait_async
    163         subroutine acc_wait_async_h (arg, async)
    164           integer arg, async
    165         end subroutine
    166       end interface
    167 
    168       interface acc_wait_all
    169         subroutine acc_wait_all_h ()
    170         end subroutine
    171       end interface
    172 
    173 !     acc_async_wait_all is an OpenACC 1.0 compatibility name for
    174 !     acc_wait_all.
    175       interface acc_async_wait_all
    176         procedure :: acc_wait_all_h
    177       end interface
    178 
    179       interface acc_wait_all_async
    180         subroutine acc_wait_all_async_h (async)
    181           integer async
    182         end subroutine
    183       end interface
    184 
    185       interface acc_init
    186         subroutine acc_init_h (devicetype)
    187           import acc_device_kind
    188           integer (acc_device_kind) devicetype
    189         end subroutine
    190       end interface
    191 
    192       interface acc_shutdown
    193         subroutine acc_shutdown_h (devicetype)
    194           import acc_device_kind
    195           integer (acc_device_kind) devicetype
    196         end subroutine
    197       end interface
    198 
    199       interface acc_on_device
    200         function acc_on_device_h (devicetype)
    201           import acc_device_kind
    202           logical acc_on_device_h
    203           integer (acc_device_kind) devicetype
    204         end function
    205       end interface
    206 
    207       interface
    208         type(c_ptr) function acc_malloc(bytes) bind(C)
    209           use iso_c_binding, only: c_ptr, c_size_t
    210           integer(c_size_t), value :: bytes
    211         end function
    212       end interface
    213 
    214       interface
    215         subroutine acc_free(data_dev) bind(C)
    216           use iso_c_binding, only: c_ptr
    217           type(c_ptr), value :: data_dev
    218         end subroutine
    219       end interface
    220 
    221       interface acc_copyin
    222         subroutine acc_copyin_32_h (a, len)
    223           use iso_c_binding, only: c_int32_t
    224 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    225           type (*), dimension (*) :: a
    226           integer (c_int32_t) len
    227         end subroutine
    228 
    229         subroutine acc_copyin_64_h (a, len)
    230           use iso_c_binding, only: c_int64_t
    231 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    232           type (*), dimension (*) :: a
    233           integer (c_int64_t) len
    234         end subroutine
    235 
    236         subroutine acc_copyin_array_h (a)
    237           type (*), dimension (..), contiguous :: a
    238           end subroutine
    239       end interface
    240 
    241       interface acc_present_or_copyin
    242         subroutine acc_present_or_copyin_32_h (a, len)
    243           use iso_c_binding, only: c_int32_t
    244 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    245           type (*), dimension (*) :: a
    246           integer (c_int32_t) len
    247         end subroutine
    248 
    249         subroutine acc_present_or_copyin_64_h (a, len)
    250           use iso_c_binding, only: c_int64_t
    251 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    252           type (*), dimension (*) :: a
    253           integer (c_int64_t) len
    254         end subroutine
    255 
    256         subroutine acc_present_or_copyin_array_h (a)
    257           type (*), dimension (..), contiguous :: a
    258           end subroutine
    259       end interface
    260 
    261       interface acc_pcopyin
    262         procedure :: acc_present_or_copyin_32_h
    263         procedure :: acc_present_or_copyin_64_h
    264         procedure :: acc_present_or_copyin_array_h
    265       end interface
    266 
    267       interface acc_create
    268         subroutine acc_create_32_h (a, len)
    269           use iso_c_binding, only: c_int32_t
    270 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    271           type (*), dimension (*) :: a
    272           integer (c_int32_t) len
    273         end subroutine
    274 
    275         subroutine acc_create_64_h (a, len)
    276           use iso_c_binding, only: c_int64_t
    277 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    278           type (*), dimension (*) :: a
    279           integer (c_int64_t) len
    280         end subroutine
    281 
    282         subroutine acc_create_array_h (a)
    283           type (*), dimension (..), contiguous :: a
    284           end subroutine
    285       end interface
    286 
    287       interface acc_present_or_create
    288         subroutine acc_present_or_create_32_h (a, len)
    289           use iso_c_binding, only: c_int32_t
    290 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    291           type (*), dimension (*) :: a
    292           integer (c_int32_t) len
    293         end subroutine
    294 
    295         subroutine acc_present_or_create_64_h (a, len)
    296           use iso_c_binding, only: c_int64_t
    297 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    298           type (*), dimension (*) :: a
    299           integer (c_int64_t) len
    300         end subroutine
    301 
    302         subroutine acc_present_or_create_array_h (a)
    303           type (*), dimension (..), contiguous :: a
    304           end subroutine
    305       end interface
    306 
    307       interface acc_pcreate
    308         procedure :: acc_present_or_create_32_h
    309         procedure :: acc_present_or_create_64_h
    310         procedure :: acc_present_or_create_array_h
    311       end interface
    312 
    313       interface acc_copyout
    314         subroutine acc_copyout_32_h (a, len)
    315           use iso_c_binding, only: c_int32_t
    316 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    317           type (*), dimension (*) :: a
    318           integer (c_int32_t) len
    319         end subroutine
    320 
    321         subroutine acc_copyout_64_h (a, len)
    322           use iso_c_binding, only: c_int64_t
    323 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    324           type (*), dimension (*) :: a
    325           integer (c_int64_t) len
    326         end subroutine
    327 
    328         subroutine acc_copyout_array_h (a)
    329           type (*), dimension (..), contiguous :: a
    330         end subroutine
    331       end interface
    332 
    333       interface acc_copyout_finalize
    334         subroutine acc_copyout_finalize_32_h (a, len)
    335           use iso_c_binding, only: c_int32_t
    336 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    337           type (*), dimension (*) :: a
    338           integer (c_int32_t) len
    339         end subroutine
    340 
    341         subroutine acc_copyout_finalize_64_h (a, len)
    342           use iso_c_binding, only: c_int64_t
    343 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    344           type (*), dimension (*) :: a
    345           integer (c_int64_t) len
    346         end subroutine
    347 
    348         subroutine acc_copyout_finalize_array_h (a)
    349           type (*), dimension (..), contiguous :: a
    350         end subroutine
    351       end interface
    352 
    353       interface acc_delete
    354         subroutine acc_delete_32_h (a, len)
    355           use iso_c_binding, only: c_int32_t
    356 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    357           type (*), dimension (*) :: a
    358           integer (c_int32_t) len
    359         end subroutine
    360 
    361         subroutine acc_delete_64_h (a, len)
    362           use iso_c_binding, only: c_int64_t
    363 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    364           type (*), dimension (*) :: a
    365           integer (c_int64_t) len
    366         end subroutine
    367 
    368         subroutine acc_delete_array_h (a)
    369           type (*), dimension (..), contiguous :: a
    370         end subroutine
    371       end interface
    372 
    373       interface acc_delete_finalize
    374         subroutine acc_delete_finalize_32_h (a, len)
    375           use iso_c_binding, only: c_int32_t
    376 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    377           type (*), dimension (*) :: a
    378           integer (c_int32_t) len
    379         end subroutine
    380 
    381         subroutine acc_delete_finalize_64_h (a, len)
    382           use iso_c_binding, only: c_int64_t
    383 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    384           type (*), dimension (*) :: a
    385           integer (c_int64_t) len
    386         end subroutine
    387 
    388         subroutine acc_delete_finalize_array_h (a)
    389           type (*), dimension (..), contiguous :: a
    390         end subroutine
    391       end interface
    392 
    393       interface acc_update_device
    394         subroutine acc_update_device_32_h (a, len)
    395           use iso_c_binding, only: c_int32_t
    396 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    397           type (*), dimension (*) :: a
    398           integer (c_int32_t) len
    399         end subroutine
    400 
    401         subroutine acc_update_device_64_h (a, len)
    402           use iso_c_binding, only: c_int64_t
    403 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    404           type (*), dimension (*) :: a
    405           integer (c_int64_t) len
    406         end subroutine
    407 
    408         subroutine acc_update_device_array_h (a)
    409           type (*), dimension (..), contiguous :: a
    410         end subroutine
    411       end interface
    412 
    413       interface acc_update_self
    414         subroutine acc_update_self_32_h (a, len)
    415           use iso_c_binding, only: c_int32_t
    416 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    417           type (*), dimension (*) :: a
    418           integer (c_int32_t) len
    419         end subroutine
    420 
    421         subroutine acc_update_self_64_h (a, len)
    422           use iso_c_binding, only: c_int64_t
    423 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    424           type (*), dimension (*) :: a
    425           integer (c_int64_t) len
    426         end subroutine
    427 
    428         subroutine acc_update_self_array_h (a)
    429           type (*), dimension (..), contiguous :: a
    430         end subroutine
    431       end interface
    432 
    433       interface
    434         subroutine acc_map_data(data_arg, data_dev, bytes) bind(C)
    435           use iso_c_binding, only: c_ptr, c_size_t
    436           type(*), dimension(*) :: data_arg
    437           type(c_ptr), value :: data_dev
    438           integer(c_size_t), value :: bytes
    439         end subroutine
    440       end interface
    441 
    442       interface
    443         subroutine acc_unmap_data(data_arg) bind(C)
    444           type(*), dimension(*) :: data_arg
    445         end subroutine
    446       end interface
    447 
    448       interface
    449         type(c_ptr) function acc_deviceptr(data_arg) bind(C)
    450           use iso_c_binding, only: c_ptr
    451           type(*), dimension(*) :: data_arg
    452         end function
    453       end interface
    454 
    455       interface
    456         type(c_ptr) function acc_hostptr(data_dev) bind(C)
    457           use iso_c_binding, only: c_ptr
    458           type(c_ptr), value :: data_dev
    459         end function
    460       end interface
    461 
    462       interface acc_is_present
    463         function acc_is_present_32_h (a, len)
    464           use iso_c_binding, only: c_int32_t
    465           logical acc_is_present_32_h
    466 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    467           type (*), dimension (*) :: a
    468           integer (c_int32_t) len
    469         end function
    470 
    471         function acc_is_present_64_h (a, len)
    472           use iso_c_binding, only: c_int64_t
    473           logical acc_is_present_64_h
    474 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    475           type (*), dimension (*) :: a
    476           integer (c_int64_t) len
    477         end function
    478 
    479         function acc_is_present_array_h (a)
    480           logical acc_is_present_array_h
    481           type (*), dimension (..), contiguous :: a
    482         end function
    483       end interface
    484 
    485       interface
    486         subroutine acc_memcpy_to_device(data_dev_dest, data_host_src,   &
    487      &                                  bytes) bind(C)
    488           use iso_c_binding, only: c_ptr, c_size_t
    489           type(c_ptr), value :: data_dev_dest
    490           type(*),dimension(*) :: data_host_src
    491           integer(c_size_t), value :: bytes
    492         end subroutine
    493       end interface
    494 
    495       interface
    496         subroutine acc_memcpy_to_device_async(data_dev_dest,            &
    497      &                                        data_host_src, bytes,     &
    498      &                                        async_arg) bind(C)
    499           use iso_c_binding, only: c_ptr, c_size_t
    500           import :: acc_handle_kind
    501           type(c_ptr), value :: data_dev_dest
    502           type(*),dimension(*) :: data_host_src
    503           integer(c_size_t), value :: bytes
    504           integer(acc_handle_kind), value :: async_arg
    505         end subroutine
    506       end interface
    507 
    508       interface
    509         subroutine acc_memcpy_from_device(data_host_dest,               &
    510      &                                    data_dev_src, bytes) bind(C)
    511           use iso_c_binding, only: c_ptr, c_size_t
    512           type(*),dimension(*) :: data_host_dest
    513           type(c_ptr), value :: data_dev_src
    514           integer(c_size_t), value :: bytes
    515         end subroutine
    516       end interface
    517 
    518       interface
    519         subroutine acc_memcpy_from_device_async(data_host_dest,         &
    520      &                                          data_dev_src, bytes,    &
    521      &                                          async_arg) bind(C)
    522           use iso_c_binding, only: c_ptr, c_size_t
    523           import :: acc_handle_kind
    524           type(*),dimension(*) :: data_host_dest
    525           type(c_ptr), value :: data_dev_src
    526           integer(c_size_t), value :: bytes
    527           integer(acc_handle_kind), value :: async_arg
    528         end subroutine
    529       end interface
    530 
    531       interface acc_copyin_async
    532         subroutine acc_copyin_async_32_h (a, len, async)
    533           use iso_c_binding, only: c_int32_t
    534           import acc_handle_kind
    535 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    536           type (*), dimension (*) :: a
    537           integer (c_int32_t) len
    538           integer (acc_handle_kind) async
    539         end subroutine
    540 
    541         subroutine acc_copyin_async_64_h (a, len, async)
    542           use iso_c_binding, only: c_int64_t
    543           import acc_handle_kind
    544 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    545           type (*), dimension (*) :: a
    546           integer (c_int64_t) len
    547           integer (acc_handle_kind) async
    548         end subroutine
    549 
    550         subroutine acc_copyin_async_array_h (a, async_)
    551           import acc_handle_kind
    552           type (*), dimension (..), contiguous :: a
    553           integer (acc_handle_kind) async_
    554         end subroutine
    555       end interface
    556 
    557       interface acc_create_async
    558         subroutine acc_create_async_32_h (a, len, async)
    559           use iso_c_binding, only: c_int32_t
    560           import acc_handle_kind
    561 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    562           type (*), dimension (*) :: a
    563           integer (c_int32_t) len
    564           integer (acc_handle_kind) async
    565         end subroutine
    566 
    567         subroutine acc_create_async_64_h (a, len, async)
    568           use iso_c_binding, only: c_int64_t
    569           import acc_handle_kind
    570 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    571           type (*), dimension (*) :: a
    572           integer (c_int64_t) len
    573           integer (acc_handle_kind) async
    574         end subroutine
    575 
    576         subroutine acc_create_async_array_h (a, async_)
    577           import acc_handle_kind
    578           type (*), dimension (..), contiguous :: a
    579           integer (acc_handle_kind) async_
    580         end subroutine
    581       end interface
    582 
    583       interface acc_copyout_async
    584         subroutine acc_copyout_async_32_h (a, len, async)
    585           use iso_c_binding, only: c_int32_t
    586           import acc_handle_kind
    587 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    588           type (*), dimension (*) :: a
    589           integer (c_int32_t) len
    590           integer (acc_handle_kind) async
    591         end subroutine
    592 
    593         subroutine acc_copyout_async_64_h (a, len, async)
    594           use iso_c_binding, only: c_int64_t
    595           import acc_handle_kind
    596 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    597           type (*), dimension (*) :: a
    598           integer (c_int64_t) len
    599           integer (acc_handle_kind) async
    600         end subroutine
    601 
    602         subroutine acc_copyout_async_array_h (a, async_)
    603           import acc_handle_kind
    604           type (*), dimension (..), contiguous :: a
    605           integer (acc_handle_kind) async_
    606         end subroutine
    607       end interface
    608 
    609       interface acc_delete_async
    610         subroutine acc_delete_async_32_h (a, len, async)
    611           use iso_c_binding, only: c_int32_t
    612           import acc_handle_kind
    613 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    614           type (*), dimension (*) :: a
    615           integer (c_int32_t) len
    616           integer (acc_handle_kind) async
    617         end subroutine
    618 
    619         subroutine acc_delete_async_64_h (a, len, async)
    620           use iso_c_binding, only: c_int64_t
    621           import acc_handle_kind
    622 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    623           type (*), dimension (*) :: a
    624           integer (c_int64_t) len
    625           integer (acc_handle_kind) async
    626         end subroutine
    627 
    628         subroutine acc_delete_async_array_h (a, async_)
    629           import acc_handle_kind
    630           type (*), dimension (..), contiguous :: a
    631           integer (acc_handle_kind) async_
    632         end subroutine
    633       end interface
    634 
    635       interface acc_update_device_async
    636         subroutine acc_update_device_async_32_h (a, len, async)
    637           use iso_c_binding, only: c_int32_t
    638           import acc_handle_kind
    639 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    640           type (*), dimension (*) :: a
    641           integer (c_int32_t) len
    642           integer (acc_handle_kind) async
    643         end subroutine
    644 
    645         subroutine acc_update_device_async_64_h (a, len, async)
    646           use iso_c_binding, only: c_int64_t
    647           import acc_handle_kind
    648 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    649           type (*), dimension (*) :: a
    650           integer (c_int64_t) len
    651           integer (acc_handle_kind) async
    652         end subroutine
    653 
    654         subroutine acc_update_device_async_array_h (a, async_)
    655           import acc_handle_kind
    656           type (*), dimension (..), contiguous :: a
    657           integer (acc_handle_kind) async_
    658         end subroutine
    659       end interface
    660 
    661       interface acc_update_self_async
    662         subroutine acc_update_self_async_32_h (a, len, async)
    663           use iso_c_binding, only: c_int32_t
    664           import acc_handle_kind
    665 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    666           type (*), dimension (*) :: a
    667           integer (c_int32_t) len
    668           integer (acc_handle_kind) async
    669         end subroutine
    670 
    671         subroutine acc_update_self_async_64_h (a, len, async)
    672           use iso_c_binding, only: c_int64_t
    673           import acc_handle_kind
    674 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    675           type (*), dimension (*) :: a
    676           integer (c_int64_t) len
    677           integer (acc_handle_kind) async
    678         end subroutine
    679 
    680         subroutine acc_update_self_async_array_h (a, async_)
    681           import acc_handle_kind
    682           type (*), dimension (..), contiguous :: a
    683           integer (acc_handle_kind) async_
    684         end subroutine
    685       end interface
    686