Home | History | Annotate | Line # | Download | only in libgomp
openacc.f90 revision 1.1.1.1
      1 !  OpenACC Runtime Library Definitions.
      2 
      3 !  Copyright (C) 2014-2015 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 module openacc_kinds
     31   use iso_fortran_env, only: int32
     32   implicit none
     33 
     34   private :: int32
     35   public :: acc_device_kind
     36 
     37   integer, parameter :: acc_device_kind = int32
     38 
     39   public :: acc_device_none, acc_device_default, acc_device_host
     40   public :: acc_device_not_host, acc_device_nvidia
     41 
     42   ! Keep in sync with include/gomp-constants.h.
     43   integer (acc_device_kind), parameter :: acc_device_none = 0
     44   integer (acc_device_kind), parameter :: acc_device_default = 1
     45   integer (acc_device_kind), parameter :: acc_device_host = 2
     46   integer (acc_device_kind), parameter :: acc_device_host_nonshm = 3
     47   integer (acc_device_kind), parameter :: acc_device_not_host = 4
     48   integer (acc_device_kind), parameter :: acc_device_nvidia = 5
     49 
     50   public :: acc_handle_kind
     51 
     52   integer, parameter :: acc_handle_kind = int32
     53 
     54   public :: acc_async_noval, acc_async_sync
     55 
     56   ! Keep in sync with include/gomp-constants.h.
     57   integer (acc_handle_kind), parameter :: acc_async_noval = -1
     58   integer (acc_handle_kind), parameter :: acc_async_sync = -2
     59 
     60 end module
     61 
     62 module openacc_internal
     63   use openacc_kinds
     64   implicit none
     65 
     66   interface
     67     function acc_get_num_devices_h (d)
     68       import
     69       integer acc_get_num_devices_h
     70       integer (acc_device_kind) d
     71     end function
     72 
     73     subroutine acc_set_device_type_h (d)
     74       import
     75       integer (acc_device_kind) d
     76     end subroutine
     77 
     78     function acc_get_device_type_h ()
     79       import
     80       integer (acc_device_kind) acc_get_device_type_h
     81     end function
     82 
     83     subroutine acc_set_device_num_h (n, d)
     84       import
     85       integer n
     86       integer (acc_device_kind) d
     87     end subroutine
     88 
     89     function acc_get_device_num_h (d)
     90       import
     91       integer acc_get_device_num_h
     92       integer (acc_device_kind) d
     93     end function
     94 
     95     function acc_async_test_h (a)
     96       logical acc_async_test_h
     97       integer a
     98     end function
     99 
    100     function acc_async_test_all_h ()
    101       logical acc_async_test_all_h
    102     end function
    103 
    104     subroutine acc_wait_h (a)
    105       integer a
    106     end subroutine
    107 
    108     subroutine acc_wait_async_h (a1, a2)
    109       integer a1, a2
    110     end subroutine
    111 
    112     subroutine acc_wait_all_h ()
    113     end subroutine
    114 
    115     subroutine acc_wait_all_async_h (a)
    116       integer a
    117     end subroutine
    118 
    119     subroutine acc_init_h (d)
    120       import
    121       integer (acc_device_kind) d
    122     end subroutine
    123 
    124     subroutine acc_shutdown_h (d)
    125       import
    126       integer (acc_device_kind) d
    127     end subroutine
    128 
    129     function acc_on_device_h (d)
    130       import
    131       integer (acc_device_kind) d
    132       logical acc_on_device_h
    133     end function
    134 
    135     subroutine acc_copyin_32_h (a, len)
    136       use iso_c_binding, only: c_int32_t
    137       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    138       type (*), dimension (*) :: a
    139       integer (c_int32_t) len
    140     end subroutine
    141 
    142     subroutine acc_copyin_64_h (a, len)
    143       use iso_c_binding, only: c_int64_t
    144       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    145       type (*), dimension (*) :: a
    146       integer (c_int64_t) len
    147     end subroutine
    148 
    149     subroutine acc_copyin_array_h (a)
    150       type (*), dimension (..), contiguous :: a
    151     end subroutine
    152 
    153     subroutine acc_present_or_copyin_32_h (a, len)
    154       use iso_c_binding, only: c_int32_t
    155       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    156       type (*), dimension (*) :: a
    157       integer (c_int32_t) len
    158     end subroutine
    159 
    160     subroutine acc_present_or_copyin_64_h (a, len)
    161       use iso_c_binding, only: c_int64_t
    162       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    163       type (*), dimension (*) :: a
    164       integer (c_int64_t) len
    165     end subroutine
    166 
    167     subroutine acc_present_or_copyin_array_h (a)
    168       type (*), dimension (..), contiguous :: a
    169     end subroutine
    170 
    171     subroutine acc_create_32_h (a, len)
    172       use iso_c_binding, only: c_int32_t
    173       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    174       type (*), dimension (*) :: a
    175       integer (c_int32_t) len
    176     end subroutine
    177 
    178     subroutine acc_create_64_h (a, len)
    179       use iso_c_binding, only: c_int64_t
    180       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    181       type (*), dimension (*) :: a
    182       integer (c_int64_t) len
    183     end subroutine
    184 
    185     subroutine acc_create_array_h (a)
    186       type (*), dimension (..), contiguous :: a
    187     end subroutine
    188 
    189     subroutine acc_present_or_create_32_h (a, len)
    190       use iso_c_binding, only: c_int32_t
    191       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    192       type (*), dimension (*) :: a
    193       integer (c_int32_t) len
    194     end subroutine
    195 
    196     subroutine acc_present_or_create_64_h (a, len)
    197       use iso_c_binding, only: c_int64_t
    198       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    199       type (*), dimension (*) :: a
    200       integer (c_int64_t) len
    201     end subroutine
    202 
    203     subroutine acc_present_or_create_array_h (a)
    204       type (*), dimension (..), contiguous :: a
    205     end subroutine
    206 
    207     subroutine acc_copyout_32_h (a, len)
    208       use iso_c_binding, only: c_int32_t
    209       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    210       type (*), dimension (*) :: a
    211       integer (c_int32_t) len
    212     end subroutine
    213 
    214     subroutine acc_copyout_64_h (a, len)
    215       use iso_c_binding, only: c_int64_t
    216       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    217       type (*), dimension (*) :: a
    218       integer (c_int64_t) len
    219     end subroutine
    220 
    221     subroutine acc_copyout_array_h (a)
    222       type (*), dimension (..), contiguous :: a
    223     end subroutine
    224 
    225     subroutine acc_delete_32_h (a, len)
    226       use iso_c_binding, only: c_int32_t
    227       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    228       type (*), dimension (*) :: a
    229       integer (c_int32_t) len
    230     end subroutine
    231 
    232     subroutine acc_delete_64_h (a, len)
    233       use iso_c_binding, only: c_int64_t
    234       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    235       type (*), dimension (*) :: a
    236       integer (c_int64_t) len
    237     end subroutine
    238 
    239     subroutine acc_delete_array_h (a)
    240       type (*), dimension (..), contiguous :: a
    241     end subroutine
    242 
    243     subroutine acc_update_device_32_h (a, len)
    244       use iso_c_binding, only: c_int32_t
    245       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    246       type (*), dimension (*) :: a
    247       integer (c_int32_t) len
    248     end subroutine
    249 
    250     subroutine acc_update_device_64_h (a, len)
    251       use iso_c_binding, only: c_int64_t
    252       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    253       type (*), dimension (*) :: a
    254       integer (c_int64_t) len
    255     end subroutine
    256 
    257     subroutine acc_update_device_array_h (a)
    258       type (*), dimension (..), contiguous :: a
    259     end subroutine
    260 
    261     subroutine acc_update_self_32_h (a, len)
    262       use iso_c_binding, only: c_int32_t
    263       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    264       type (*), dimension (*) :: a
    265       integer (c_int32_t) len
    266     end subroutine
    267 
    268     subroutine acc_update_self_64_h (a, len)
    269       use iso_c_binding, only: c_int64_t
    270       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    271       type (*), dimension (*) :: a
    272       integer (c_int64_t) len
    273     end subroutine
    274 
    275     subroutine acc_update_self_array_h (a)
    276       type (*), dimension (..), contiguous :: a
    277     end subroutine
    278 
    279     function acc_is_present_32_h (a, len)
    280       use iso_c_binding, only: c_int32_t
    281       logical acc_is_present_32_h
    282       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    283       type (*), dimension (*) :: a
    284       integer (c_int32_t) len
    285     end function
    286 
    287     function acc_is_present_64_h (a, len)
    288       use iso_c_binding, only: c_int64_t
    289       logical acc_is_present_64_h
    290       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    291       type (*), dimension (*) :: a
    292       integer (c_int64_t) len
    293     end function
    294 
    295     function acc_is_present_array_h (a)
    296       logical acc_is_present_array_h
    297       type (*), dimension (..), contiguous :: a
    298     end function
    299   end interface
    300 
    301   interface
    302     function acc_get_num_devices_l (d) &
    303         bind (C, name = "acc_get_num_devices")
    304       use iso_c_binding, only: c_int
    305       integer (c_int) :: acc_get_num_devices_l
    306       integer (c_int), value :: d
    307     end function
    308 
    309     subroutine acc_set_device_type_l (d) &
    310         bind (C, name = "acc_set_device_type")
    311       use iso_c_binding, only: c_int
    312       integer (c_int), value :: d
    313     end subroutine
    314 
    315     function acc_get_device_type_l () &
    316         bind (C, name = "acc_get_device_type")
    317       use iso_c_binding, only: c_int
    318       integer (c_int) :: acc_get_device_type_l
    319     end function
    320 
    321     subroutine acc_set_device_num_l (n, d) &
    322         bind (C, name = "acc_set_device_num")
    323       use iso_c_binding, only: c_int
    324       integer (c_int), value :: n, d
    325     end subroutine
    326 
    327     function acc_get_device_num_l (d) &
    328         bind (C, name = "acc_get_device_num")
    329       use iso_c_binding, only: c_int
    330       integer (c_int) :: acc_get_device_num_l
    331       integer (c_int), value :: d
    332     end function
    333 
    334     function acc_async_test_l (a) &
    335         bind (C, name = "acc_async_test")
    336       use iso_c_binding, only: c_int
    337       integer (c_int) :: acc_async_test_l
    338       integer (c_int), value :: a
    339     end function
    340 
    341     function acc_async_test_all_l () &
    342         bind (C, name = "acc_async_test_all")
    343       use iso_c_binding, only: c_int
    344       integer (c_int) :: acc_async_test_all_l
    345     end function
    346 
    347     subroutine acc_wait_l (a) &
    348         bind (C, name = "acc_wait")
    349       use iso_c_binding, only: c_int
    350       integer (c_int), value :: a
    351     end subroutine
    352 
    353     subroutine acc_wait_async_l (a1, a2) &
    354         bind (C, name = "acc_wait_async")
    355       use iso_c_binding, only: c_int
    356       integer (c_int), value :: a1, a2
    357     end subroutine
    358 
    359     subroutine acc_wait_all_l () &
    360         bind (C, name = "acc_wait_all")
    361       use iso_c_binding, only: c_int
    362     end subroutine
    363 
    364     subroutine acc_wait_all_async_l (a) &
    365         bind (C, name = "acc_wait_all_async")
    366       use iso_c_binding, only: c_int
    367       integer (c_int), value :: a
    368     end subroutine
    369 
    370     subroutine acc_init_l (d) &
    371         bind (C, name = "acc_init")
    372       use iso_c_binding, only: c_int
    373       integer (c_int), value :: d
    374     end subroutine
    375 
    376     subroutine acc_shutdown_l (d) &
    377         bind (C, name = "acc_shutdown")
    378       use iso_c_binding, only: c_int
    379       integer (c_int), value :: d
    380     end subroutine
    381 
    382     function acc_on_device_l (d) &
    383         bind (C, name = "acc_on_device")
    384       use iso_c_binding, only: c_int
    385       integer (c_int) :: acc_on_device_l
    386       integer (c_int), value :: d
    387     end function
    388 
    389     subroutine acc_copyin_l (a, len) &
    390         bind (C, name = "acc_copyin")
    391       use iso_c_binding, only: c_size_t
    392       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    393       type (*), dimension (*) :: a
    394       integer (c_size_t), value :: len
    395     end subroutine
    396 
    397     subroutine acc_present_or_copyin_l (a, len) &
    398         bind (C, name = "acc_present_or_copyin")
    399       use iso_c_binding, only: c_size_t
    400       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    401       type (*), dimension (*) :: a
    402       integer (c_size_t), value :: len
    403     end subroutine
    404 
    405     subroutine acc_create_l (a, len) &
    406         bind (C, name = "acc_create")
    407       use iso_c_binding, only: c_size_t
    408       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    409       type (*), dimension (*) :: a
    410       integer (c_size_t), value :: len
    411     end subroutine
    412 
    413     subroutine acc_present_or_create_l (a, len) &
    414         bind (C, name = "acc_present_or_create")
    415       use iso_c_binding, only: c_size_t
    416       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    417       type (*), dimension (*) :: a
    418       integer (c_size_t), value :: len
    419     end subroutine
    420 
    421     subroutine acc_copyout_l (a, len) &
    422         bind (C, name = "acc_copyout")
    423       use iso_c_binding, only: c_size_t
    424       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    425       type (*), dimension (*) :: a
    426       integer (c_size_t), value :: len
    427     end subroutine
    428 
    429     subroutine acc_delete_l (a, len) &
    430         bind (C, name = "acc_delete")
    431       use iso_c_binding, only: c_size_t
    432       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    433       type (*), dimension (*) :: a
    434       integer (c_size_t), value :: len
    435     end subroutine
    436 
    437     subroutine acc_update_device_l (a, len) &
    438         bind (C, name = "acc_update_device")
    439       use iso_c_binding, only: c_size_t
    440       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    441       type (*), dimension (*) :: a
    442       integer (c_size_t), value :: len
    443     end subroutine
    444 
    445     subroutine acc_update_self_l (a, len) &
    446         bind (C, name = "acc_update_self")
    447       use iso_c_binding, only: c_size_t
    448       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    449       type (*), dimension (*) :: a
    450       integer (c_size_t), value :: len
    451     end subroutine
    452 
    453     function acc_is_present_l (a, len) &
    454         bind (C, name = "acc_is_present")
    455       use iso_c_binding, only: c_int32_t, c_size_t
    456       !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    457       integer (c_int32_t) :: acc_is_present_l
    458       type (*), dimension (*) :: a
    459       integer (c_size_t), value :: len
    460     end function
    461   end interface
    462 end module
    463 
    464 module openacc
    465   use openacc_kinds
    466   use openacc_internal
    467   implicit none
    468 
    469   public :: openacc_version
    470 
    471   public :: acc_get_num_devices, acc_set_device_type, acc_get_device_type
    472   public :: acc_set_device_num, acc_get_device_num, acc_async_test
    473   public :: acc_async_test_all, acc_wait, acc_wait_async, acc_wait_all
    474   public :: acc_wait_all_async, acc_init, acc_shutdown, acc_on_device
    475   public :: acc_copyin, acc_present_or_copyin, acc_pcopyin, acc_create
    476   public :: acc_present_or_create, acc_pcreate, acc_copyout, acc_delete
    477   public :: acc_update_device, acc_update_self, acc_is_present
    478 
    479   integer, parameter :: openacc_version = 201306
    480 
    481   interface acc_get_num_devices
    482     procedure :: acc_get_num_devices_h
    483   end interface
    484 
    485   interface acc_set_device_type
    486     procedure :: acc_set_device_type_h
    487   end interface
    488 
    489   interface acc_get_device_type
    490     procedure :: acc_get_device_type_h
    491   end interface
    492 
    493   interface acc_set_device_num
    494     procedure :: acc_set_device_num_h
    495   end interface
    496 
    497   interface acc_get_device_num
    498     procedure :: acc_get_device_num_h
    499   end interface
    500 
    501   interface acc_async_test
    502     procedure :: acc_async_test_h
    503   end interface
    504 
    505   interface acc_async_test_all
    506     procedure :: acc_async_test_all_h
    507   end interface
    508 
    509   interface acc_wait
    510     procedure :: acc_wait_h
    511   end interface
    512 
    513   interface acc_wait_async
    514     procedure :: acc_wait_async_h
    515   end interface
    516 
    517   interface acc_wait_all
    518     procedure :: acc_wait_all_h
    519   end interface
    520 
    521   interface acc_wait_all_async
    522     procedure :: acc_wait_all_async_h
    523   end interface
    524 
    525   interface acc_init
    526     procedure :: acc_init_h
    527   end interface
    528 
    529   interface acc_shutdown
    530     procedure :: acc_shutdown_h
    531   end interface
    532 
    533   interface acc_on_device
    534     procedure :: acc_on_device_h
    535   end interface
    536 
    537   ! acc_malloc: Only available in C/C++
    538   ! acc_free: Only available in C/C++
    539 
    540   ! As vendor extension, the following code supports both 32bit and 64bit
    541   ! arguments for "size"; the OpenACC standard only permits default-kind
    542   ! integers, which are of kind 4 (i.e. 32 bits).
    543   ! Additionally, the two-argument version also takes arrays as argument.
    544   ! and the one argument version also scalars. Note that the code assumes
    545   ! that the arrays are contiguous.
    546 
    547   interface acc_copyin
    548     procedure :: acc_copyin_32_h
    549     procedure :: acc_copyin_64_h
    550     procedure :: acc_copyin_array_h
    551   end interface
    552 
    553   interface acc_present_or_copyin
    554     procedure :: acc_present_or_copyin_32_h
    555     procedure :: acc_present_or_copyin_64_h
    556     procedure :: acc_present_or_copyin_array_h
    557   end interface
    558 
    559   interface acc_pcopyin
    560     procedure :: acc_present_or_copyin_32_h
    561     procedure :: acc_present_or_copyin_64_h
    562     procedure :: acc_present_or_copyin_array_h
    563   end interface
    564 
    565   interface acc_create
    566     procedure :: acc_create_32_h
    567     procedure :: acc_create_64_h
    568     procedure :: acc_create_array_h
    569   end interface
    570 
    571   interface acc_present_or_create
    572     procedure :: acc_present_or_create_32_h
    573     procedure :: acc_present_or_create_64_h
    574     procedure :: acc_present_or_create_array_h
    575   end interface
    576 
    577   interface acc_pcreate
    578     procedure :: acc_present_or_create_32_h
    579     procedure :: acc_present_or_create_64_h
    580     procedure :: acc_present_or_create_array_h
    581   end interface
    582 
    583   interface acc_copyout
    584     procedure :: acc_copyout_32_h
    585     procedure :: acc_copyout_64_h
    586     procedure :: acc_copyout_array_h
    587   end interface
    588 
    589   interface acc_delete
    590     procedure :: acc_delete_32_h
    591     procedure :: acc_delete_64_h
    592     procedure :: acc_delete_array_h
    593   end interface
    594 
    595   interface acc_update_device
    596     procedure :: acc_update_device_32_h
    597     procedure :: acc_update_device_64_h
    598     procedure :: acc_update_device_array_h
    599   end interface
    600 
    601   interface acc_update_self
    602     procedure :: acc_update_self_32_h
    603     procedure :: acc_update_self_64_h
    604     procedure :: acc_update_self_array_h
    605   end interface
    606 
    607   ! acc_map_data: Only available in C/C++
    608   ! acc_unmap_data: Only available in C/C++
    609   ! acc_deviceptr: Only available in C/C++
    610   ! acc_hostptr: Only available in C/C++
    611 
    612   interface acc_is_present
    613     procedure :: acc_is_present_32_h
    614     procedure :: acc_is_present_64_h
    615     procedure :: acc_is_present_array_h
    616   end interface
    617 
    618   ! acc_memcpy_to_device: Only available in C/C++
    619   ! acc_memcpy_from_device: Only available in C/C++
    620 
    621 end module
    622 
    623 function acc_get_num_devices_h (d)
    624   use openacc_internal, only: acc_get_num_devices_l
    625   use openacc_kinds
    626   integer acc_get_num_devices_h
    627   integer (acc_device_kind) d
    628   acc_get_num_devices_h = acc_get_num_devices_l (d)
    629 end function
    630 
    631 subroutine acc_set_device_type_h (d)
    632   use openacc_internal, only: acc_set_device_type_l
    633   use openacc_kinds
    634   integer (acc_device_kind) d
    635   call acc_set_device_type_l (d)
    636 end subroutine
    637 
    638 function acc_get_device_type_h ()
    639   use openacc_internal, only: acc_get_device_type_l
    640   use openacc_kinds
    641   integer (acc_device_kind) acc_get_device_type_h
    642   acc_get_device_type_h = acc_get_device_type_l ()
    643 end function
    644 
    645 subroutine acc_set_device_num_h (n, d)
    646   use openacc_internal, only: acc_set_device_num_l
    647   use openacc_kinds
    648   integer n
    649   integer (acc_device_kind) d
    650   call acc_set_device_num_l (n, d)
    651 end subroutine
    652 
    653 function acc_get_device_num_h (d)
    654   use openacc_internal, only: acc_get_device_num_l
    655   use openacc_kinds
    656   integer acc_get_device_num_h
    657   integer (acc_device_kind) d
    658   acc_get_device_num_h = acc_get_device_num_l (d)
    659 end function
    660 
    661 function acc_async_test_h (a)
    662   use openacc_internal, only: acc_async_test_l
    663   logical acc_async_test_h
    664   integer a
    665   if (acc_async_test_l (a) .eq. 1) then
    666     acc_async_test_h = .TRUE.
    667   else
    668     acc_async_test_h = .FALSE.
    669   end if
    670 end function
    671 
    672 function acc_async_test_all_h ()
    673   use openacc_internal, only: acc_async_test_all_l
    674   logical acc_async_test_all_h
    675   if (acc_async_test_all_l () .eq. 1) then
    676     acc_async_test_all_h = .TRUE.
    677   else
    678     acc_async_test_all_h = .FALSE.
    679   end if
    680 end function
    681 
    682 subroutine acc_wait_h (a)
    683   use openacc_internal, only: acc_wait_l
    684   integer a
    685   call acc_wait_l (a)
    686 end subroutine
    687 
    688 subroutine acc_wait_async_h (a1, a2)
    689   use openacc_internal, only: acc_wait_async_l
    690   integer a1, a2
    691   call acc_wait_async_l (a1, a2)
    692 end subroutine
    693 
    694 subroutine acc_wait_all_h ()
    695   use openacc_internal, only: acc_wait_all_l
    696   call acc_wait_all_l ()
    697 end subroutine
    698 
    699 subroutine acc_wait_all_async_h (a)
    700   use openacc_internal, only: acc_wait_all_async_l
    701   integer a
    702   call acc_wait_all_async_l (a)
    703 end subroutine
    704 
    705 subroutine acc_init_h (d)
    706   use openacc_internal, only: acc_init_l
    707   use openacc_kinds
    708   integer (acc_device_kind) d
    709   call acc_init_l (d)
    710 end subroutine
    711 
    712 subroutine acc_shutdown_h (d)
    713   use openacc_internal, only: acc_shutdown_l
    714   use openacc_kinds
    715   integer (acc_device_kind) d
    716   call acc_shutdown_l (d)
    717 end subroutine
    718 
    719 function acc_on_device_h (d)
    720   use openacc_internal, only: acc_on_device_l
    721   use openacc_kinds
    722   integer (acc_device_kind) d
    723   logical acc_on_device_h
    724   if (acc_on_device_l (d) .eq. 1) then
    725     acc_on_device_h = .TRUE.
    726   else
    727     acc_on_device_h = .FALSE.
    728   end if
    729 end function
    730 
    731 subroutine acc_copyin_32_h (a, len)
    732   use iso_c_binding, only: c_int32_t, c_size_t
    733   use openacc_internal, only: acc_copyin_l
    734   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    735   type (*), dimension (*) :: a
    736   integer (c_int32_t) len
    737   call acc_copyin_l (a, int (len, kind = c_size_t))
    738 end subroutine
    739 
    740 subroutine acc_copyin_64_h (a, len)
    741   use iso_c_binding, only: c_int64_t, c_size_t
    742   use openacc_internal, only: acc_copyin_l
    743   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    744   type (*), dimension (*) :: a
    745   integer (c_int64_t) len
    746   call acc_copyin_l (a, int (len, kind = c_size_t))
    747 end subroutine
    748 
    749 subroutine acc_copyin_array_h (a)
    750   use openacc_internal, only: acc_copyin_l
    751   type (*), dimension (..), contiguous :: a
    752   call acc_copyin_l (a, sizeof (a))
    753 end subroutine
    754 
    755 subroutine acc_present_or_copyin_32_h (a, len)
    756   use iso_c_binding, only: c_int32_t, c_size_t
    757   use openacc_internal, only: acc_present_or_copyin_l
    758   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    759   type (*), dimension (*) :: a
    760   integer (c_int32_t) len
    761   call acc_present_or_copyin_l (a, int (len, kind = c_size_t))
    762 end subroutine
    763 
    764 subroutine acc_present_or_copyin_64_h (a, len)
    765   use iso_c_binding, only: c_int64_t, c_size_t
    766   use openacc_internal, only: acc_present_or_copyin_l
    767   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    768   type (*), dimension (*) :: a
    769   integer (c_int64_t) len
    770   call acc_present_or_copyin_l (a, int (len, kind = c_size_t))
    771 end subroutine
    772 
    773 subroutine acc_present_or_copyin_array_h (a)
    774   use openacc_internal, only: acc_present_or_copyin_l
    775   type (*), dimension (..), contiguous :: a
    776   call acc_present_or_copyin_l (a, sizeof (a))
    777 end subroutine
    778 
    779 subroutine acc_create_32_h (a, len)
    780   use iso_c_binding, only: c_int32_t, c_size_t
    781   use openacc_internal, only: acc_create_l
    782   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    783   type (*), dimension (*) :: a
    784   integer (c_int32_t) len
    785   call acc_create_l (a, int (len, kind = c_size_t))
    786 end subroutine
    787 
    788 subroutine acc_create_64_h (a, len)
    789   use iso_c_binding, only: c_int64_t, c_size_t
    790   use openacc_internal, only: acc_create_l
    791   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    792   type (*), dimension (*) :: a
    793   integer (c_int64_t) len
    794   call acc_create_l (a, int (len, kind = c_size_t))
    795 end subroutine
    796 
    797 subroutine acc_create_array_h (a)
    798   use openacc_internal, only: acc_create_l
    799   type (*), dimension (..), contiguous :: a
    800   call acc_create_l (a, sizeof (a))
    801 end subroutine
    802 
    803 subroutine acc_present_or_create_32_h (a, len)
    804   use iso_c_binding, only: c_int32_t, c_size_t
    805   use openacc_internal, only: acc_present_or_create_l
    806   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    807   type (*), dimension (*) :: a
    808   integer (c_int32_t) len
    809   call acc_present_or_create_l (a, int (len, kind = c_size_t))
    810 end subroutine
    811 
    812 subroutine acc_present_or_create_64_h (a, len)
    813   use iso_c_binding, only: c_int64_t, c_size_t
    814   use openacc_internal, only: acc_present_or_create_l
    815   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    816   type (*), dimension (*) :: a
    817   integer (c_int64_t) len
    818   call acc_present_or_create_l (a, int (len, kind = c_size_t))
    819 end subroutine
    820 
    821 subroutine acc_present_or_create_array_h (a)
    822   use openacc_internal, only: acc_present_or_create_l
    823   type (*), dimension (..), contiguous :: a
    824   call acc_present_or_create_l (a, sizeof (a))
    825 end subroutine
    826 
    827 subroutine acc_copyout_32_h (a, len)
    828   use iso_c_binding, only: c_int32_t, c_size_t
    829   use openacc_internal, only: acc_copyout_l
    830   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    831   type (*), dimension (*) :: a
    832   integer (c_int32_t) len
    833   call acc_copyout_l (a, int (len, kind = c_size_t))
    834 end subroutine
    835 
    836 subroutine acc_copyout_64_h (a, len)
    837   use iso_c_binding, only: c_int64_t, c_size_t
    838   use openacc_internal, only: acc_copyout_l
    839   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    840   type (*), dimension (*) :: a
    841   integer (c_int64_t) len
    842   call acc_copyout_l (a, int (len, kind = c_size_t))
    843 end subroutine
    844 
    845 subroutine acc_copyout_array_h (a)
    846   use openacc_internal, only: acc_copyout_l
    847   type (*), dimension (..), contiguous :: a
    848   call acc_copyout_l (a, sizeof (a))
    849 end subroutine
    850 
    851 subroutine acc_delete_32_h (a, len)
    852   use iso_c_binding, only: c_int32_t, c_size_t
    853   use openacc_internal, only: acc_delete_l
    854   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    855   type (*), dimension (*) :: a
    856   integer (c_int32_t) len
    857   call acc_delete_l (a, int (len, kind = c_size_t))
    858 end subroutine
    859 
    860 subroutine acc_delete_64_h (a, len)
    861   use iso_c_binding, only: c_int64_t, c_size_t
    862   use openacc_internal, only: acc_delete_l
    863   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    864   type (*), dimension (*) :: a
    865   integer (c_int64_t) len
    866   call acc_delete_l (a, int (len, kind = c_size_t))
    867 end subroutine
    868 
    869 subroutine acc_delete_array_h (a)
    870   use openacc_internal, only: acc_delete_l
    871   type (*), dimension (..), contiguous :: a
    872   call acc_delete_l (a, sizeof (a))
    873 end subroutine
    874 
    875 subroutine acc_update_device_32_h (a, len)
    876   use iso_c_binding, only: c_int32_t, c_size_t
    877   use openacc_internal, only: acc_update_device_l
    878   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    879   type (*), dimension (*) :: a
    880   integer (c_int32_t) len
    881   call acc_update_device_l (a, int (len, kind = c_size_t))
    882 end subroutine
    883 
    884 subroutine acc_update_device_64_h (a, len)
    885   use iso_c_binding, only: c_int64_t, c_size_t
    886   use openacc_internal, only: acc_update_device_l
    887   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    888   type (*), dimension (*) :: a
    889   integer (c_int64_t) len
    890   call acc_update_device_l (a, int (len, kind = c_size_t))
    891 end subroutine
    892 
    893 subroutine acc_update_device_array_h (a)
    894   use openacc_internal, only: acc_update_device_l
    895   type (*), dimension (..), contiguous :: a
    896   call acc_update_device_l (a, sizeof (a))
    897 end subroutine
    898 
    899 subroutine acc_update_self_32_h (a, len)
    900   use iso_c_binding, only: c_int32_t, c_size_t
    901   use openacc_internal, only: acc_update_self_l
    902   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    903   type (*), dimension (*) :: a
    904   integer (c_int32_t) len
    905   call acc_update_self_l (a, int (len, kind = c_size_t))
    906 end subroutine
    907 
    908 subroutine acc_update_self_64_h (a, len)
    909   use iso_c_binding, only: c_int64_t, c_size_t
    910   use openacc_internal, only: acc_update_self_l
    911   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    912   type (*), dimension (*) :: a
    913   integer (c_int64_t) len
    914   call acc_update_self_l (a, int (len, kind = c_size_t))
    915 end subroutine
    916 
    917 subroutine acc_update_self_array_h (a)
    918   use openacc_internal, only: acc_update_self_l
    919   type (*), dimension (..), contiguous :: a
    920   call acc_update_self_l (a, sizeof (a))
    921 end subroutine
    922 
    923 function acc_is_present_32_h (a, len)
    924   use iso_c_binding, only: c_int32_t, c_size_t
    925   use openacc_internal, only: acc_is_present_l
    926   logical acc_is_present_32_h
    927   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    928   type (*), dimension (*) :: a
    929   integer (c_int32_t) len
    930   if (acc_is_present_l (a, int (len, kind = c_size_t)) .eq. 1) then
    931     acc_is_present_32_h = .TRUE.
    932   else
    933     acc_is_present_32_h = .FALSE.
    934   end if
    935 end function
    936 
    937 function acc_is_present_64_h (a, len)
    938   use iso_c_binding, only: c_int64_t, c_size_t
    939   use openacc_internal, only: acc_is_present_l
    940   logical acc_is_present_64_h
    941   !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
    942   type (*), dimension (*) :: a
    943   integer (c_int64_t) len
    944   if (acc_is_present_l (a, int (len, kind = c_size_t)) .eq. 1) then
    945     acc_is_present_64_h = .TRUE.
    946   else
    947     acc_is_present_64_h = .FALSE.
    948   end if
    949 end function
    950 
    951 function acc_is_present_array_h (a)
    952   use openacc_internal, only: acc_is_present_l
    953   logical acc_is_present_array_h
    954   type (*), dimension (..), contiguous :: a
    955   acc_is_present_array_h = acc_is_present_l (a, sizeof (a)) == 1
    956 end function
    957