[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