2243 lines · plain
1!===-- module/cudedevice.f90 -----------------------------------------------===!2!3! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4! See https://llvm.org/LICENSE.txt for license information.5! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6!7!===------------------------------------------------------------------------===!8 9! CUDA Fortran procedures available in device subprogram10 11module cudadevice12 use __cuda_device13 use, intrinsic :: __fortran_builtins, only: dim3 => __builtin_dim314 use, intrinsic :: __fortran_builtins, only: c_devptr => __builtin_c_devptr15 use, intrinsic :: __fortran_builtins, only: c_devloc => __builtin_c_devloc16implicit none17 18 ! Synchronization Functions19 20 interface syncthreads21 procedure :: syncthreads22 end interface23 24 interface syncthreads_and25 attributes(device) integer function syncthreads_and_i4(value)26 integer(4), value :: value27 end function28 attributes(device) integer function syncthreads_and_l4(value)29 logical(4), value :: value30 end function31 end interface syncthreads_and32 33 interface syncthreads_count34 attributes(device) integer function syncthreads_count_i4(value)35 integer(4), value :: value36 end function37 attributes(device) integer function syncthreads_count_l4(value)38 logical(4), value :: value39 end function40 end interface syncthreads_count41 42 interface syncthreads_or43 attributes(device) integer function syncthreads_or_i4(value)44 integer(4), value :: value45 end function46 attributes(device) integer function syncthreads_or_l4(value)47 logical(4), value :: value48 end function49 end interface syncthreads_or50 51 interface52 attributes(device) subroutine syncwarp(mask)53 integer, value :: mask54 end subroutine55 end interface56 57 ! Memory Fences58 59 interface60 attributes(device) subroutine threadfence()61 end subroutine62 end interface63 64 interface65 attributes(device) subroutine threadfence_block()66 end subroutine67 end interface68 69 interface70 attributes(device) subroutine threadfence_system()71 end subroutine72 end interface73 74 ! Math API75 76 interface __fadd_rn77 attributes(device) real function __fadd_rn(a,b) bind(c, name='__nv_fadd_rn')78 !dir$ ignore_tkr (d) a, (d) b79 real, value :: a, b80 end function81 end interface82 83 interface __fadd_rz84 attributes(device) real function __fadd_rz(a,b) bind(c, name='__nv_fadd_rz')85 !dir$ ignore_tkr (d) a, (d) b86 real, value :: a, b87 end function88 end interface89 90 interface91 attributes(device) function __fadd_rd(x, y) bind(c, name='__nv_fadd_rd')92 real, intent(in), value :: x, y93 real :: __fadd_rd94 end function95 end interface96 97 interface98 attributes(device) function __fadd_ru(x, y) bind(c, name='__nv_fadd_ru')99 real, intent(in), value :: x, y100 real :: __fadd_ru101 end function102 end interface103 104 interface __fmul_rn105 attributes(device) real function __fmul_rn(a,b) bind(c, name='__nv_fmul_rn')106 !dir$ ignore_tkr (d) a, (d) b107 real, value :: a, b108 end function109 end interface110 111 interface __fmul_rz112 attributes(device) real function __fmul_rz(a,b) bind(c, name='__nv_fmul_rz')113 !dir$ ignore_tkr (d) a, (d) b114 real, value :: a, b115 end function116 end interface117 118 interface __fmul_ru119 attributes(device) real function __fmul_ru(a,b) bind(c, name='__nv_fmul_ru')120 !dir$ ignore_tkr (d) a, (d) b121 real, value :: a, b122 end function123 end interface124 125 interface __fmul_rd126 attributes(device) real function __fmul_rd(a,b) bind(c, name='__nv_fmul_rd')127 !dir$ ignore_tkr (d) a, (d) b128 real, value :: a, b129 end function130 end interface131 132 interface __fmaf_rn133 attributes(device) real function __fmaf_rn(a,b,c) bind(c, name='__nv_fmaf_rn')134 !dir$ ignore_tkr (d) a, (d) b, (d) c135 real, value :: a, b, c136 end function137 end interface138 139 interface __fmaf_rz140 attributes(device) real function __fmaf_rz(a,b,c) bind(c, name='__nv_fmaf_rz')141 !dir$ ignore_tkr (d) a, (d) b, (d) c142 real, value :: a, b, c143 end function144 end interface145 146 interface __fmaf_ru147 attributes(device) real function __fmaf_ru(a,b,c) bind(c, name='__nv_fmaf_ru')148 !dir$ ignore_tkr (d) a, (d) b, (d) c149 real, value :: a, b, c150 end function151 end interface152 153 interface __fmaf_rd154 attributes(device) real function __fmaf_rd(a,b,c) bind(c, name='__nv_fmaf_rd')155 !dir$ ignore_tkr (d) a, (d) b, (d) c156 real, value :: a, b, c157 end function158 end interface159 160 interface __frcp_rn161 attributes(device) real function __frcp_rn(a) bind(c, name='__nv_frcp_rn')162 !dir$ ignore_tkr (d) a163 real, value :: a164 end function165 end interface166 167 interface __frcp_rz168 attributes(device) real function __frcp_rz(a) bind(c, name='__nv_frcp_rz')169 !dir$ ignore_tkr (d) a170 real, value :: a171 end function172 end interface173 174 interface __frcp_ru175 attributes(device) real function __frcp_ru(a) bind(c, name='__nv_frcp_ru')176 !dir$ ignore_tkr (d) a177 real, value :: a178 end function179 end interface180 181 interface __frcp_rd182 attributes(device) real function __frcp_rd(a) bind(c, name='__nv_frcp_rd')183 !dir$ ignore_tkr (d) a184 real, value :: a185 end function186 end interface187 188 interface __fsqrt_rn189 attributes(device) real function __fsqrt_rn(a) bind(c, name='__nv_fsqrt_rn')190 !dir$ ignore_tkr (d) a191 real, value :: a192 end function193 end interface194 195 interface __fsqrt_rz196 attributes(device) real function __fsqrt_rz(a) bind(c, name='__nv_fsqrt_rz')197 !dir$ ignore_tkr (d) a198 real, value :: a199 end function200 end interface201 202 interface __fsqrt_ru203 attributes(device) real function __fsqrt_ru(a) bind(c, name='__nv_fsqrt_ru')204 !dir$ ignore_tkr (d) a205 real, value :: a206 end function207 end interface208 209 interface __fsqrt_rd210 attributes(device) real function __fsqrt_rd(a) bind(c, name='__nv_fsqrt_rd')211 !dir$ ignore_tkr (d) a212 real, value :: a213 end function214 end interface215 216 interface __fdiv_rn217 attributes(device) real function __fdiv_rn(a,b) bind(c, name='__nv_fdiv_rn')218 !dir$ ignore_tkr (d) a, (d) b219 real, value :: a, b220 end function221 end interface222 223 interface __fdiv_rz224 attributes(device) real function __fdiv_rz(a,b) bind(c, name='__nv_fdiv_rz')225 !dir$ ignore_tkr (d) a, (d) b226 real, value :: a, b227 end function228 end interface229 230 interface __fdiv_ru231 attributes(device) real function __fdiv_ru(a,b) bind(c, name='__nv_fdiv_ru')232 !dir$ ignore_tkr (d) a, (d) b233 real, value :: a, b234 end function235 end interface236 237 interface __fdiv_rd238 attributes(device) real function __fdiv_rd(a,b) bind(c, name='__nv_fdiv_rd')239 !dir$ ignore_tkr (d) a, (d) b240 real, value :: a, b241 end function242 end interface243 244 interface __dadd_rn245 attributes(device) real(8) function __dadd_rn(a,b) bind(c, name='__nv_dadd_rn')246 !dir$ ignore_tkr (d) a, (d) b247 real(8), value :: a, b248 end function249 end interface250 251 interface __dadd_rz252 attributes(device) real(8) function __dadd_rz(a,b) bind(c, name='__nv_dadd_rz')253 !dir$ ignore_tkr (d) a, (d) b254 real(8), value :: a, b255 end function256 end interface257 258 interface __dadd_ru259 attributes(device) real(8) function __dadd_ru(a,b) bind(c, name='__nv_dadd_ru')260 !dir$ ignore_tkr (d) a, (d) b261 real(8), value :: a, b262 end function263 end interface264 265 interface __dadd_rd266 attributes(device) real(8) function __dadd_rd(a,b) bind(c, name='__nv_dadd_rd')267 !dir$ ignore_tkr (d) a, (d) b268 real(8), value :: a, b269 end function270 end interface271 272 interface __dmul_rn273 attributes(device) real(8) function __dmul_rn(a,b) bind(c, name='__nv_dmul_rn')274 !dir$ ignore_tkr (d) a, (d) b275 real(8), value :: a, b276 end function277 end interface278 279 interface __dmul_rz280 attributes(device) real(8) function __dmul_rz(a,b) bind(c, name='__nv_dmul_rz')281 !dir$ ignore_tkr (d) a, (d) b282 real(8), value :: a, b283 end function284 end interface285 286 interface __dmul_ru287 attributes(device) real(8) function __dmul_ru(a,b) bind(c, name='__nv_dmul_ru')288 !dir$ ignore_tkr (d) a, (d) b289 real(8), value :: a, b290 end function291 end interface292 293 interface __dmul_rd294 attributes(device) real(8) function __dmul_rd(a,b) bind(c, name='__nv_dmul_rd')295 !dir$ ignore_tkr (d) a, (d) b296 real(8), value :: a, b297 end function298 end interface299 300 interface __fma_rn301 attributes(device) real(8) function __fma_rn(a,b,c) bind(c, name='__nv_fma_rn')302 !dir$ ignore_tkr (d) a, (d) b303 real(8), value :: a, b, c304 end function305 end interface306 307 interface __fma_rz308 attributes(device) real(8) function __fma_rz(a,b,c) bind(c, name='__nv_fma_rz')309 !dir$ ignore_tkr (d) a, (d) b310 real(8), value :: a, b, c311 end function312 end interface313 314 interface __fma_ru315 attributes(device) real(8) function __fma_ru(a,b,c) bind(c, name='__nv_fma_ru')316 !dir$ ignore_tkr (d) a, (d) b317 real(8), value :: a, b, c318 end function319 end interface320 321 interface __fma_rd322 attributes(device) real(8) function __fma_rd(a,b,c) bind(c, name='__nv_fma_rd')323 !dir$ ignore_tkr (d) a, (d) b324 real(8), value :: a, b, c325 end function326 end interface327 328 interface rsqrt329 attributes(device) real(4) function rsqrtf(x) bind(c,name='__nv_rsqrtf')330 real(4), value :: x331 end function332 attributes(device) real(8) function rsqrt(x) bind(c,name='__nv_rsqrt')333 real(8), value :: x334 end function335 end interface336 337 interface saturate338 attributes(device) real function __saturatef(r) bind(c, name='__nv_saturatef')339 !dir$ ignore_tkr (d) r340 real, value :: r341 end function342 end interface343 344 interface __sad345 attributes(device) integer function __sad(i,j,k) bind(c, name='__nv_sad')346 !dir$ ignore_tkr (d) i, (d) j, (d) k347 integer, value :: i,j,k348 end function349 end interface350 351 interface __usad352 attributes(device) integer function __usad(i,j,k) bind(c, name='__nv_usad')353 !dir$ ignore_tkr (d) i, (d) j, (d) k354 integer, value :: i,j,k355 end function356 end interface357 358 interface signbit359 attributes(device) integer(4) function signbitf(x) bind(c,name='__nv_signbitf')360 real(4), value :: x361 end function362 attributes(device) integer(4) function signbit(x) bind(c,name='__nv_signbitd')363 real(8), value :: x364 end function365 end interface366 367 interface368 attributes(device) subroutine sincosf(x, y, z) bind(c,name='__nv_sincosf')369 real(4), value :: x370 real(4), device :: y371 real(4), device :: z372 end subroutine373 end interface374 interface375 attributes(device) subroutine sincos(x, y, z) bind(c,name='__nv_sincos')376 real(8), value :: x377 real(8), device :: y378 real(8), device :: z379 end subroutine380 end interface381 interface sincos382 procedure :: sincosf383 procedure :: sincos384 end interface385 386 interface387 attributes(device) subroutine sincospif(x, y, z) bind(c,name='__nv_sincospif')388 real(4), value :: x389 real(4), device :: y390 real(4), device :: z391 end subroutine392 end interface393 interface394 attributes(device) subroutine sincospi(x, y, z) bind(c,name='__nv_sincospi')395 real(8), value :: x396 real(8), device :: y397 real(8), device :: z398 end subroutine399 end interface400 interface sincospi401 procedure :: sincospif402 procedure :: sincospi403 end interface404 405 interface406 attributes(device) real(4) function __cosf(x) bind(c, name='__nv_fast_cosf')407 real(4), value :: x408 end function409 end interface410 411 interface __exp10f412 attributes(device) real function __exp10f(r) bind(c, name='__nv_fast_exp10f')413 !dir$ ignore_tkr (d) r414 real, value :: r415 end function416 end interface417 418 interface __expf419 attributes(device) real function __expf(r) bind(c, name='__nv_fast_expf')420 !dir$ ignore_tkr (d) r421 real, value :: r422 end function423 end interface424 425 interface __fdividef426 attributes(device) real function __fdividef(r,d) bind(c, name='__nv_fast_fdividef')427 !dir$ ignore_tkr (d) r, (d) d428 real, value :: r,d429 end function430 end interface431 432 interface __log10f433 attributes(device) real function __log10f(r) bind(c, name='__nv_fast_log10f')434 !dir$ ignore_tkr (d) r435 real, value :: r436 end function437 end interface438 439 interface __log2f440 attributes(device) real function __log2f(r) bind(c, name='__nv_fast_log2f')441 !dir$ ignore_tkr (d) r442 real, value :: r443 end function444 end interface445 446 interface __logf447 attributes(device) real function __logf(r) bind(c, name='__nv_fast_logf')448 !dir$ ignore_tkr (d) r449 real, value :: r450 end function451 end interface452 453 interface454 attributes(device) real(4) function __powf(x,y) bind(c, name='__nv_fast_powf')455 !dir$ ignore_tkr (d) x, y456 real(4), value :: x, y457 end function458 end interface459 460 interface __sincosf461 attributes(device) subroutine __sincosf(r, s, c) bind(c, name='__nv_fast_sincosf')462 !dir$ ignore_tkr (d) r, (d) s, (d) c463 real, value :: r464 real :: s, c465 end subroutine466 end interface467 468 interface __sinf469 attributes(device) real function __sinf(r) bind(c, name='__nv_fast_sinf')470 !dir$ ignore_tkr (d) r471 real, value :: r472 end function473 end interface474 475 interface __tanf476 attributes(device) real function __tanf(r) bind(c, name='__nv_fast_tanf')477 !dir$ ignore_tkr (d) r478 real, value :: r479 end function480 end interface481 482 interface483 attributes(device) real(4) function cospif(x) bind(c,name='__nv_cospif')484 real(4), value :: x485 end function486 end interface487 interface488 attributes(device) real(8) function cospi(x) bind(c,name='__nv_cospi')489 real(8), value :: x490 end function491 end interface492 interface cospi493 procedure :: cospif494 procedure :: cospi495 end interface496 497 interface 498 attributes(device) real(4) function sinpif(x) bind(c,name='__nv_sinpif')499 real(4), value :: x500 end function501 end interface502 interface503 attributes(device) real(8) function sinpi(x) bind(c,name='__nv_sinpi')504 real(8), value :: x505 end function506 end interface507 interface sinpi508 procedure :: sinpif509 procedure :: sinpi510 end interface511 512 interface mulhi513 attributes(device) integer function __mulhi(i,j) bind(c,name='__nv_mulhi')514 !dir$ ignore_tkr (d) i, (d) j515 integer, value :: i,j516 end function517 end interface518 519 interface umulhi520 attributes(device) integer function __umulhi(i,j) bind(c,name='__nv_umulhi')521 !dir$ ignore_tkr (d) i, (d) j522 integer, value :: i,j523 end function524 end interface525 526 interface mul64hi527 attributes(device) integer(8) function __mul64hi(i,j) bind(c,name='__nv_mul64hi')528 !dir$ ignore_tkr (d) i, (d) j529 integer(8), value :: i,j530 end function531 end interface532 533 interface umul64hi534 attributes(device) integer(8) function __umul64hi(i,j) bind(c,name='__nv_umul64hi')535 !dir$ ignore_tkr (d) i, (d) j536 integer(8), value :: i,j537 end function538 end interface539 540 interface int_as_float541 attributes(device) real function __int_as_float(i) bind(c, name='__nv_int_as_float')542 !dir$ ignore_tkr (d) i543 integer, value :: i544 end function545 end interface546 547 interface float_as_int548 attributes(device) integer function __float_as_int(i) bind(c, name='__nv_float_as_int')549 !dir$ ignore_tkr (d) i550 real, value :: i551 end function552 end interface553 554 interface __float2half_rn555 attributes(device) real(2) function __float2half_rn(r) bind(c, name='__nv_float2half_rn')556 !dir$ ignore_tkr (d) r557 real, value :: r558 end function559 end interface560 561 interface __float2int_rd562 attributes(device) integer function __float2int_rd(r) bind(c, name='__nv_float2int_rd')563 !dir$ ignore_tkr (d) r564 real, value :: r565 end function566 end interface567 568 interface __float2int_rn569 attributes(device) integer function __float2int_rn(r) bind(c, name='__nv_float2int_rn')570 !dir$ ignore_tkr (d) r571 real, value :: r572 end function573 end interface574 575 interface __float2int_ru576 attributes(device) integer function __float2int_ru(r) bind(c, name='__nv_float2int_ru')577 !dir$ ignore_tkr (d) r578 real, value :: r579 end function580 end interface581 582 interface __float2int_rz583 attributes(device) integer function __float2int_rz(r) bind(c, name='__nv_float2int_rz')584 !dir$ ignore_tkr (d) r585 real, value :: r586 end function587 end interface588 589 interface __float2uint_rd590 attributes(device) integer function __float2uint_rd(r) bind(c, name='__nv_float2uint_rd')591 !dir$ ignore_tkr (d) r592 real, value :: r593 end function594 end interface595 596 interface __float2uint_rn597 attributes(device) integer function __float2uint_rn(r) bind(c, name='__nv_float2uint_rn')598 !dir$ ignore_tkr (d) r599 real, value :: r600 end function601 end interface602 603 interface __float2uint_ru604 attributes(device) integer function __float2uint_ru(r) bind(c, name='__nv_float2uint_ru')605 !dir$ ignore_tkr (d) r606 real, value :: r607 end function608 end interface609 610 interface __float2uint_rz611 attributes(device) integer function __float2uint_rz(r) bind(c, name='__nv_float2uint_rz')612 !dir$ ignore_tkr (d) r613 real, value :: r614 end function615 end interface616 617 interface __float2ll_rd618 attributes(device) integer(8) function __float2ll_rd(r) bind(c, name='__nv_float2ll_rd')619 !dir$ ignore_tkr (d) r620 real, value :: r621 end function622 end interface623 624 interface __float2ll_rn625 attributes(device) integer(8) function __float2ll_rn(r) bind(c, name='__nv_float2ll_rn')626 !dir$ ignore_tkr (d) r627 real, value :: r628 end function629 end interface630 631 interface __float2ll_ru632 attributes(device) integer(8) function __float2ll_ru(r) bind(c, name='__nv_float2ll_ru')633 !dir$ ignore_tkr (d) r634 real, value :: r635 end function636 end interface637 638 interface __float2ll_rz639 attributes(device) integer(8) function __float2ll_rz(r) bind(c, name='__nv_float2ll_rz')640 !dir$ ignore_tkr (d) r641 real, value :: r642 end function643 end interface644 645 interface __half2float646 attributes(device) real function __half2float(i) bind(c, name='__nv_half2float')647 !dir$ ignore_tkr (d) i648 real(2), value :: i649 end function650 end interface651 652 interface double_as_longlong653 attributes(device) integer(8) function __double_as_longlong(i) bind(c, name='__nv_double_as_longlong')654 !dir$ ignore_tkr (d) i655 real(8), value :: i656 end function657 end interface658 659 interface longlong_as_double660 attributes(device) real(8) function __longlong_as_double(i) bind(c, name='__nv_longlong_as_double')661 !dir$ ignore_tkr (d) i662 integer(8), value :: i663 end function664 end interface665 666 interface __double2int_rd667 attributes(device) integer function __double2int_rd(r) bind(c, name='__nv_double2int_rd')668 !dir$ ignore_tkr (d) r669 double precision, value :: r670 end function671 end interface672 673 interface __double2int_rn674 attributes(device) integer function __double2int_rn(r) bind(c, name='__nv_double2int_rn')675 !dir$ ignore_tkr (d) r676 double precision, value :: r677 end function678 end interface679 680 interface __double2int_ru681 attributes(device) integer function __double2int_ru(r) bind(c, name='__nv_double2int_ru')682 !dir$ ignore_tkr (d) r683 double precision, value :: r684 end function685 end interface686 687 interface __double2int_rz688 attributes(device) integer function __double2int_rz(r) bind(c, name='__nv_double2int_rz')689 !dir$ ignore_tkr (d) r690 double precision, value :: r691 end function692 end interface693 694 interface __double2uint_rd695 attributes(device) integer function __double2uint_rd(r) bind(c, name='__nv_double2uint_rd')696 !dir$ ignore_tkr (d) r697 double precision, value :: r698 end function699 end interface700 701 interface __double2uint_rn702 attributes(device) integer function __double2uint_rn(r) bind(c, name='__nv_double2uint_rn')703 !dir$ ignore_tkr (d) r704 double precision, value :: r705 end function706 end interface707 708 interface __double2uint_ru709 attributes(device) integer function __double2uint_ru(r) bind(c, name='__nv_double2uint_ru')710 !dir$ ignore_tkr (d) r711 double precision, value :: r712 end function713 end interface714 715 interface __double2uint_rz716 attributes(device) integer function __double2uint_rz(r) bind(c, name='__nv_double2uint_rz')717 !dir$ ignore_tkr (d) r718 double precision, value :: r719 end function720 end interface721 722 interface __double2float_rn723 attributes(device) real function __double2float_rn(r) bind(c, name='__nv_double2float_rn')724 !dir$ ignore_tkr (d) r725 double precision, value :: r726 end function727 end interface728 729 interface __double2float_rz730 attributes(device) real function __double2float_rz(r) bind(c, name='__nv_double2float_rz')731 !dir$ ignore_tkr (d) r732 double precision, value :: r733 end function734 end interface735 736 interface __double2float_ru737 attributes(device) real function __double2float_ru(r) bind(c, name='__nv_double2float_ru')738 !dir$ ignore_tkr (d) r739 double precision, value :: r740 end function741 end interface742 743 interface __double2float_rd744 attributes(device) real function __double2float_rd(r) bind(c, name='__nv_double2float_rd')745 !dir$ ignore_tkr (d) r746 double precision, value :: r747 end function748 end interface749 750 interface __double2loint751 attributes(device) integer function __double2loint(r) bind(c, name='__nv_double2loint')752 !dir$ ignore_tkr (d) r753 double precision, value :: r754 end function755 end interface756 757 interface __double2hiint758 attributes(device) integer function __double2hiint(r) bind(c, name='__nv_double2hiint')759 !dir$ ignore_tkr (d) r760 double precision, value :: r761 end function762 end interface763 764 interface __hiloint2double765 attributes(device) double precision function __hiloint2double(i, j) bind(c, name='__nv_hiloint2double')766 !dir$ ignore_tkr (d) i, (d) j767 integer, value :: i, j768 end function769 end interface770 771 interface __int2float_rd772 attributes(device) real function __int2float_rd(i) bind(c, name='__nv_int2float_rd')773 !dir$ ignore_tkr (d) i774 integer, value :: i775 end function776 end interface777 778 interface __int2float_rn779 attributes(device) real function __int2float_rn(i) bind(c, name='__nv_int2float_rn')780 !dir$ ignore_tkr (d) i781 integer, value :: i782 end function783 end interface784 785 interface __int2float_ru786 attributes(device) real function __int2float_ru(i) bind(c, name='__nv_int2float_ru')787 !dir$ ignore_tkr (d) i788 integer, value :: i789 end function790 end interface791 792 interface __int2float_rz793 attributes(device) real function __int2float_rz(i) bind(c, name='__nv_int2float_rz')794 !dir$ ignore_tkr (d) i795 integer, value :: i796 end function797 end interface798 799 interface __int2double_rn800 attributes(device) double precision function __int2double_rn(i) bind(c, name='__nv_int2double_rn')801 !dir$ ignore_tkr (d) i802 integer, value :: i803 end function804 end interface805 806 interface __uint2float_rd807 attributes(device) real function __uint2float_rd(i) bind(c, name='__nv_uint2float_rd')808 !dir$ ignore_tkr (d) i809 integer, value :: i810 end function811 end interface812 813 interface __uint2float_rn814 attributes(device) real function __uint2float_rn(i) bind(c, name='__nv_uint2float_rn')815 !dir$ ignore_tkr (d) i816 integer, value :: i817 end function818 end interface819 820 interface __uint2float_ru821 attributes(device) real function __uint2float_ru(i) bind(c, name='__nv_uint2float_ru')822 !dir$ ignore_tkr (d) i823 integer, value :: i824 end function825 end interface826 827 interface __uint2float_rz828 attributes(device) real function __uint2float_rz(i) bind(c, name='__nv_uint2float_rz')829 !dir$ ignore_tkr (d) i830 integer, value :: i831 end function832 end interface833 834 interface __uint2double_rn835 attributes(device) double precision function __uint2double_rn(i) bind(c, name='__nv_uint2double_rn')836 !dir$ ignore_tkr (d) i837 integer, value :: i838 end function839 end interface840 841 interface __double2ll_rd842 attributes(device) integer(8) function __double2ll_rd(r) bind(c, name='__nv_double2ll_rd')843 !dir$ ignore_tkr (d) r844 double precision, value :: r845 end function846 end interface847 848 interface __double2ll_rn849 attributes(device) integer(8) function __double2ll_rn(r) bind(c, name='__nv_double2ll_rn')850 !dir$ ignore_tkr (d) r851 double precision, value :: r852 end function853 end interface854 855 interface __double2ll_ru856 attributes(device) integer(8) function __double2ll_ru(r) bind(c, name='__nv_double2ll_ru')857 !dir$ ignore_tkr (d) r858 double precision, value :: r859 end function860 end interface861 862 interface __double2ll_rz863 attributes(device) integer(8) function __double2ll_rz(r) bind(c, name='__nv_double2ll_rz')864 !dir$ ignore_tkr (d) r865 double precision, value :: r866 end function867 end interface868 869 interface __double2ull_rd870 attributes(device) integer(8) function __double2ull_rd(r) bind(c, name='__nv_double2ull_rd')871 !dir$ ignore_tkr (d) r872 double precision, value :: r873 end function874 end interface875 876 interface __double2ull_rn877 attributes(device) integer(8) function __double2ull_rn(r) bind(c, name='__nv_double2ull_rn')878 !dir$ ignore_tkr (d) r879 double precision, value :: r880 end function881 end interface882 883 interface __double2ull_ru884 attributes(device) integer(8) function __double2ull_ru(r) bind(c, name='__nv_double2ull_ru')885 !dir$ ignore_tkr (d) r886 double precision, value :: r887 end function888 end interface889 890 interface __double2ull_rz891 attributes(device) integer(8) function __double2ull_rz(r) bind(c, name='__nv_double2ull_rz')892 !dir$ ignore_tkr (d) r893 double precision, value :: r894 end function895 end interface896 897 interface __ll2float_rd898 attributes(device) real function __ll2float_rd(i) bind(c, name='__nv_ll2float_rd')899 !dir$ ignore_tkr (d) i900 integer(8), value :: i901 end function902 end interface903 904 interface __ll2float_rn905 attributes(device) real function __ll2float_rn(i) bind(c, name='__nv_ll2float_rn')906 !dir$ ignore_tkr (d) i907 integer(8), value :: i908 end function909 end interface910 911 interface __ll2float_ru912 attributes(device) real function __ll2float_ru(i) bind(c, name='__nv_ll2float_ru')913 !dir$ ignore_tkr (d) i914 integer(8), value :: i915 end function916 end interface917 918 interface __ll2float_rz919 attributes(device) real function __ll2float_rz(i) bind(c, name='__nv_ll2float_rz')920 !dir$ ignore_tkr (d) i921 integer(8), value :: i922 end function923 end interface924 925 interface __ll2double_rd926 attributes(device) double precision function __ll2double_rd(i) bind(c, name='__nv_ll2double_rd')927 !dir$ ignore_tkr (d) i928 integer(8), value :: i929 end function930 end interface931 932 interface __ll2double_rn933 attributes(device) double precision function __ll2double_rn(i) bind(c, name='__nv_ll2double_rn')934 !dir$ ignore_tkr (d) i935 integer(8), value :: i936 end function937 end interface938 939 interface __ll2double_ru940 attributes(device) double precision function __ll2double_ru(i) bind(c, name='__nv_ll2double_ru')941 !dir$ ignore_tkr (d) i942 integer(8), value :: i943 end function944 end interface945 946 interface __ll2double_rz947 attributes(device) double precision function __ll2double_rz(i) bind(c, name='__nv_ll2double_rz')948 !dir$ ignore_tkr (d) i949 integer(8), value :: i950 end function951 end interface952 953 interface __ull2double_rd954 attributes(device) double precision function __ull2double_rd(i) bind(c, name='__nv_ull2double_rd')955 !dir$ ignore_tkr (d) i956 integer(8), value :: i957 end function958 end interface959 960 interface __ull2double_rn961 attributes(device) double precision function __ull2double_rn(i) bind(c, name='__nv_ull2double_rn')962 !dir$ ignore_tkr (d) i963 integer(8), value :: i964 end function965 end interface966 967 interface __ull2double_ru968 attributes(device) double precision function __ull2double_ru(i) bind(c, name='__nv_ull2double_ru')969 !dir$ ignore_tkr (d) i970 integer(8), value :: i971 end function972 end interface973 974 interface __ull2double_rz975 attributes(device) double precision function __ull2double_rz(i) bind(c, name='__nv_ull2double_rz')976 !dir$ ignore_tkr (d) i977 integer(8), value :: i978 end function979 end interface980 981 interface __ull2float_rd982 attributes(device) real function __ull2float_rd(i) bind(c, name='__nv_ull2float_rd')983 !dir$ ignore_tkr (d) i984 integer(8), value :: i985 end function986 end interface987 988 interface __ull2float_rn989 attributes(device) real function __ull2float_rn(i) bind(c, name='__nv_ull2float_rn')990 !dir$ ignore_tkr (d) i991 integer(8), value :: i992 end function993 end interface994 995 interface __ull2float_ru996 attributes(device) real function __ull2float_ru(i) bind(c, name='__nv_ull2float_ru')997 !dir$ ignore_tkr (d) i998 integer(8), value :: i999 end function1000 end interface1001 1002 interface __ull2float_rz1003 attributes(device) real function __ull2float_rz(i) bind(c, name='__nv_ull2float_rz')1004 !dir$ ignore_tkr (d) i1005 integer(8), value :: i1006 end function1007 end interface1008 1009 interface __mul241010 attributes(device) integer function __mul24(i,j) bind(c, name='__nv_mul24')1011 !dir$ ignore_tkr (d) i, (d) j1012 integer, value :: i,j1013 end function1014 end interface1015 1016 interface __umul241017 attributes(device) integer function __umul24(i,j) bind(c, name='__nv_umul24')1018 !dir$ ignore_tkr (d) i, (d) j1019 integer, value :: i,j1020 end function1021 end interface1022 1023 interface __drcp_rd1024 attributes(device) double precision function __drcp_rd(x) bind(c, name='__nv_drcp_rd')1025 !dir$ ignore_tkr (d) x1026 double precision, value :: x1027 end function1028 end interface1029 1030 interface __drcp_rn1031 attributes(device) double precision function __drcp_rn(x) bind(c, name='__nv_drcp_rn')1032 !dir$ ignore_tkr (d) x1033 double precision, value :: x1034 end function1035 end interface1036 1037 interface __drcp_ru1038 attributes(device) double precision function __drcp_ru(x) bind(c, name='__nv_drcp_ru')1039 !dir$ ignore_tkr (d) x1040 double precision, value :: x1041 end function1042 end interface1043 1044 interface __drcp_rz1045 attributes(device) double precision function __drcp_rz(x) bind(c, name='__nv_drcp_rz')1046 !dir$ ignore_tkr (d) x1047 double precision, value :: x1048 end function1049 end interface1050 1051 interface __dsqrt_rd1052 attributes(device) double precision function __dsqrt_rd(x) bind(c, name='__nv_dsqrt_rd')1053 !dir$ ignore_tkr (d) x1054 double precision, value :: x1055 end function1056 end interface1057 1058 interface __dsqrt_rn1059 attributes(device) double precision function __dsqrt_rn(x) bind(c, name='__nv_dsqrt_rn')1060 !dir$ ignore_tkr (d) x1061 double precision, value :: x1062 end function1063 end interface1064 1065 interface __dsqrt_ru1066 attributes(device) double precision function __dsqrt_ru(x) bind(c, name='__nv_dsqrt_ru')1067 !dir$ ignore_tkr (d) x1068 double precision, value :: x1069 end function1070 end interface1071 1072 interface __dsqrt_rz1073 attributes(device) double precision function __dsqrt_rz(x) bind(c, name='__nv_dsqrt_rz')1074 !dir$ ignore_tkr (d) x1075 double precision, value :: x1076 end function1077 end interface1078 1079 interface __ddiv_rn1080 attributes(device) double precision function __ddiv_rn(x,y) bind(c, name='__nv_ddiv_rn')1081 !dir$ ignore_tkr (d) x, (d) y1082 double precision, value :: x, y1083 end function1084 end interface1085 1086 interface __ddiv_rz1087 attributes(device) double precision function __ddiv_rz(x,y) bind(c, name='__nv_ddiv_rz')1088 !dir$ ignore_tkr (d) x, (d) y1089 double precision, value :: x, y1090 end function1091 end interface1092 1093 interface __ddiv_ru1094 attributes(device) double precision function __ddiv_ru(x,y) bind(c, name='__nv_ddiv_ru')1095 !dir$ ignore_tkr (d) x, (d) y1096 double precision, value :: x, y1097 end function1098 end interface1099 1100 interface __ddiv_rd1101 attributes(device) double precision function __ddiv_rd(x,y) bind(c, name='__nv_ddiv_rd')1102 !dir$ ignore_tkr (d) x, (d) y1103 double precision, value :: x, y1104 end function1105 end interface1106 1107 interface __clz1108 attributes(device) integer function __clz(i) bind(c, name='__nv_clz')1109 !dir$ ignore_tkr (d) i1110 integer, value :: i1111 end function1112 attributes(device) integer function __clzll(i) bind(c, name='__nv_clzll')1113 !dir$ ignore_tkr (d) i1114 integer(8), value :: i1115 end function1116 end interface1117 1118 interface __ffs1119 attributes(device) integer function __ffs(i) bind(c, name='__nv_ffs')1120 !dir$ ignore_tkr (d) i1121 integer, value :: i1122 end function1123 attributes(device) integer function __ffsll(i) bind(c, name='__nv_ffsll')1124 !dir$ ignore_tkr (d) i1125 integer(8), value :: i1126 end function1127 end interface1128 1129 interface __popc1130 attributes(device) integer function __popc(i) bind(c, name='__nv_popc')1131 !dir$ ignore_tkr (d) i1132 integer, value :: i1133 end function1134 attributes(device) integer function __popcll(i) bind(c, name='__nv_popcll')1135 !dir$ ignore_tkr (d) i1136 integer(8), value :: i1137 end function1138 end interface1139 1140 interface __brev1141 attributes(device) integer function __brev(i) bind(c, name='__nv_brev')1142 !dir$ ignore_tkr (d) i1143 integer, value :: i1144 end function1145 attributes(device) integer(8) function __brevll(i) bind(c, name ='__nv_brevll')1146 !dir$ ignore_tkr (d) i1147 integer(8), value :: i1148 end function1149 end interface1150 1151 ! Atomic Operations1152 1153 interface atomicadd1154 attributes(device) pure integer function atomicaddi(address, val)1155 !dir$ ignore_tkr (d) address, (d) val1156 integer, intent(inout) :: address1157 integer, value :: val1158 end function1159 attributes(device) pure real function atomicaddf(address, val)1160 !dir$ ignore_tkr (d) address, (d) val1161 real, intent(inout) :: address1162 real, value :: val1163 end function1164 attributes(device) pure real(8) function atomicaddd(address, val)1165 !dir$ ignore_tkr (d) address, (d) val1166 real(8), intent(inout) :: address1167 real(8), value :: val1168 end function1169 attributes(device) pure integer(8) function atomicaddl(address, val)1170 !dir$ ignore_tkr (d) address, (d) val1171 integer(8), intent(inout) :: address1172 integer(8), value :: val1173 end function1174 attributes(device) pure integer(4) function atomicaddr2(address, val)1175 !dir$ ignore_tkr (rd) address, (d) val1176 real(2), dimension(2), intent(inout) :: address1177 real(2), dimension(2), intent(in) :: val1178 end function1179 end interface1180 1181 interface atomicaddvector1182 attributes(device) pure function atomicaddvector_r2x2(address, val) result(z)1183 !dir$ ignore_tkr (rd) address, (d) val1184 real(2), dimension(2), intent(inout) :: address1185 real(2), dimension(2), intent(in) :: val1186 real(2), dimension(2) :: z1187 end function1188 1189 attributes(device) pure function atomicaddvector_r4x2(address, val) result(z)1190 !dir$ ignore_tkr (rd) address, (d) val1191 real(4), dimension(2), intent(inout) :: address1192 real(4), dimension(2), intent(in) :: val1193 real(4), dimension(2) :: z1194 end function1195 end interface1196 1197 interface atomicaddreal4x21198 attributes(device) pure function atomicadd_r4x2(address, val) result(z)1199 !dir$ ignore_tkr (rd) address, (d) val1200 real(4), dimension(2), intent(inout) :: address1201 real(4), dimension(2), intent(in) :: val1202 real(4), dimension(2) :: z1203 end function1204 end interface1205 1206 interface atomicaddreal4x41207 attributes(device) pure function atomicadd_r4x4(address, val) result(z)1208 !dir$ ignore_tkr (rd) address, (d) val1209 real(4), dimension(4), intent(inout) :: address1210 real(4), dimension(4), intent(in) :: val1211 real(4), dimension(4) :: z1212 end function1213 end interface1214 1215 interface atomicsub1216 attributes(device) pure integer function atomicsubi(address, val)1217 !dir$ ignore_tkr (d) address, (d) val1218 integer, intent(inout) :: address1219 integer, value :: val1220 end function1221 attributes(device) pure real function atomicsubf(address, val)1222 !dir$ ignore_tkr (d) address, (d) val1223 real, intent(inout) :: address1224 real, value :: val1225 end function1226 attributes(device) pure real(8) function atomicsubd(address, val)1227 !dir$ ignore_tkr (d) address, (d) val1228 real(8), intent(inout) :: address1229 real(8), value :: val1230 end function1231 attributes(device) pure integer(8) function atomicsubl(address, val)1232 !dir$ ignore_tkr (d) address, (dk) val1233 integer(8), intent(inout) :: address1234 integer(8), value :: val1235 end function1236 end interface1237 1238 interface atomicmax1239 attributes(device) pure integer function atomicmaxi(address, val)1240 !dir$ ignore_tkr (d) address, (d) val1241 integer, intent(inout) :: address1242 integer, value :: val1243 end function1244 attributes(device) pure real function atomicmaxf(address, val)1245 !dir$ ignore_tkr (d) address, (d) val1246 real, intent(inout) :: address1247 real, value :: val1248 end function1249 attributes(device) pure real(8) function atomicmaxd(address, val)1250 !dir$ ignore_tkr (d) address, (d) val1251 real(8), intent(inout) :: address1252 real(8), value :: val1253 end function1254 attributes(device) pure integer(8) function atomicmaxl(address, val)1255 !dir$ ignore_tkr (d) address, (dk) val1256 integer(8), intent(inout) :: address1257 integer(8), value :: val1258 end function1259 end interface1260 1261 interface atomicmin1262 attributes(device) pure integer function atomicmini(address, val)1263 !dir$ ignore_tkr (d) address, (d) val1264 integer, intent(inout) :: address1265 integer, value :: val1266 end function1267 attributes(device) pure real function atomicminf(address, val)1268 !dir$ ignore_tkr (d) address, (d) val1269 real, intent(inout) :: address1270 real, value :: val1271 end function1272 attributes(device) pure real(8) function atomicmind(address, val)1273 !dir$ ignore_tkr (d) address, (d) val1274 real(8), intent(inout) :: address1275 real(8), value :: val1276 end function1277 attributes(device) pure integer(8) function atomicminl(address, val)1278 !dir$ ignore_tkr (d) address, (dk) val1279 integer(8), intent(inout) :: address1280 integer(8), value :: val1281 end function1282 end interface1283 1284 interface atomicand1285 attributes(device) pure integer function atomicandi(address, val)1286 !dir$ ignore_tkr (d) address, (d) val1287 integer, intent(inout) :: address1288 integer, value :: val1289 end function1290 end interface1291 1292 interface atomicor1293 attributes(device) pure integer function atomicori(address, val)1294 !dir$ ignore_tkr (d) address, (d) val1295 integer, intent(inout) :: address1296 integer, value :: val1297 end function1298 end interface1299 1300 interface atomicinc1301 attributes(device) pure integer function atomicinci(address, val)1302 !dir$ ignore_tkr (d) address, (d) val1303 integer, intent(inout) :: address1304 integer, value :: val1305 end function1306 end interface1307 1308 interface atomicdec1309 attributes(device) pure integer function atomicdeci(address, val)1310 !dir$ ignore_tkr (d) address, (d) val1311 integer, intent(inout) :: address1312 integer, value :: val1313 end function1314 end interface1315 1316 interface atomiccas1317 attributes(device) pure integer function atomiccasi(address, val, val2)1318 !dir$ ignore_tkr (rd) address, (d) val, (d) val21319 integer, intent(inout) :: address1320 integer, value :: val, val21321 end function1322 attributes(device) pure integer(8) function atomiccasul(address, val, val2)1323 !dir$ ignore_tkr (rd) address, (dk) val, (dk) val21324 integer(8), intent(inout) :: address1325 integer(8), value :: val, val21326 end function1327 attributes(device) pure real function atomiccasf(address, val, val2)1328 !dir$ ignore_tkr (rd) address, (d) val, (d) val21329 real, intent(inout) :: address1330 real, value :: val, val21331 end function1332 attributes(device) pure double precision function atomiccasd(address, val, val2)1333 !dir$ ignore_tkr (rd) address, (d) val, (d) val21334 double precision, intent(inout) :: address1335 double precision, value :: val, val21336 end function1337 end interface1338 1339 interface atomicexch1340 attributes(device) pure integer function atomicexchi(address, val)1341 !dir$ ignore_tkr (rd) address, (d) val1342 integer, intent(inout) :: address1343 integer, value :: val1344 end function1345 attributes(device) pure integer(8) function atomicexchul(address, val)1346 !dir$ ignore_tkr (rd) address, (dk) val1347 integer(8), intent(inout) :: address1348 integer(8), value :: val1349 end function1350 attributes(device) pure real function atomicexchf(address, val)1351 !dir$ ignore_tkr (rd) address, (d) val1352 real, intent(inout) :: address1353 real, value :: val1354 end function1355 attributes(device) pure double precision function atomicexchd(address, val)1356 !dir$ ignore_tkr (rd) address, (d) val1357 double precision, intent(inout) :: address1358 double precision, value :: val1359 end function1360 end interface1361 1362 interface atomicxor1363 attributes(device) pure integer function atomicxori(address, val)1364 !dir$ ignore_tkr (rd) address, (d) val1365 integer, intent(inout) :: address1366 integer, value :: val1367 end function1368 end interface1369 1370 ! Time function1371 1372 interface1373 attributes(device) integer function clock()1374 end function1375 end interface1376 1377 interface1378 attributes(device) integer(8) function clock64()1379 end function1380 end interface1381 1382 interface1383 attributes(device) integer(8) function globalTimer()1384 end function1385 end interface1386 1387 ! Warp Match Functions1388 1389 interface match_all_sync1390 attributes(device) integer function match_all_syncjj(mask, val, pred)1391 !dir$ ignore_tkr(d) mask, (d) val, (d) pred1392 integer(4), value :: mask1393 integer(4), value :: val1394 integer(4) :: pred1395 end function1396 attributes(device) integer function match_all_syncjx(mask, val, pred)1397 !dir$ ignore_tkr(d) mask, (d) val, (d) pred1398 integer(4), value :: mask1399 integer(8), value :: val1400 integer(4) :: pred1401 end function1402 attributes(device) integer function match_all_syncjf(mask, val, pred)1403 !dir$ ignore_tkr(d) mask, (d) val, (d) pred1404 integer(4), value :: mask1405 real(4), value :: val1406 integer(4) :: pred1407 end function1408 attributes(device) integer function match_all_syncjd(mask, val, pred)1409 !dir$ ignore_tkr(d) mask, (d) val, (d) pred1410 integer(4), value :: mask1411 real(8), value :: val1412 integer(4) :: pred1413 end function1414 end interface1415 1416 interface match_any_sync1417 attributes(device) integer function match_any_syncjj(mask, val)1418 !dir$ ignore_tkr(d) mask, (d) val1419 integer(4), value :: mask1420 integer(4), value :: val1421 end function1422 attributes(device) integer function match_any_syncjx(mask, val)1423 !dir$ ignore_tkr(d) mask, (d) val1424 integer(4), value :: mask1425 integer(8), value :: val1426 end function1427 attributes(device) integer function match_any_syncjf(mask, val)1428 !dir$ ignore_tkr(d) mask, (d) val1429 integer(4), value :: mask1430 real(4), value :: val1431 end function1432 attributes(device) integer function match_any_syncjd(mask, val)1433 !dir$ ignore_tkr(d) mask, (d) val1434 integer(4), value :: mask1435 real(8), value :: val1436 end function1437 end interface1438 1439 interface all_sync1440 attributes(device) integer function all_sync(mask, pred)1441 !dir$ ignore_tkr(d) mask, (td) pred1442 integer, value :: mask, pred1443 end function1444 end interface1445 1446 interface any_sync1447 attributes(device) integer function any_sync(mask, pred)1448 !dir$ ignore_tkr(d) mask, (td) pred1449 integer, value :: mask, pred1450 end function1451 end interface1452 1453 interface ballot_sync1454 attributes(device) integer function ballot_sync(mask, pred)1455 !dir$ ignore_tkr(d) mask, (td) pred1456 integer, value :: mask, pred1457 end function1458 end interface1459 1460 ! LDCG1461 interface __ldcg1462 attributes(device) pure integer(4) function __ldcg_i4(x) bind(c)1463 !dir$ ignore_tkr (d) x1464 integer(4), intent(in) :: x1465 end function1466 attributes(device) pure integer(8) function __ldcg_i8(x) bind(c)1467 !dir$ ignore_tkr (d) x1468 integer(8), intent(in) :: x1469 end function1470 attributes(device) pure function __ldcg_cd(x) bind(c) result(y)1471 import c_devptr1472 !dir$ ignore_tkr (d) x1473 type(c_devptr), intent(in) :: x1474 type(c_devptr) :: y1475 end function1476 attributes(device) pure real(2) function __ldcg_r2(x) bind(c)1477 !dir$ ignore_tkr (d) x1478 real(2), intent(in) :: x1479 end function1480 attributes(device) pure real(4) function __ldcg_r4(x) bind(c)1481 !dir$ ignore_tkr (d) x1482 real(4), intent(in) :: x1483 end function1484 attributes(device) pure real(8) function __ldcg_r8(x) bind(c)1485 !dir$ ignore_tkr (d) x1486 real(8), intent(in) :: x1487 end function1488 attributes(device) pure complex(4) function __ldcg_c4(x) &1489 bind(c,name='__ldcg_c4x')1490 !dir$ ignore_tkr (d) x1491 complex(4), intent(in) :: x1492 end function1493 attributes(device) pure complex(8) function __ldcg_c8(x) &1494 bind(c,name='__ldcg_c8x')1495 !dir$ ignore_tkr (d) x1496 complex(8), intent(in) :: x1497 end function1498 attributes(device) pure function __ldcg_i4x4(x) result(y)1499 !dir$ ignore_tkr (d) x1500 integer(4), dimension(4), intent(in) :: x1501 integer(4), dimension(4) :: y1502 end function1503 attributes(device) pure function __ldcg_i8x2(x) result(y)1504 !dir$ ignore_tkr (d) x1505 integer(8), dimension(2), intent(in) :: x1506 integer(8), dimension(2) :: y1507 end function1508 attributes(device) pure function __ldcg_r2x2(x) result(y)1509 !dir$ ignore_tkr (d) x1510 real(2), dimension(2), intent(in) :: x1511 real(2), dimension(2) :: y1512 end function1513 attributes(device) pure function __ldcg_r4x4(x) result(y)1514 !dir$ ignore_tkr (d) x1515 real(4), dimension(4), intent(in) :: x1516 real(4), dimension(4) :: y1517 end function1518 attributes(device) pure function __ldcg_r8x2(x) result(y)1519 !dir$ ignore_tkr (d) x1520 real(8), dimension(2), intent(in) :: x1521 real(8), dimension(2) :: y1522 end function1523 end interface1524 1525 ! LDCA1526 interface __ldca1527 attributes(device) pure integer(4) function __ldca_i4(x) bind(c)1528 !dir$ ignore_tkr (d) x1529 integer(4), intent(in) :: x1530 end function1531 attributes(device) pure integer(8) function __ldca_i8(x) bind(c)1532 !dir$ ignore_tkr (d) x1533 integer(8), intent(in) :: x1534 end function1535 attributes(device) pure function __ldca_cd(x) bind(c) result(y)1536 !dir$ ignore_tkr (d) x1537 import c_devptr1538 type(c_devptr), intent(in) :: x1539 type(c_devptr) :: y1540 end function1541 attributes(device) pure real(2) function __ldca_r2(x) bind(c)1542 !dir$ ignore_tkr (d) x1543 real(2), intent(in) :: x1544 end function1545 attributes(device) pure real(4) function __ldca_r4(x) bind(c)1546 !dir$ ignore_tkr (d) x1547 real(4), intent(in) :: x1548 end function1549 attributes(device) pure real(8) function __ldca_r8(x) bind(c)1550 !dir$ ignore_tkr (d) x1551 real(8), intent(in) :: x1552 end function1553 attributes(device) pure complex(4) function __ldca_c4(x) &1554 bind(c,name='__ldca_c4x')1555 !dir$ ignore_tkr (d) x1556 complex(4), intent(in) :: x1557 end function1558 attributes(device) pure complex(8) function __ldca_c8(x) &1559 bind(c,name='__ldca_c8x')1560 !dir$ ignore_tkr (d) x1561 complex(8), intent(in) :: x1562 end function1563 attributes(device) pure function __ldca_i4x4(x) result(y)1564 !dir$ ignore_tkr (d) x1565 integer(4), dimension(4), intent(in) :: x1566 integer(4), dimension(4) :: y1567 end function1568 attributes(device) pure function __ldca_i8x2(x) result(y)1569 !dir$ ignore_tkr (d) x1570 integer(8), dimension(2), intent(in) :: x1571 integer(8), dimension(2) :: y1572 end function1573 attributes(device) pure function __ldca_r2x2(x) result(y)1574 !dir$ ignore_tkr (d) x1575 real(2), dimension(2), intent(in) :: x1576 real(2), dimension(2) :: y1577 end function1578 attributes(device) pure function __ldca_r4x4(x) result(y)1579 !dir$ ignore_tkr (d) x1580 real(4), dimension(4), intent(in) :: x1581 real(4), dimension(4) :: y1582 end function1583 attributes(device) pure function __ldca_r8x2(x) result(y)1584 !dir$ ignore_tkr (d) x1585 real(8), dimension(2), intent(in) :: x1586 real(8), dimension(2) :: y1587 end function1588 end interface1589 1590 ! LDCS1591 interface __ldcs1592 attributes(device) pure integer(4) function __ldcs_i4(x) bind(c)1593 !dir$ ignore_tkr (d) x1594 integer(4), intent(in) :: x1595 end function1596 attributes(device) pure integer(8) function __ldcs_i8(x) bind(c)1597 !dir$ ignore_tkr (d) x1598 integer(8), intent(in) :: x1599 end function1600 attributes(device) pure function __ldcs_cd(x) bind(c) result(y)1601 import c_devptr1602 !dir$ ignore_tkr (d) x1603 type(c_devptr), intent(in) :: x1604 type(c_devptr) :: y1605 end function1606 attributes(device) pure real(2) function __ldcs_r2(x) bind(c)1607 !dir$ ignore_tkr (d) x1608 real(2), intent(in) :: x1609 end function1610 attributes(device) pure real(4) function __ldcs_r4(x) bind(c)1611 !dir$ ignore_tkr (d) x1612 real(4), intent(in) :: x1613 end function1614 attributes(device) pure real(8) function __ldcs_r8(x) bind(c)1615 !dir$ ignore_tkr (d) x1616 real(8), intent(in) :: x1617 end function1618 attributes(device) pure complex(4) function __ldcs_c4(x) &1619 bind(c,name='__ldcs_c4x')1620 !dir$ ignore_tkr (d) x1621 complex(4), intent(in) :: x1622 end function1623 attributes(device) pure complex(8) function __ldcs_c8(x) &1624 bind(c,name='__ldcs_c8x')1625 !dir$ ignore_tkr (d) x1626 complex(8), intent(in) :: x1627 end function1628 attributes(device) pure function __ldcs_i4x4(x) result(y)1629 !dir$ ignore_tkr (d) x1630 integer(4), dimension(4), intent(in) :: x1631 integer(4), dimension(4) :: y1632 end function1633 attributes(device) pure function __ldcs_i8x2(x) result(y)1634 !dir$ ignore_tkr (d) x1635 integer(8), dimension(2), intent(in) :: x1636 integer(8), dimension(2) :: y1637 end function1638 attributes(device) pure function __ldcs_r2x2(x) result(y)1639 !dir$ ignore_tkr (d) x1640 real(2), dimension(2), intent(in) :: x1641 real(2), dimension(2) :: y1642 end function1643 attributes(device) pure function __ldcs_r4x4(x) result(y)1644 !dir$ ignore_tkr (d) x1645 real(4), dimension(4), intent(in) :: x1646 real(4), dimension(4) :: y1647 end function1648 attributes(device) pure function __ldcs_r8x2(x) result(y)1649 !dir$ ignore_tkr (d) x1650 real(8), dimension(2), intent(in) :: x1651 real(8), dimension(2) :: y1652 end function1653 end interface1654 1655 ! LDLU1656 interface __ldlu1657 attributes(device) pure integer(4) function __ldlu_i4(x) bind(c)1658 !dir$ ignore_tkr (d) x1659 integer(4), intent(in) :: x1660 end function1661 attributes(device) pure integer(8) function __ldlu_i8(x) bind(c)1662 !dir$ ignore_tkr (d) x1663 integer(8), intent(in) :: x1664 end function1665 attributes(device) pure function __ldlu_cd(x) bind(c) result(y)1666 import c_devptr1667 !dir$ ignore_tkr (d) x1668 type(c_devptr), intent(in) :: x1669 type(c_devptr) :: y1670 end function1671 attributes(device) pure real(2) function __ldlu_r2(x) bind(c)1672 !dir$ ignore_tkr (d) x1673 real(2), intent(in) :: x1674 end function1675 attributes(device) pure real(4) function __ldlu_r4(x) bind(c)1676 !dir$ ignore_tkr (d) x1677 real(4), intent(in) :: x1678 end function1679 attributes(device) pure real(8) function __ldlu_r8(x) bind(c)1680 !dir$ ignore_tkr (d) x1681 real(8), intent(in) :: x1682 end function1683 attributes(device) pure complex(4) function __ldlu_c4(x) &1684 bind(c,name='__ldlu_c4x')1685 !dir$ ignore_tkr (d) x1686 complex(4), intent(in) :: x1687 end function1688 attributes(device) pure complex(8) function __ldlu_c8(x) &1689 bind(c,name='__ldlu_c8x')1690 !dir$ ignore_tkr (d) x1691 complex(8), intent(in) :: x1692 end function1693 attributes(device) pure function __ldlu_i4x4(x) result(y)1694 !dir$ ignore_tkr (d) x1695 integer(4), dimension(4), intent(in) :: x1696 integer(4), dimension(4) :: y1697 end function1698 attributes(device) pure function __ldlu_i8x2(x) result(y)1699 !dir$ ignore_tkr (d) x1700 integer(8), dimension(2), intent(in) :: x1701 integer(8), dimension(2) :: y1702 end function1703 attributes(device) pure function __ldlu_r2x2(x) result(y)1704 !dir$ ignore_tkr (d) x1705 real(2), dimension(2), intent(in) :: x1706 real(2), dimension(2) :: y1707 end function1708 attributes(device) pure function __ldlu_r4x4(x) result(y)1709 !dir$ ignore_tkr (d) x1710 real(4), dimension(4), intent(in) :: x1711 real(4), dimension(4) :: y1712 end function1713 attributes(device) pure function __ldlu_r8x2(x) result(y)1714 !dir$ ignore_tkr (d) x1715 real(8), dimension(2), intent(in) :: x1716 real(8), dimension(2) :: y1717 end function1718 end interface1719 1720 ! LDCV1721 interface __ldcv1722 attributes(device) pure integer(4) function __ldcv_i4(x) bind(c)1723 !dir$ ignore_tkr (d) x1724 integer(4), intent(in) :: x1725 end function1726 attributes(device) pure integer(8) function __ldcv_i8(x) bind(c)1727 !dir$ ignore_tkr (d) x1728 integer(8), intent(in) :: x1729 end function1730 attributes(device) pure function __ldcv_cd(x) bind(c) result(y)1731 import c_devptr1732 !dir$ ignore_tkr (d) x1733 type(c_devptr), intent(in) :: x1734 type(c_devptr) :: y1735 end function1736 attributes(device) pure real(2) function __ldcv_r2(x) bind(c)1737 !dir$ ignore_tkr (d) x1738 real(2), intent(in) :: x1739 end function1740 attributes(device) pure real(4) function __ldcv_r4(x) bind(c)1741 !dir$ ignore_tkr (d) x1742 real(4), intent(in) :: x1743 end function1744 attributes(device) pure real(8) function __ldcv_r8(x) bind(c)1745 !dir$ ignore_tkr (d) x1746 real(8), intent(in) :: x1747 end function1748 attributes(device) pure complex(4) function __ldcv_c4(x) &1749 bind(c,name='__ldcv_c4x')1750 !dir$ ignore_tkr (d) x1751 complex(4), intent(in) :: x1752 end function1753 attributes(device) pure complex(8) function __ldcv_c8(x) &1754 bind(c,name='__ldcv_c8x')1755 !dir$ ignore_tkr (d) x1756 complex(8), intent(in) :: x1757 end function1758 attributes(device) pure function __ldcv_i4x4(x) result(y)1759 !dir$ ignore_tkr (d) x1760 integer(4), dimension(4), intent(in) :: x1761 integer(4), dimension(4) :: y1762 end function1763 attributes(device) pure function __ldcv_i8x2(x) result(y)1764 !dir$ ignore_tkr (d) x1765 integer(8), dimension(2), intent(in) :: x1766 integer(8), dimension(2) :: y1767 end function1768 attributes(device) pure function __ldcv_r2x2(x) result(y)1769 !dir$ ignore_tkr (d) x1770 real(2), dimension(2), intent(in) :: x1771 real(2), dimension(2) :: y1772 end function1773 attributes(device) pure function __ldcv_r4x4(x) result(y)1774 !dir$ ignore_tkr (d) x1775 real(4), dimension(4), intent(in) :: x1776 real(4), dimension(4) :: y1777 end function1778 attributes(device) pure function __ldcv_r8x2(x) result(y)1779 !dir$ ignore_tkr (d) x1780 real(8), dimension(2), intent(in) :: x1781 real(8), dimension(2) :: y1782 end function1783 end interface1784 1785 ! STWB1786 interface __stwb1787 attributes(device) pure subroutine __stwb_i4(y, x) bind(c)1788 !dir$ ignore_tkr (d) y, (d) x1789 integer(4), value :: x1790 integer(4), device, intent(in) :: y1791 end subroutine1792 attributes(device) pure subroutine __stwb_i8(y, x) bind(c)1793 !dir$ ignore_tkr (d) y, (d) x1794 integer(8), value :: x1795 integer(8), device, intent(in) :: y1796 end subroutine1797 attributes(device) pure subroutine __stwb_cd(y, x) bind(c)1798 import c_devptr1799 !dir$ ignore_tkr (d) y, (d) x1800 type(c_devptr), device, intent(in) :: y, x1801 end subroutine1802 attributes(device) pure subroutine __stwb_r2(y, x) bind(c)1803 !dir$ ignore_tkr (d) y, (d) x1804 real(2), value :: x1805 real(2), device, intent(in) :: y1806 end subroutine1807 attributes(device) pure subroutine __stwb_r4(y, x) bind(c)1808 !dir$ ignore_tkr (d) y, (d) x1809 real(4), value :: x1810 real(4), device, intent(in) :: y1811 end subroutine1812 attributes(device) pure subroutine __stwb_r8(y, x) bind(c)1813 !dir$ ignore_tkr (d) y, (d) x1814 real(8), value :: x1815 real(8), device, intent(in) :: y1816 end subroutine1817 attributes(device) pure subroutine __stwb_c4(y, x) bind(c)1818 !dir$ ignore_tkr (d) y, (rd) x1819 complex(4), device, intent(in) :: y, x1820 end subroutine1821 attributes(device) pure subroutine __stwb_c8(y, x) bind(c)1822 !dir$ ignore_tkr (d) y, (d) x1823 complex(8), device, intent(in) :: y, x1824 end subroutine1825 attributes(device) pure subroutine __stwb_i4x4(y, x) bind(c)1826 !dir$ ignore_tkr (d) y, (d) x1827 integer(4), dimension(4), device, intent(in) :: y, x1828 end subroutine1829 attributes(device) pure subroutine __stwb_i8x2(y, x) bind(c)1830 !dir$ ignore_tkr (d) y, (d) x1831 integer(8), dimension(2), device, intent(in) :: y, x1832 end subroutine1833 attributes(device) pure subroutine __stwb_r2x2(y, x) bind(c)1834 !dir$ ignore_tkr (d) y, (d) x1835 real(2), dimension(2), device, intent(in) :: y, x1836 end subroutine1837 attributes(device) pure subroutine __stwb_r4x4(y, x) bind(c)1838 !dir$ ignore_tkr (d) y, (d) x1839 real(4), dimension(4), device, intent(in) :: y, x1840 end subroutine1841 attributes(device) pure subroutine __stwb_r8x2(y, x) bind(c)1842 !dir$ ignore_tkr (d) y, (d) x1843 real(8), dimension(2), device, intent(in) :: y, x1844 end subroutine1845 end interface1846 1847 ! STCG1848 interface __stcg1849 attributes(device) pure subroutine __stcg_i4(y, x) bind(c)1850 !dir$ ignore_tkr (d) y, (d) x1851 integer(4), value :: x1852 integer(4), device, intent(in) :: y1853 end subroutine1854 attributes(device) pure subroutine __stcg_i8(y, x) bind(c)1855 !dir$ ignore_tkr (d) y, (d) x1856 integer(8), value :: x1857 integer(8), device, intent(in) :: y1858 end subroutine1859 attributes(device) pure subroutine __stcg_cd(y, x) bind(c)1860 import c_devptr1861 !dir$ ignore_tkr (d) y, (d) x1862 type(c_devptr), device, intent(in) :: y, x1863 end subroutine1864 attributes(device) pure subroutine __stcg_r2(y, x) bind(c)1865 !dir$ ignore_tkr (d) y, (d) x1866 real(2), value :: x1867 real(2), device, intent(in) :: y1868 end subroutine1869 attributes(device) pure subroutine __stcg_r4(y, x) bind(c)1870 !dir$ ignore_tkr (d) y, (d) x1871 real(4), value :: x1872 real(4), device, intent(in) :: y1873 end subroutine1874 attributes(device) pure subroutine __stcg_r8(y, x) bind(c)1875 !dir$ ignore_tkr (d) y, (d) x1876 real(8), value :: x1877 real(8), device, intent(in) :: y1878 end subroutine1879 attributes(device) pure subroutine __stcg_c4(y, x) bind(c)1880 !dir$ ignore_tkr (d) y, (rd) x1881 complex(4), device, intent(in) :: y, x1882 end subroutine1883 attributes(device) pure subroutine __stcg_c8(y, x) bind(c)1884 !dir$ ignore_tkr (d) y, (d) x1885 complex(8), device, intent(in) :: y, x1886 end subroutine1887 attributes(device) pure subroutine __stcg_i4x4(y, x) bind(c)1888 !dir$ ignore_tkr (d) y, (d) x1889 integer(4), dimension(4), device, intent(in) :: y, x1890 end subroutine1891 attributes(device) pure subroutine __stcg_i8x2(y, x) bind(c)1892 !dir$ ignore_tkr (d) y, (d) x1893 integer(8), dimension(2), device, intent(in) :: y, x1894 end subroutine1895 attributes(device) pure subroutine __stcg_r2x2(y, x) bind(c)1896 !dir$ ignore_tkr (d) y, (d) x1897 real(2), dimension(2), device, intent(in) :: y, x1898 end subroutine1899 attributes(device) pure subroutine __stcg_r4x4(y, x) bind(c)1900 !dir$ ignore_tkr (d) y, (d) x1901 real(4), dimension(4), device, intent(in) :: y, x1902 end subroutine1903 attributes(device) pure subroutine __stcg_r8x2(y, x) bind(c)1904 !dir$ ignore_tkr (d) y, (d) x1905 real(8), dimension(2), device, intent(in) :: y, x1906 end subroutine1907 end interface1908 1909 ! STCS1910 interface __stcs1911 attributes(device) pure subroutine __stcs_i4(y, x) bind(c)1912 !dir$ ignore_tkr (d) y, (d) x1913 integer(4), value :: x1914 integer(4), device, intent(in) :: y1915 end subroutine1916 attributes(device) pure subroutine __stcs_i8(y, x) bind(c)1917 !dir$ ignore_tkr (d) y, (d) x1918 integer(8), value :: x1919 integer(8), device, intent(in) :: y1920 end subroutine1921 attributes(device) pure subroutine __stcs_cd(y, x) bind(c)1922 import c_devptr1923 !dir$ ignore_tkr (d) y, (d) x1924 type(c_devptr), device, intent(in) :: y, x1925 end subroutine1926 attributes(device) pure subroutine __stcs_r2(y, x) bind(c)1927 !dir$ ignore_tkr (d) y, (d) x1928 real(2), value :: x1929 real(2), device, intent(in) :: y1930 end subroutine1931 attributes(device) pure subroutine __stcs_r4(y, x) bind(c)1932 !dir$ ignore_tkr (d) y, (d) x1933 real(4), value :: x1934 real(4), device, intent(in) :: y1935 end subroutine1936 attributes(device) pure subroutine __stcs_r8(y, x) bind(c)1937 !dir$ ignore_tkr (d) y, (d) x1938 real(8), value :: x1939 real(8), device, intent(in) :: y1940 end subroutine1941 attributes(device) pure subroutine __stcs_c4(y, x) bind(c)1942 !dir$ ignore_tkr (d) y, (rd) x1943 complex(4), device, intent(in) :: y, x1944 end subroutine1945 attributes(device) pure subroutine __stcs_c8(y, x) bind(c)1946 !dir$ ignore_tkr (d) y, (d) x1947 complex(8), device, intent(in) :: y, x1948 end subroutine1949 attributes(device) pure subroutine __stcs_i4x4(y, x) bind(c)1950 !dir$ ignore_tkr (d) y, (d) x1951 integer(4), dimension(4), device, intent(in) :: y, x1952 end subroutine1953 attributes(device) pure subroutine __stcs_i8x2(y, x) bind(c)1954 !dir$ ignore_tkr (d) y, (d) x1955 integer(8), dimension(2), device, intent(in) :: y, x1956 end subroutine1957 attributes(device) pure subroutine __stcs_r2x2(y, x) bind(c)1958 !dir$ ignore_tkr (d) y, (d) x1959 real(2), dimension(2), device, intent(in) :: y, x1960 end subroutine1961 attributes(device) pure subroutine __stcs_r4x4(y, x) bind(c)1962 !dir$ ignore_tkr (d) y, (d) x1963 real(4), dimension(4), device, intent(in) :: y, x1964 end subroutine1965 attributes(device) pure subroutine __stcs_r8x2(y, x) bind(c)1966 !dir$ ignore_tkr (d) y, (d) x1967 real(8), dimension(2), device, intent(in) :: y, x1968 end subroutine1969 end interface1970 1971 ! STWT1972 interface __stwt1973 attributes(device) pure subroutine __stwt_i4(y, x) bind(c)1974 !dir$ ignore_tkr (d) y, (d) x1975 integer(4), value :: x1976 integer(4), device, intent(in) :: y1977 end subroutine1978 attributes(device) pure subroutine __stwt_i8(y, x) bind(c)1979 !dir$ ignore_tkr (d) y, (d) x1980 integer(8), value :: x1981 integer(8), device, intent(in) :: y1982 end subroutine1983 attributes(device) pure subroutine __stwt_cd(y, x) bind(c)1984 import c_devptr1985 !dir$ ignore_tkr (d) y, (d) x1986 type(c_devptr), device, intent(in) :: y, x1987 end subroutine1988 attributes(device) pure subroutine __stwt_r2(y, x) bind(c)1989 !dir$ ignore_tkr (d) y, (d) x1990 real(2), value :: x1991 real(2), device, intent(in) :: y1992 end subroutine1993 attributes(device) pure subroutine __stwt_r4(y, x) bind(c)1994 !dir$ ignore_tkr (d) y, (d) x1995 real(4), value :: x1996 real(4), device, intent(in) :: y1997 end subroutine1998 attributes(device) pure subroutine __stwt_r8(y, x) bind(c)1999 !dir$ ignore_tkr (d) y, (d) x2000 real(8), value :: x2001 real(8), device, intent(in) :: y2002 end subroutine2003 attributes(device) pure subroutine __stwt_c4(y, x) bind(c)2004 !dir$ ignore_tkr (d) y, (rd) x2005 complex(4), device, intent(in) :: y, x2006 end subroutine2007 attributes(device) pure subroutine __stwt_c8(y, x) bind(c)2008 !dir$ ignore_tkr (d) y, (d) x2009 complex(8), device, intent(in) :: y, x2010 end subroutine2011 attributes(device) pure subroutine __stwt_i4x4(y, x) bind(c)2012 !dir$ ignore_tkr (d) y, (d) x2013 integer(4), dimension(4), device, intent(in) :: y, x2014 end subroutine2015 attributes(device) pure subroutine __stwt_i8x2(y, x) bind(c)2016 !dir$ ignore_tkr (d) y, (d) x2017 integer(8), dimension(2), device, intent(in) :: y, x2018 end subroutine2019 attributes(device) pure subroutine __stwt_r2x2(y, x) bind(c)2020 !dir$ ignore_tkr (d) y, (d) x2021 real(2), dimension(2), device, intent(in) :: y, x2022 end subroutine2023 attributes(device) pure subroutine __stwt_r4x4(y, x) bind(c)2024 !dir$ ignore_tkr (d) y, (d) x2025 real(4), dimension(4), device, intent(in) :: y, x2026 end subroutine2027 attributes(device) pure subroutine __stwt_r8x2(y, x) bind(c)2028 !dir$ ignore_tkr (d) y, (d) x2029 real(8), dimension(2), device, intent(in) :: y, x2030 end subroutine2031 end interface2032 2033 interface2034 attributes(device,host) logical function on_device() bind(c)2035 end function2036 end interface2037 2038 ! TMA Operations2039 2040 interface barrier_arrive2041 attributes(device) function barrier_arrive(barrier) result(token)2042 integer(8), shared :: barrier2043 integer(8) :: token2044 end function2045 attributes(device) function barrier_arrive_cnt(barrier, count) result(token)2046 integer(8), shared :: barrier2047 integer(4), value :: count2048 integer(8) :: token2049 end function2050 end interface2051 2052 interface 2053 attributes(device) subroutine barrier_init(barrier, count)2054 integer(8), shared :: barrier2055 integer(4), value :: count2056 end subroutine2057 end interface2058 2059 interface2060 attributes(device) integer function barrier_try_wait(barrier, token)2061 integer(8), shared :: barrier2062 integer(8), value :: token2063 end function2064 end interface2065 2066 interface2067 attributes(device) integer function barrier_try_wait_sleep(barrier, token, ns)2068 integer(8), shared :: barrier2069 integer(8), value :: token2070 integer(4), value :: ns2071 end function2072 end interface2073 2074 interface2075 attributes(device) subroutine fence_proxy_async()2076 end subroutine2077 end interface2078 2079 interface2080 attributes(device) subroutine tma_bulk_commit_group()2081 end subroutine2082 end interface2083 2084 interface2085 attributes(device) subroutine tma_bulk_wait_group()2086 end subroutine2087 end interface2088 2089 ! --------------------2090 ! Bulk load functions2091 ! --------------------2092 2093 ! Generic load, count is in bytes2094 ! -------------------------------2095 2096 interface2097 attributes(device) subroutine tma_bulk_g2s(barrier, src, dst, nbytes)2098 !dir$ ignore_tkr src, dst2099 integer(8), shared :: barrier2100 integer(4), device :: src(*)2101 integer(4), shared :: dst(*)2102 integer(4), value :: nbytes2103 end subroutine2104 end interface2105 2106 ! Load specific types, count is in elements2107 ! -----------------------------------------2108 2109 interface tma_bulk_load2110 attributes(device) subroutine tma_bulk_ldc4(barrier, src, dst, nelems)2111 !dir$ ignore_tkr (r) src, (r) dst2112 integer(8), shared :: barrier2113 complex(4), device :: src(*)2114 complex(4), shared :: dst(*)2115 integer(4), value :: nelems2116 end subroutine2117 2118 attributes(device) subroutine tma_bulk_ldc8(barrier, src, dst, nelems)2119 !dir$ ignore_tkr (r) src, (r) dst2120 integer(8), shared :: barrier2121 complex(8), device :: src(*)2122 complex(8), shared :: dst(*)2123 integer(4), value :: nelems2124 end subroutine2125 2126 attributes(device) subroutine tma_bulk_ldi4(barrier, src, dst, nelems)2127 !dir$ ignore_tkr (r) src, (r) dst2128 integer(8), shared :: barrier2129 integer(4), device :: src(*)2130 integer(4), shared :: dst(*)2131 integer(4), value :: nelems2132 end subroutine2133 2134 attributes(device) subroutine tma_bulk_ldi8(barrier, src, dst, nelems)2135 !dir$ ignore_tkr (r) src, (r) dst2136 integer(8), shared :: barrier2137 integer(8), device :: src(*)2138 integer(8), shared :: dst(*)2139 integer(4), value :: nelems2140 end subroutine2141 2142 attributes(device) subroutine tma_bulk_ldr2(barrier, src, dst, nelems)2143 !dir$ ignore_tkr (r) src, (r) dst2144 integer(8), shared :: barrier2145 real(2), device :: src(*)2146 real(2), shared :: dst(*)2147 integer(4), value :: nelems2148 end subroutine2149 2150 attributes(device) subroutine tma_bulk_ldr4(barrier, src, dst, nelems)2151 !dir$ ignore_tkr (r) src, (r) dst2152 integer(8), shared :: barrier2153 real(4), device :: src(*)2154 real(4), shared :: dst(*)2155 integer(4), value :: nelems2156 end subroutine2157 2158 attributes(device) subroutine tma_bulk_ldr8(barrier, src, dst, nelems)2159 !dir$ ignore_tkr (r) src, (r) dst2160 integer(8), shared :: barrier2161 real(8), device :: src(*)2162 real(8), shared :: dst(*)2163 integer(4), value :: nelems2164 end subroutine2165 end interface2166 2167 ! --------------------2168 ! Bulk Store functions2169 ! --------------------2170 2171 ! Generic store, count is in bytes2172 ! --------------------------------2173 2174 interface2175 attributes(device) subroutine tma_bulk_s2g(src, dst, nbytes)2176 !dir$ ignore_tkr src, dst2177 integer(4), shared :: src(*)2178 integer(4), device :: dst(*)2179 integer(4), value :: nbytes2180 end subroutine2181 end interface2182 2183 ! Load specific types, count is in elements2184 ! -----------------------------------------2185 2186 interface tma_bulk_store2187 attributes(device) subroutine tma_bulk_store_c4(src, dst, nelems)2188 !dir$ ignore_tkr (r) src, (r) dst2189 complex(4), shared :: src(*)2190 complex(4), device :: dst(*)2191 integer(4), value :: nelems2192 end subroutine2193 2194 attributes(device) subroutine tma_bulk_store_c8(src, dst, nelems)2195 !dir$ ignore_tkr (r) src, (r) dst2196 complex(8), shared :: src(*)2197 complex(8), device :: dst(*)2198 integer(4), value :: nelems2199 end subroutine2200 2201 attributes(device) subroutine tma_bulk_store_i4(src, dst, nelems)2202 !dir$ ignore_tkr (r) src, (r) dst2203 integer(4), shared :: src(*)2204 integer(4), device :: dst(*)2205 integer(4), value :: nelems2206 end subroutine2207 2208 attributes(device) subroutine tma_bulk_store_i8(src, dst, nelems)2209 !dir$ ignore_tkr (r) src, (r) dst2210 integer(8), shared :: src(*)2211 integer(8), device :: dst(*)2212 integer(4), value :: nelems2213 end subroutine2214 2215 attributes(device) subroutine tma_bulk_store_r2(src, dst, nelems)2216 !dir$ ignore_tkr (r) src, (r) dst2217 real(2), shared :: src(*)2218 real(2), device :: dst(*)2219 integer(4), value :: nelems2220 end subroutine2221 2222 attributes(device) subroutine tma_bulk_store_r4(src, dst, nelems)2223 !dir$ ignore_tkr (r) src, (r) dst2224 real(4), shared :: src(*)2225 real(4), device :: dst(*)2226 integer(4), value :: nelems2227 end subroutine2228 2229 attributes(device) subroutine tma_bulk_store_r8(src, dst, nelems)2230 !dir$ ignore_tkr (r) src, (r) dst2231 real(8), shared :: src(*)2232 real(8), device :: dst(*)2233 integer(4), value :: nelems2234 end subroutine2235 end interface2236 2237contains2238 2239 attributes(device) subroutine syncthreads()2240 end subroutine2241 2242end module2243