[flang-commits] [flang] [flang][cuda] Adding more bindings to libcudadevice (PR #125276)
Renaud Kauffmann via flang-commits
flang-commits at lists.llvm.org
Fri Jan 31 11:52:16 PST 2025
https://github.com/Renaud-K created https://github.com/llvm/llvm-project/pull/125276
None
>From 73a2fb9e5e8decb5c0ddb5bafd2ffc0e594cbeae Mon Sep 17 00:00:00 2001
From: Renaud-K <rkauffmann at nvidia.com>
Date: Fri, 31 Jan 2025 10:26:42 -0800
Subject: [PATCH 1/2] Adding bindings to libcudadevice
---
flang/module/cudadevice.f90 | 353 ++++++++++++++++++++++++++++++++++++
1 file changed, 353 insertions(+)
diff --git a/flang/module/cudadevice.f90 b/flang/module/cudadevice.f90
index af516a1866fa97..93326d2a3c4ea4 100644
--- a/flang/module/cudadevice.f90
+++ b/flang/module/cudadevice.f90
@@ -77,6 +77,22 @@ attributes(device) subroutine threadfence_system()
! Math API
+ interface __fadd_rn
+ attributes(device) real function __fadd_rn(a,b) bind(c, name='__nv_fmul_rn')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fadd_rn
+
+ interface __fadd_rz
+ attributes(device) real function __fadd_rz(a,b) bind(c, name='__nv_fmul_rn')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fadd_rz
+
interface
attributes(device) function __fadd_rd(x, y) bind(c, name='__nv_fadd_rd')
real, intent(in), value :: x, y
@@ -93,6 +109,343 @@ attributes(device) subroutine threadfence_system()
end interface
public :: __fadd_ru
+ interface __fmul_rn
+ attributes(device) real function __fmul_rn(a,b) bind(c, name='__nv_fmul_rn')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fmul_rn
+
+ interface __fmul_rz
+ attributes(device) real function __fmul_rz(a,b) bind(c, name='__nv_fmul_rz')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fmul_rz
+
+ interface __fmul_ru
+ attributes(device) real function __fmul_ru(a,b) bind(c, name='__nv_fmul_ru')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fmul_ru
+
+ interface __fmul_rd
+ attributes(device) real function __fmul_rd(a,b) bind(c, name='__nv_fmul_rd')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fmul_rd
+
+ interface __fmaf_rn
+ attributes(device) real function __fmaf_rn(a,b,c) bind(c, name='__nv_fmaf_rn')
+ !dir$ ignore_tkr (d) a, (d) b, (d) c
+ real, value :: a, b, c
+ end function
+ end interface
+ public :: __fmaf_rn
+
+ interface __fmaf_rz
+ attributes(device) real function __fmaf_rz(a,b,c) bind(c, name='__nv_fmaf_rz')
+ !dir$ ignore_tkr (d) a, (d) b, (d) c
+ real, value :: a, b, c
+ end function
+ end interface
+ public :: __fmaf_rz
+
+ interface __fmaf_ru
+ attributes(device) real function __fmaf_ru(a,b,c) bind(c, name='__nv_fmaf_ru')
+ !dir$ ignore_tkr (d) a, (d) b, (d) c
+ real, value :: a, b, c
+ end function
+ end interface
+ public :: __fmaf_ru
+
+ interface __fmaf_rd
+ attributes(device) real function __fmaf_rd(a,b,c) bind(c, name='__nv_fmaf_rd')
+ !dir$ ignore_tkr (d) a, (d) b, (d) c
+ real, value :: a, b, c
+ end function
+ end interface
+ public :: __fmaf_rd
+
+ interface __frcp_rn
+ attributes(device) real function __frcp_rn(a) bind(c, name='__nv_frcp_rn')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __frcp_rn
+
+ interface __frcp_rz
+ attributes(device) real function __frcp_rz(a) bind(c, name='__nv_frcp_rz')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __frcp_rz
+
+ interface __frcp_ru
+ attributes(device) real function __frcp_ru(a) bind(c, name='__nv_frcp_ru')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __frcp_ru
+
+ interface __frcp_rd
+ attributes(device) real function __frcp_rd(a) bind(c, name='__nv_frcp_rd')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __frcp_rd
+
+ interface __fsqrt_rn
+ attributes(device) real function __fsqrt_rn(a) bind(c, name='__nv_fsqrt_rn')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __fsqrt_rn
+
+ interface __fsqrt_rz
+ attributes(device) real function __fsqrt_rz(a) bind(c, name='__nv_fsqrt_rz')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __fsqrt_rz
+
+ interface __fsqrt_ru
+ attributes(device) real function __fsqrt_ru(a) bind(c, name='__nv_fsqrt_ru')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __fsqrt_ru
+
+ interface __fsqrt_rd
+ attributes(device) real function __fsqrt_rd(a) bind(c, name='__nv_fsqrt_rd')
+ !dir$ ignore_tkr (d) a
+ real, value :: a
+ end function
+ end interface
+ public :: __fsqrt_rd
+
+ interface __fdiv_rn
+ attributes(device) real function __fdiv_rn(a,b) bind(c, name='__nv_fdiv_rn')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fdiv_rn
+
+ interface __fdiv_rz
+ attributes(device) real function __fdiv_rz(a,b) bind(c, name='__nv_fdiv_rz')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fdiv_rz
+
+ interface __fdiv_ru
+ attributes(device) real function __fdiv_ru(a,b) bind(c, name='__nv_fdiv_ru')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fdiv_ru
+
+ interface __fdiv_rd
+ attributes(device) real function __fdiv_rd(a,b) bind(c, name='__nv_fdiv_rd')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fdiv_rd
+
+ interface __dadd_rn
+ attributes(device) real function __dadd_rn(a,b) bind(c, name='__nv_dadd_rn')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dadd_rn
+
+ interface __dadd_rz
+ attributes(device) real function __dadd_rz(a,b) bind(c, name='__nv_dadd_rz')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dadd_rz
+
+ interface __dadd_ru
+ attributes(device) real function __dadd_ru(a,b) bind(c, name='__nv_dadd_ru')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dadd_ru
+
+ interface __dadd_rd
+ attributes(device) real function __dadd_rd(a,b) bind(c, name='__nv_dadd_rd')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dadd_rd
+
+ interface __dmul_rn
+ attributes(device) real function __dmul_rn(a,b) bind(c, name='__nv_dmul_rn')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dmul_rn
+
+ interface __dmul_rz
+ attributes(device) real function __dmul_rz(a,b) bind(c, name='__nv_dmul_rz')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dmul_rz
+
+ interface __dmul_ru
+ attributes(device) real function __dmul_ru(a,b) bind(c, name='__nv_dmul_ru')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dmul_ru
+
+ interface __dmul_rd
+ attributes(device) real function __dmul_rd(a,b) bind(c, name='__nv_dmul_rd')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __dmul_rd
+
+ interface __fma_rn
+ attributes(device) real function __fma_rn(a,b) bind(c, name='__nv_fma_rn')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fma_rn
+
+ interface __fma_rz
+ attributes(device) real function __fma_rz(a,b) bind(c, name='__nv_fma_rz')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fma_rz
+
+ interface __fma_ru
+ attributes(device) real function __fma_ru(a,b) bind(c, name='__nv_fma_ru')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fma_ru
+
+ interface __fma_rd
+ attributes(device) real function __fma_rd(a,b) bind(c, name='__nv_fma_rd')
+ !dir$ ignore_tkr (d) a, (d) b
+ real, value :: a, b
+ end function
+ end interface
+ public :: __fma_rd
+
+ interface rsqrt
+ attributes(device) real(4) function rsqrtf(x) bind(c,name='__nv_rsqrtf')
+ real(4), value :: x
+ end function
+ attributes(device) real(8) function rsqrt(x) bind(c,name='__nv_rsqrt')
+ real(8), value :: x
+ end function
+ end interface
+ public :: rsqrt
+
+ interface signbit
+ attributes(device) integer(4) function signbitf(x) bind(c,name='__nv_signbitf')
+ real(4), value :: x
+ end function
+ attributes(device) integer(4) function signbit(x) bind(c,name='__nv_signbitd')
+ real(8), value :: x
+ end function
+ end interface
+ public :: signbit
+
+ interface sincos
+ attributes(device) subroutine sincosf(x, y, z) bind(c,name='__nv_sincosf')
+ real(4), value :: x
+ real(4), device :: y
+ real(4), device :: z
+ end subroutine
+ attributes(device) subroutine sincos(x, y, z) bind(c,name='__nv_sincos')
+ real(8), value :: x
+ real(8), device :: y
+ real(8), device :: z
+ end subroutine
+ end interface
+ public :: sincos
+
+ interface sincospi
+ attributes(device) subroutine sincospif(x, y, z) bind(c,name='__nv_sincospif')
+ real(4), value :: x
+ real(4), device :: y
+ real(4), device :: z
+ end subroutine
+ attributes(device) subroutine sincospi(x, y, z) bind(c,name='__nv_sincospi')
+ real(8), value :: x
+ real(8), device :: y
+ real(8), device :: z
+ end subroutine
+ end interface
+ public :: sincospi
+
+ interface mulhi
+ attributes(device) integer function __mulhi(i,j) bind(c,name='__nv_mulhi')
+ !dir$ ignore_tkr (d) i, (d) j
+ integer, value :: i,j
+ end function
+ end interface
+ public :: mulhi
+
+ interface umulhi
+ attributes(device) integer function __umulhi(i,j) bind(c,name='__nv_umulhi')
+ !dir$ ignore_tkr (d) i, (d) j
+ integer, value :: i,j
+ end function
+ end interface
+ public :: umulhi
+
+ interface mul64hi
+ attributes(device) integer(8) function __mul64hi(i,j) bind(c,name='__nv_mul64hi')
+ !dir$ ignore_tkr (d) i, (d) j
+ integer(8), value :: i,j
+ end function
+ end interface
+ public :: mul64hi
+
+ interface umul64hi
+ attributes(device) integer(8) function __umul64hi(i,j) bind(c,name='__nv_umul64hi')
+ !dir$ ignore_tkr (d) i, (d) j
+ integer(8), value :: i,j
+ end function
+ end interface
+ public :: umul64hi
+
+
! Atomic Operations
interface atomicadd
>From 8f79c2b082ccadb247a50a65aab556f11cc822cc Mon Sep 17 00:00:00 2001
From: Renaud-K <rkauffmann at nvidia.com>
Date: Fri, 31 Jan 2025 11:44:40 -0800
Subject: [PATCH 2/2] Adding test and correcting issues uncovered by tests
---
flang/module/cudadevice.f90 | 52 ++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 26 deletions(-)
diff --git a/flang/module/cudadevice.f90 b/flang/module/cudadevice.f90
index 93326d2a3c4ea4..00e8b3db73ad87 100644
--- a/flang/module/cudadevice.f90
+++ b/flang/module/cudadevice.f90
@@ -78,7 +78,7 @@ attributes(device) subroutine threadfence_system()
! Math API
interface __fadd_rn
- attributes(device) real function __fadd_rn(a,b) bind(c, name='__nv_fmul_rn')
+ attributes(device) real function __fadd_rn(a,b) bind(c, name='__nv_fadd_rn')
!dir$ ignore_tkr (d) a, (d) b
real, value :: a, b
end function
@@ -86,7 +86,7 @@ attributes(device) subroutine threadfence_system()
public :: __fadd_rn
interface __fadd_rz
- attributes(device) real function __fadd_rz(a,b) bind(c, name='__nv_fmul_rn')
+ attributes(device) real function __fadd_rz(a,b) bind(c, name='__nv_fadd_rz')
!dir$ ignore_tkr (d) a, (d) b
real, value :: a, b
end function
@@ -270,97 +270,97 @@ attributes(device) subroutine threadfence_system()
public :: __fdiv_rd
interface __dadd_rn
- attributes(device) real function __dadd_rn(a,b) bind(c, name='__nv_dadd_rn')
+ attributes(device) real(8) function __dadd_rn(a,b) bind(c, name='__nv_dadd_rn')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dadd_rn
interface __dadd_rz
- attributes(device) real function __dadd_rz(a,b) bind(c, name='__nv_dadd_rz')
+ attributes(device) real(8) function __dadd_rz(a,b) bind(c, name='__nv_dadd_rz')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dadd_rz
interface __dadd_ru
- attributes(device) real function __dadd_ru(a,b) bind(c, name='__nv_dadd_ru')
+ attributes(device) real(8) function __dadd_ru(a,b) bind(c, name='__nv_dadd_ru')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dadd_ru
interface __dadd_rd
- attributes(device) real function __dadd_rd(a,b) bind(c, name='__nv_dadd_rd')
+ attributes(device) real(8) function __dadd_rd(a,b) bind(c, name='__nv_dadd_rd')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dadd_rd
interface __dmul_rn
- attributes(device) real function __dmul_rn(a,b) bind(c, name='__nv_dmul_rn')
+ attributes(device) real(8) function __dmul_rn(a,b) bind(c, name='__nv_dmul_rn')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dmul_rn
interface __dmul_rz
- attributes(device) real function __dmul_rz(a,b) bind(c, name='__nv_dmul_rz')
+ attributes(device) real(8) function __dmul_rz(a,b) bind(c, name='__nv_dmul_rz')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dmul_rz
interface __dmul_ru
- attributes(device) real function __dmul_ru(a,b) bind(c, name='__nv_dmul_ru')
+ attributes(device) real(8) function __dmul_ru(a,b) bind(c, name='__nv_dmul_ru')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dmul_ru
interface __dmul_rd
- attributes(device) real function __dmul_rd(a,b) bind(c, name='__nv_dmul_rd')
+ attributes(device) real(8) function __dmul_rd(a,b) bind(c, name='__nv_dmul_rd')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b
end function
end interface
public :: __dmul_rd
interface __fma_rn
- attributes(device) real function __fma_rn(a,b) bind(c, name='__nv_fma_rn')
+ attributes(device) real(8) function __fma_rn(a,b,c) bind(c, name='__nv_fma_rn')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b, c
end function
end interface
public :: __fma_rn
interface __fma_rz
- attributes(device) real function __fma_rz(a,b) bind(c, name='__nv_fma_rz')
+ attributes(device) real(8) function __fma_rz(a,b,c) bind(c, name='__nv_fma_rz')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b, c
end function
end interface
public :: __fma_rz
interface __fma_ru
- attributes(device) real function __fma_ru(a,b) bind(c, name='__nv_fma_ru')
+ attributes(device) real(8) function __fma_ru(a,b,c) bind(c, name='__nv_fma_ru')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b, c
end function
end interface
public :: __fma_ru
interface __fma_rd
- attributes(device) real function __fma_rd(a,b) bind(c, name='__nv_fma_rd')
+ attributes(device) real(8) function __fma_rd(a,b,c) bind(c, name='__nv_fma_rd')
!dir$ ignore_tkr (d) a, (d) b
- real, value :: a, b
+ real(8), value :: a, b, c
end function
end interface
public :: __fma_rd
More information about the flang-commits
mailing list