xref: /netbsd-src/external/gpl3/gcc.old/dist/libgomp/openacc_lib.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1 !  OpenACC Runtime Library Definitions.			-*- mode: fortran -*-
2 
3 !  Copyright (C) 2014-2020 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       ! acc_malloc: Only available in C/C++
208       ! acc_free: Only available in C/C++
209 
210       interface acc_copyin
211         subroutine acc_copyin_32_h (a, len)
212           use iso_c_binding, only: c_int32_t
213 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
214           type (*), dimension (*) :: a
215           integer (c_int32_t) len
216         end subroutine
217 
218         subroutine acc_copyin_64_h (a, len)
219           use iso_c_binding, only: c_int64_t
220 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
221           type (*), dimension (*) :: a
222           integer (c_int64_t) len
223         end subroutine
224 
225         subroutine acc_copyin_array_h (a)
226           type (*), dimension (..), contiguous :: a
227           end subroutine
228       end interface
229 
230       interface acc_present_or_copyin
231         subroutine acc_present_or_copyin_32_h (a, len)
232           use iso_c_binding, only: c_int32_t
233 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
234           type (*), dimension (*) :: a
235           integer (c_int32_t) len
236         end subroutine
237 
238         subroutine acc_present_or_copyin_64_h (a, len)
239           use iso_c_binding, only: c_int64_t
240 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
241           type (*), dimension (*) :: a
242           integer (c_int64_t) len
243         end subroutine
244 
245         subroutine acc_present_or_copyin_array_h (a)
246           type (*), dimension (..), contiguous :: a
247           end subroutine
248       end interface
249 
250       interface acc_pcopyin
251         procedure :: acc_present_or_copyin_32_h
252         procedure :: acc_present_or_copyin_64_h
253         procedure :: acc_present_or_copyin_array_h
254       end interface
255 
256       interface acc_create
257         subroutine acc_create_32_h (a, len)
258           use iso_c_binding, only: c_int32_t
259 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
260           type (*), dimension (*) :: a
261           integer (c_int32_t) len
262         end subroutine
263 
264         subroutine acc_create_64_h (a, len)
265           use iso_c_binding, only: c_int64_t
266 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
267           type (*), dimension (*) :: a
268           integer (c_int64_t) len
269         end subroutine
270 
271         subroutine acc_create_array_h (a)
272           type (*), dimension (..), contiguous :: a
273           end subroutine
274       end interface
275 
276       interface acc_present_or_create
277         subroutine acc_present_or_create_32_h (a, len)
278           use iso_c_binding, only: c_int32_t
279 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
280           type (*), dimension (*) :: a
281           integer (c_int32_t) len
282         end subroutine
283 
284         subroutine acc_present_or_create_64_h (a, len)
285           use iso_c_binding, only: c_int64_t
286 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
287           type (*), dimension (*) :: a
288           integer (c_int64_t) len
289         end subroutine
290 
291         subroutine acc_present_or_create_array_h (a)
292           type (*), dimension (..), contiguous :: a
293           end subroutine
294       end interface
295 
296       interface acc_pcreate
297         procedure :: acc_present_or_create_32_h
298         procedure :: acc_present_or_create_64_h
299         procedure :: acc_present_or_create_array_h
300       end interface
301 
302       interface acc_copyout
303         subroutine acc_copyout_32_h (a, len)
304           use iso_c_binding, only: c_int32_t
305 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
306           type (*), dimension (*) :: a
307           integer (c_int32_t) len
308         end subroutine
309 
310         subroutine acc_copyout_64_h (a, len)
311           use iso_c_binding, only: c_int64_t
312 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
313           type (*), dimension (*) :: a
314           integer (c_int64_t) len
315         end subroutine
316 
317         subroutine acc_copyout_array_h (a)
318           type (*), dimension (..), contiguous :: a
319         end subroutine
320       end interface
321 
322       interface acc_copyout_finalize
323         subroutine acc_copyout_finalize_32_h (a, len)
324           use iso_c_binding, only: c_int32_t
325 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
326           type (*), dimension (*) :: a
327           integer (c_int32_t) len
328         end subroutine
329 
330         subroutine acc_copyout_finalize_64_h (a, len)
331           use iso_c_binding, only: c_int64_t
332 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
333           type (*), dimension (*) :: a
334           integer (c_int64_t) len
335         end subroutine
336 
337         subroutine acc_copyout_finalize_array_h (a)
338           type (*), dimension (..), contiguous :: a
339         end subroutine
340       end interface
341 
342       interface acc_delete
343         subroutine acc_delete_32_h (a, len)
344           use iso_c_binding, only: c_int32_t
345 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
346           type (*), dimension (*) :: a
347           integer (c_int32_t) len
348         end subroutine
349 
350         subroutine acc_delete_64_h (a, len)
351           use iso_c_binding, only: c_int64_t
352 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
353           type (*), dimension (*) :: a
354           integer (c_int64_t) len
355         end subroutine
356 
357         subroutine acc_delete_array_h (a)
358           type (*), dimension (..), contiguous :: a
359         end subroutine
360       end interface
361 
362       interface acc_delete_finalize
363         subroutine acc_delete_finalize_32_h (a, len)
364           use iso_c_binding, only: c_int32_t
365 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
366           type (*), dimension (*) :: a
367           integer (c_int32_t) len
368         end subroutine
369 
370         subroutine acc_delete_finalize_64_h (a, len)
371           use iso_c_binding, only: c_int64_t
372 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
373           type (*), dimension (*) :: a
374           integer (c_int64_t) len
375         end subroutine
376 
377         subroutine acc_delete_finalize_array_h (a)
378           type (*), dimension (..), contiguous :: a
379         end subroutine
380       end interface
381 
382       interface acc_update_device
383         subroutine acc_update_device_32_h (a, len)
384           use iso_c_binding, only: c_int32_t
385 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
386           type (*), dimension (*) :: a
387           integer (c_int32_t) len
388         end subroutine
389 
390         subroutine acc_update_device_64_h (a, len)
391           use iso_c_binding, only: c_int64_t
392 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
393           type (*), dimension (*) :: a
394           integer (c_int64_t) len
395         end subroutine
396 
397         subroutine acc_update_device_array_h (a)
398           type (*), dimension (..), contiguous :: a
399         end subroutine
400       end interface
401 
402       interface acc_update_self
403         subroutine acc_update_self_32_h (a, len)
404           use iso_c_binding, only: c_int32_t
405 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
406           type (*), dimension (*) :: a
407           integer (c_int32_t) len
408         end subroutine
409 
410         subroutine acc_update_self_64_h (a, len)
411           use iso_c_binding, only: c_int64_t
412 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
413           type (*), dimension (*) :: a
414           integer (c_int64_t) len
415         end subroutine
416 
417         subroutine acc_update_self_array_h (a)
418           type (*), dimension (..), contiguous :: a
419         end subroutine
420       end interface
421 
422       ! acc_map_data: Only available in C/C++
423       ! acc_unmap_data: Only available in C/C++
424       ! acc_deviceptr: Only available in C/C++
425       ! acc_hostptr: Only available in C/C++
426 
427       interface acc_is_present
428         function acc_is_present_32_h (a, len)
429           use iso_c_binding, only: c_int32_t
430           logical acc_is_present_32_h
431 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
432           type (*), dimension (*) :: a
433           integer (c_int32_t) len
434         end function
435 
436         function acc_is_present_64_h (a, len)
437           use iso_c_binding, only: c_int64_t
438           logical acc_is_present_64_h
439 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
440           type (*), dimension (*) :: a
441           integer (c_int64_t) len
442         end function
443 
444         function acc_is_present_array_h (a)
445           logical acc_is_present_array_h
446           type (*), dimension (..), contiguous :: a
447         end function
448       end interface
449 
450       ! acc_memcpy_to_device: Only available in C/C++
451       ! acc_memcpy_from_device: Only available in C/C++
452 
453       interface acc_copyin_async
454         subroutine acc_copyin_async_32_h (a, len, async)
455           use iso_c_binding, only: c_int32_t
456           import acc_handle_kind
457 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
458           type (*), dimension (*) :: a
459           integer (c_int32_t) len
460           integer (acc_handle_kind) async
461         end subroutine
462 
463         subroutine acc_copyin_async_64_h (a, len, async)
464           use iso_c_binding, only: c_int64_t
465           import acc_handle_kind
466 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
467           type (*), dimension (*) :: a
468           integer (c_int64_t) len
469           integer (acc_handle_kind) async
470         end subroutine
471 
472         subroutine acc_copyin_async_array_h (a, async_)
473           import acc_handle_kind
474           type (*), dimension (..), contiguous :: a
475           integer (acc_handle_kind) async_
476         end subroutine
477       end interface
478 
479       interface acc_create_async
480         subroutine acc_create_async_32_h (a, len, async)
481           use iso_c_binding, only: c_int32_t
482           import acc_handle_kind
483 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
484           type (*), dimension (*) :: a
485           integer (c_int32_t) len
486           integer (acc_handle_kind) async
487         end subroutine
488 
489         subroutine acc_create_async_64_h (a, len, async)
490           use iso_c_binding, only: c_int64_t
491           import acc_handle_kind
492 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
493           type (*), dimension (*) :: a
494           integer (c_int64_t) len
495           integer (acc_handle_kind) async
496         end subroutine
497 
498         subroutine acc_create_async_array_h (a, async_)
499           import acc_handle_kind
500           type (*), dimension (..), contiguous :: a
501           integer (acc_handle_kind) async_
502         end subroutine
503       end interface
504 
505       interface acc_copyout_async
506         subroutine acc_copyout_async_32_h (a, len, async)
507           use iso_c_binding, only: c_int32_t
508           import acc_handle_kind
509 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
510           type (*), dimension (*) :: a
511           integer (c_int32_t) len
512           integer (acc_handle_kind) async
513         end subroutine
514 
515         subroutine acc_copyout_async_64_h (a, len, async)
516           use iso_c_binding, only: c_int64_t
517           import acc_handle_kind
518 !GCC$ ATTRIBUTES NO_ARG_CHECK :: a
519           type (*), dimension (*) :: a
520           integer (c_int64_t) len
521           integer (acc_handle_kind) async
522         end subroutine
523 
524         subroutine acc_copyout_async_array_h (a, async_)
525           import acc_handle_kind
526           type (*), dimension (..), contiguous :: a
527           integer (acc_handle_kind) async_
528         end subroutine
529       end interface
530 
531       interface acc_delete_async
532         subroutine acc_delete_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_delete_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_delete_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_update_device_async
558         subroutine acc_update_device_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_update_device_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_update_device_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_update_self_async
584         subroutine acc_update_self_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_update_self_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_update_self_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