[flang-commits] [flang] 00bd2fa - [flang][cuda] Add bind c to cudadevice procedures (#92822)
via flang-commits
flang-commits at lists.llvm.org
Tue May 28 14:57:16 PDT 2024
Author: Valentin Clement (バレンタイン クレメン)
Date: 2024-05-28T14:57:13-07:00
New Revision: 00bd2fa1982f3114536323209fffad909463effc
URL: https://github.com/llvm/llvm-project/commit/00bd2fa1982f3114536323209fffad909463effc
DIFF: https://github.com/llvm/llvm-project/commit/00bd2fa1982f3114536323209fffad909463effc.diff
LOG: [flang][cuda] Add bind c to cudadevice procedures (#92822)
This patch adds bind c names to functions and subroutines in cudadevice
so they can be lowered and not hit the intrinsic procedure TODOs.
Added:
flang/test/Lower/CUDA/cuda-device-proc.cuf
Modified:
flang/module/cudadevice.f90
Removed:
################################################################################
diff --git a/flang/module/cudadevice.f90 b/flang/module/cudadevice.f90
index f34820dd10792..0224ecfdde7c6 100644
--- a/flang/module/cudadevice.f90
+++ b/flang/module/cudadevice.f90
@@ -18,34 +18,34 @@ module cudadevice
! Synchronization Functions
interface
- attributes(device) subroutine syncthreads()
+ attributes(device) subroutine syncthreads() bind(c, name='__syncthreads')
end subroutine
end interface
public :: syncthreads
interface
- attributes(device) integer function syncthreads_and(value)
+ attributes(device) integer function syncthreads_and(value) bind(c, name='__syncthreads_and')
integer :: value
end function
end interface
public :: syncthreads_and
interface
- attributes(device) integer function syncthreads_count(value)
+ attributes(device) integer function syncthreads_count(value) bind(c, name='__syncthreads_count')
integer :: value
end function
end interface
public :: syncthreads_count
interface
- attributes(device) integer function syncthreads_or(value)
+ attributes(device) integer function syncthreads_or(value) bind(c, name='__syncthreads_or')
integer :: value
end function
end interface
public :: syncthreads_or
interface
- attributes(device) subroutine syncwarp(mask)
+ attributes(device) subroutine syncwarp(mask) bind(c, name='__syncwarp')
integer :: mask
end subroutine
end interface
@@ -54,19 +54,19 @@ attributes(device) subroutine syncwarp(mask)
! Memory Fences
interface
- attributes(device) subroutine threadfence()
+ attributes(device) subroutine threadfence() bind(c, name='__threadfence')
end subroutine
end interface
public :: threadfence
interface
- attributes(device) subroutine threadfence_block()
+ attributes(device) subroutine threadfence_block() bind(c, name='__threadfence_block')
end subroutine
end interface
public :: threadfence_block
interface
- attributes(device) subroutine threadfence_system()
+ attributes(device) subroutine threadfence_system() bind(c, name='__threadfence_system')
end subroutine
end interface
public :: threadfence_system
diff --git a/flang/test/Lower/CUDA/cuda-device-proc.cuf b/flang/test/Lower/CUDA/cuda-device-proc.cuf
new file mode 100644
index 0000000000000..0c71ea6efcd63
--- /dev/null
+++ b/flang/test/Lower/CUDA/cuda-device-proc.cuf
@@ -0,0 +1,36 @@
+! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s
+
+! Test CUDA Fortran procedures available in cudadevice module
+
+attributes(global) subroutine devsub()
+ implicit none
+ integer :: ret
+
+ call syncthreads()
+ call syncwarp(1)
+ call threadfence()
+ call threadfence_block()
+ call threadfence_system()
+ ret = syncthreads_and(1)
+ ret = syncthreads_count(1)
+ ret = syncthreads_or(1)
+end
+
+! CHECK-LABEL: func.func @_QPdevsub() attributes {cuf.proc_attr = #cuf.cuda_proc<global>}
+! CHECK: fir.call @__syncthreads()
+! CHECK: fir.call @__syncwarp(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> ()
+! CHECK: fir.call @__threadfence()
+! CHECK: fir.call @__threadfence_block()
+! CHECK: fir.call @__threadfence_system()
+! CHECK: %{{.*}} = fir.call @__syncthreads_and(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> i32
+! CHECK: %{{.*}} = fir.call @__syncthreads_count(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> i32
+! CHECK: %{{.*}} = fir.call @__syncthreads_or(%{{.*}}) fastmath<contract> : (!fir.ref<i32>) -> i32
+
+! CHECK: func.func private @__syncthreads() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads"}
+! CHECK: func.func private @__syncwarp(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncwarp"}
+! CHECK: func.func private @__threadfence() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__threadfence"}
+! CHECK: func.func private @__threadfence_block() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__threadfence_block"}
+! CHECK: func.func private @__threadfence_system() attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__threadfence_system"}
+! CHECK: func.func private @__syncthreads_and(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) -> i32 attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads_and"}
+! CHECK: func.func private @__syncthreads_count(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) -> i32 attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads_count"}
+! CHECK: func.func private @__syncthreads_or(!fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>}) -> i32 attributes {cuf.proc_attr = #cuf.cuda_proc<device>, fir.bindc_name = "__syncthreads_or"}
More information about the flang-commits
mailing list