Skip to content

Commit

Permalink
ada: Generate host-side CUDA_Register_Function calls for device's ada…
Browse files Browse the repository at this point in the history
…init/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.
  • Loading branch information
swbaird authored and marc-adacore committed Nov 4, 2022
1 parent 164cc7a commit 8080a1b
Showing 1 changed file with 49 additions and 17 deletions.
66 changes: 49 additions & 17 deletions gcc/ada/bindgen.adb
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 8080a1b

Please sign in to comment.