1!  OpenACC Runtime Library Definitions.
2
3!  Copyright (C) 2014-2017 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
30module 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 removed.
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
60end module
61
62module 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
462end module
463
464module 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
621end module
622
623function 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)
629end function
630
631subroutine 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)
636end subroutine
637
638function 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 ()
643end function
644
645subroutine 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)
651end subroutine
652
653function 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)
659end function
660
661function 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
670end function
671
672function 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
680end function
681
682subroutine acc_wait_h (a)
683  use openacc_internal, only: acc_wait_l
684  integer a
685  call acc_wait_l (a)
686end subroutine
687
688subroutine 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)
692end subroutine
693
694subroutine acc_wait_all_h ()
695  use openacc_internal, only: acc_wait_all_l
696  call acc_wait_all_l ()
697end subroutine
698
699subroutine 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)
703end subroutine
704
705subroutine 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)
710end subroutine
711
712subroutine 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)
717end subroutine
718
719function 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
729end function
730
731subroutine 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))
738end subroutine
739
740subroutine 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))
747end subroutine
748
749subroutine 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))
753end subroutine
754
755subroutine 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))
762end subroutine
763
764subroutine 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))
771end subroutine
772
773subroutine 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))
777end subroutine
778
779subroutine 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))
786end subroutine
787
788subroutine 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))
795end subroutine
796
797subroutine 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))
801end subroutine
802
803subroutine 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))
810end subroutine
811
812subroutine 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))
819end subroutine
820
821subroutine 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))
825end subroutine
826
827subroutine 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))
834end subroutine
835
836subroutine 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))
843end subroutine
844
845subroutine 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))
849end subroutine
850
851subroutine 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))
858end subroutine
859
860subroutine 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))
867end subroutine
868
869subroutine 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))
873end subroutine
874
875subroutine 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))
882end subroutine
883
884subroutine 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))
891end subroutine
892
893subroutine 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))
897end subroutine
898
899subroutine 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))
906end subroutine
907
908subroutine 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))
915end subroutine
916
917subroutine 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))
921end subroutine
922
923function 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
935end function
936
937function 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
949end function
950
951function 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
956end function
957