From 8080a1b64ae6030bb85ce88486dc2447d3063b09 Mon Sep 17 00:00:00 2001 From: Steve Baird Date: Tue, 4 Oct 2022 14:42:56 -0700 Subject: [PATCH] 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. --- gcc/ada/bindgen.adb | 66 +++++++++++++++++++++++++++++++++++++++-------------- 1 file 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 -- 2.7.4