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