d: Add testcase from PR108962
[official-gcc.git] / libgomp / openacc_lib.h
blob74f3e871d69ea5de51a00b837d3a5456c6e4f1bc
1 ! OpenACC Runtime Library Definitions. -*- mode: fortran -*-
3 ! Copyright (C) 2014-2023 Free Software Foundation, Inc.
5 ! Contributed by Tobias Burnus <burnus@net-b.de>
6 ! and Mentor Embedded.
8 ! This file is part of the GNU Offloading and Multi Processing Library
9 ! (libgomp).
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.
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.
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.
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/>.
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.
35 ! Keep in sync with openacc.f90 and config/accel/openacc.f90.
37 integer, parameter :: acc_device_kind = 4
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
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
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')
67 integer, parameter :: acc_handle_kind = 4
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
73 integer, parameter :: openacc_version = 201711
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
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
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
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
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
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
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
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
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
151 interface acc_wait
152 subroutine acc_wait_h (arg)
153 integer arg
154 end subroutine
155 end interface
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
162 interface acc_wait_async
163 subroutine acc_wait_async_h (arg, async)
164 integer arg, async
165 end subroutine
166 end interface
168 interface acc_wait_all
169 subroutine acc_wait_all_h ()
170 end subroutine
171 end interface
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
179 interface acc_wait_all_async
180 subroutine acc_wait_all_async_h (async)
181 integer async
182 end subroutine
183 end interface
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
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
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
207 ! acc_malloc: Only available in C/C++
208 ! acc_free: Only available in C/C++
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
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
225 subroutine acc_copyin_array_h (a)
226 type (*), dimension (..), contiguous :: a
227 end subroutine
228 end interface
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
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
245 subroutine acc_present_or_copyin_array_h (a)
246 type (*), dimension (..), contiguous :: a
247 end subroutine
248 end interface
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
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
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
271 subroutine acc_create_array_h (a)
272 type (*), dimension (..), contiguous :: a
273 end subroutine
274 end interface
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
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
291 subroutine acc_present_or_create_array_h (a)
292 type (*), dimension (..), contiguous :: a
293 end subroutine
294 end interface
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
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
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
317 subroutine acc_copyout_array_h (a)
318 type (*), dimension (..), contiguous :: a
319 end subroutine
320 end interface
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
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
337 subroutine acc_copyout_finalize_array_h (a)
338 type (*), dimension (..), contiguous :: a
339 end subroutine
340 end interface
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
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
357 subroutine acc_delete_array_h (a)
358 type (*), dimension (..), contiguous :: a
359 end subroutine
360 end interface
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
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
377 subroutine acc_delete_finalize_array_h (a)
378 type (*), dimension (..), contiguous :: a
379 end subroutine
380 end interface
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
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
397 subroutine acc_update_device_array_h (a)
398 type (*), dimension (..), contiguous :: a
399 end subroutine
400 end interface
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
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
417 subroutine acc_update_self_array_h (a)
418 type (*), dimension (..), contiguous :: a
419 end subroutine
420 end interface
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++
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
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
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
450 ! acc_memcpy_to_device: Only available in C/C++
451 ! acc_memcpy_from_device: Only available in C/C++
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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