diff options
author | Steve Baird <baird@adacore.com> | 2022-10-04 14:42:56 -0700 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2022-11-04 14:47:22 +0100 |
commit | 8080a1b64ae6030bb85ce88486dc2447d3063b09 (patch) | |
tree | de7e873f6142c7f7409a71a45eee21f87592d41d | |
parent | 164cc7a501cfc3239f2146443c1ba486e773349c (diff) | |
download | gcc-8080a1b64ae6030bb85ce88486dc2447d3063b09.zip gcc-8080a1b64ae6030bb85ce88486dc2447d3063b09.tar.gz gcc-8080a1b64ae6030bb85ce88486dc2447d3063b09.tar.bz2 |
ada: Generate host-side CUDA_Register_Function calls for device's adainit/adafinal
To invoke a device-side subprogram from the host (via a CUDA_execute pragma),
the subprogram also has to be registered by calling CUDA_Register_Function.
The host-side adainit and adafinal procedures need to invoke the corresponding
device-side procedures, so corresponding CUDA_Register_Function calls need
to be generated.
gcc/ada/
* bindgen.adb
(Gen_CUDA_Init): Move existing loop body into a new local
procedure, Gen_CUDA_Register_Function_Call, and replace that loop
body with a call to this procedure. This first part is just
semantics-preserving refactoring. The second part is to add
Gen_CUDA_Register_Function_Call calls after the loop for the
device-side adainit and adafinal procedures.
-rw-r--r-- | gcc/ada/bindgen.adb | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/gcc/ada/bindgen.adb b/gcc/ada/bindgen.adb index f2aaa2d..1daa03d 100644 --- a/gcc/ada/bindgen.adb +++ b/gcc/ada/bindgen.adb @@ -1374,6 +1374,41 @@ package body Bindgen is ------------------- procedure Gen_CUDA_Init is + -- Generate call to register one function + procedure Gen_CUDA_Register_Function_Call + (Kernel_Name : String; + Kernel_String : String; + Kernel_Proc : String); + + ------------------------------------- + -- Gen_CUDA_Register_Function_Call -- + ------------------------------------- + + procedure Gen_CUDA_Register_Function_Call + (Kernel_Name : String; + Kernel_String : String; + Kernel_Proc : String) is + begin + WBI (" " & Kernel_String & " :="); + WBI (" Interfaces.C.Strings.New_Char_Array (""" + & Kernel_Name + & """);"); + + -- Generate call to CUDA runtime to register function. + WBI (" CUDA_Register_Function ("); + WBI (" Fat_Binary_Handle, "); + WBI (" " & Kernel_Proc & "'Address,"); + WBI (" " & Kernel_String & ","); + WBI (" " & Kernel_String & ","); + WBI (" -1,"); + WBI (" System.Null_Address,"); + WBI (" System.Null_Address,"); + WBI (" System.Null_Address,"); + WBI (" System.Null_Address,"); + WBI (" System.Null_Address);"); + WBI (""); + end Gen_CUDA_Register_Function_Call; + begin if not Enable_CUDA_Expansion then return; @@ -1404,26 +1439,23 @@ package body Bindgen is Get_Name_String (CUDA_Kernels.Table (K).Kernel_Name); -- Kernel_Name is the name of the kernel, after package expansion. begin - WBI (" " & Kernel_String & " :="); - WBI (" Interfaces.C.Strings.New_Char_Array (""" - & Kernel_Name - & """);"); - -- Generate call to CUDA runtime to register function. - WBI (" CUDA_Register_Function ("); - WBI (" Fat_Binary_Handle, "); - WBI (" " & Kernel_Proc & "'Address,"); - WBI (" " & Kernel_String & ","); - WBI (" " & Kernel_String & ","); - WBI (" -1,"); - WBI (" System.Null_Address,"); - WBI (" System.Null_Address,"); - WBI (" System.Null_Address,"); - WBI (" System.Null_Address,"); - WBI (" System.Null_Address);"); - WBI (""); + Gen_CUDA_Register_Function_Call + (Kernel_Name => Kernel_Name, + Kernel_String => Kernel_String, + Kernel_Proc => Kernel_Proc); end; end loop; + -- Register device-side Adainit and Adafinal + Gen_CUDA_Register_Function_Call + (Kernel_Name => Device_Ada_Init_Link_Name, + Kernel_String => "Adainit_Name_String", + Kernel_Proc => Device_Ada_Init_Subp_Name); + Gen_CUDA_Register_Function_Call + (Kernel_Name => Device_Ada_Final_Link_Name, + Kernel_String => "Adafinal_Name_String", + Kernel_Proc => Device_Ada_Final_Subp_Name); + WBI (" CUDA_Register_Fat_Binary_End (Fat_Binary_Handle);"); -- perform device (as opposed to host) elaboration |