[Ada] Implement expansion of CUDA_Execute pragma
authorGhjuvan Lacambre <lacambre@adacore.com>
Wed, 24 Jun 2020 15:12:19 +0000 (17:12 +0200)
committerPierre-Marie de Rodat <derodat@adacore.com>
Fri, 16 Oct 2020 07:34:54 +0000 (03:34 -0400)
gcc/ada/

* elists.ads (New_Elmt_List): New functions.
* elists.adb (New_Elmt_List): New functions.
* exp_prag.adb: Add dependency on Elists.
(Expand_Pragma_CUDA_Execute): New function.
(Expand_N_Pragma): Add call to Expand_Pragma_CUDA_Execute.
* rtsfind.ads: Add CUDA.Internal, CUDA.Runtime, System.C
packages and RE_Push_Call_Configuration,
RE_Pop_Call_Configuration, RE_Launch_Kernel, RO_IC_Unsigned,
RO_IC_Unsigned_Long_Long entities.
* rtsfind.adb: Extend Interfaces_Descendant to include
Interfaces_C.

gcc/ada/elists.adb
gcc/ada/elists.ads
gcc/ada/exp_prag.adb
gcc/ada/rtsfind.adb
gcc/ada/rtsfind.ads

index 90bcd2e..44998bc 100644 (file)
@@ -373,6 +373,64 @@ package body Elists is
       return Elists.Last;
    end New_Elmt_List;
 
+   -------------------
+   -- New_Elmt_List --
+   -------------------
+
+   function New_Elmt_List (Elmt1 : Node_Or_Entity_Id)
+     return Elist_Id
+   is
+      L : constant Elist_Id := New_Elmt_List;
+   begin
+      Append_Elmt (Elmt1, L);
+      return L;
+   end New_Elmt_List;
+
+   -------------------
+   -- New_Elmt_List --
+   -------------------
+
+   function New_Elmt_List
+     (Elmt1 : Node_Or_Entity_Id;
+      Elmt2 : Node_Or_Entity_Id) return Elist_Id
+   is
+      L : constant Elist_Id := New_Elmt_List (Elmt1);
+   begin
+      Append_Elmt (Elmt2, L);
+      return L;
+   end New_Elmt_List;
+
+   -------------------
+   -- New_Elmt_List --
+   -------------------
+
+   function New_Elmt_List
+     (Elmt1 : Node_Or_Entity_Id;
+      Elmt2 : Node_Or_Entity_Id;
+      Elmt3 : Node_Or_Entity_Id) return Elist_Id
+   is
+      L : constant Elist_Id := New_Elmt_List (Elmt1, Elmt2);
+   begin
+      Append_Elmt (Elmt3, L);
+      return L;
+   end New_Elmt_List;
+
+   -------------------
+   -- New_Elmt_List --
+   -------------------
+
+   function New_Elmt_List
+     (Elmt1 : Node_Or_Entity_Id;
+      Elmt2 : Node_Or_Entity_Id;
+      Elmt3 : Node_Or_Entity_Id;
+      Elmt4 : Node_Or_Entity_Id) return Elist_Id
+   is
+      L : constant Elist_Id := New_Elmt_List (Elmt1, Elmt2, Elmt3);
+   begin
+      Append_Elmt (Elmt4, L);
+      return L;
+   end New_Elmt_List;
+
    ---------------
    -- Next_Elmt --
    ---------------
index 12672a6..825b87f 100644 (file)
@@ -90,6 +90,21 @@ package Elists is
    --  a field in some other node which points to an element list where the
    --  list is then subsequently filled in using Append calls.
 
+   function New_Elmt_List (Elmt1 : Node_Or_Entity_Id) return Elist_Id;
+   function New_Elmt_List
+     (Elmt1 : Node_Or_Entity_Id;
+      Elmt2 : Node_Or_Entity_Id) return Elist_Id;
+   function New_Elmt_List
+     (Elmt1 : Node_Or_Entity_Id;
+      Elmt2 : Node_Or_Entity_Id;
+      Elmt3 : Node_Or_Entity_Id) return Elist_Id;
+   function New_Elmt_List
+     (Elmt1 : Node_Or_Entity_Id;
+      Elmt2 : Node_Or_Entity_Id;
+      Elmt3 : Node_Or_Entity_Id;
+      Elmt4 : Node_Or_Entity_Id) return Elist_Id;
+   --  Create a new element list containing the given arguments.
+
    function First_Elmt (List : Elist_Id) return Elmt_Id;
    pragma Inline (First_Elmt);
    --  Obtains the first element of the given element list or, if the list has
index e978595..b0ee233 100644 (file)
@@ -28,6 +28,7 @@ with Casing;   use Casing;
 with Checks;   use Checks;
 with Debug;    use Debug;
 with Einfo;    use Einfo;
+with Elists;   use Elists;
 with Errout;   use Errout;
 with Exp_Ch11; use Exp_Ch11;
 with Exp_Util; use Exp_Util;
@@ -67,6 +68,7 @@ package body Exp_Prag is
    procedure Expand_Pragma_Abort_Defer             (N : Node_Id);
    procedure Expand_Pragma_Check                   (N : Node_Id);
    procedure Expand_Pragma_Common_Object           (N : Node_Id);
+   procedure Expand_Pragma_CUDA_Execute            (N : Node_Id);
    procedure Expand_Pragma_Import_Or_Interface     (N : Node_Id);
    procedure Expand_Pragma_Inspection_Point        (N : Node_Id);
    procedure Expand_Pragma_Interrupt_Priority      (N : Node_Id);
@@ -156,6 +158,9 @@ package body Exp_Prag is
          when Pragma_Common_Object =>
             Expand_Pragma_Common_Object (N);
 
+         when Pragma_CUDA_Execute =>
+            Expand_Pragma_CUDA_Execute (N);
+
          when Pragma_Import =>
             Expand_Pragma_Import_Or_Interface (N);
 
@@ -614,6 +619,474 @@ package body Exp_Prag is
               Expression => New_Copy_Tree (Psect)))));
    end Expand_Pragma_Common_Object;
 
+   --------------------------------
+   -- Expand_Pragma_CUDA_Execute --
+   --------------------------------
+
+   --  Pragma CUDA_Execute is expanded in the following manner:
+
+   --  Original Code
+
+   --    pragma CUDA_Execute (My_Proc (X, Y), Blocks, Grids, Mem, Stream)
+
+   --  Expanded Code
+
+   --    declare
+   --      Blocks_Id : CUDA.Vector_Types.Dim3 := Blocks;
+   --      Grids_Id  : CUDA.Vector_Types.Dim3 := Grids;
+   --      Mem_Id    : Integer := <Mem or 0>;
+   --      Stream_Id : CUDA.Driver_Types.Stream_T := <Stream or null>;
+   --      X_Id      : <Type of X> := X;
+   --      Y_Id      : <Type of Y> := Y;
+   --      Arg_Id    : Array (1..2) of System.Address :=
+   --        (X'Address,_Id Y'Address);_Id
+   --    begin
+   --      CUDA.Internal.Push_Call_Configuration (
+   --        Grids_Id,
+   --        Blocks_Id,
+   --        Mem_Id,
+   --        Stream_Id);
+   --      CUDA.Internal.Pop_Call_Configuration (
+   --        Grids_Id'address,
+   --        Blocks_Id'address,
+   --        Mem_Id'address,
+   --        Stream_Id'address),
+   --      CUDA.Runtime_Api.Launch_Kernel (
+   --        My_Proc'Address,
+   --        Blocks_Id,
+   --        Grids_Id,
+   --        Arg_Id'Address,
+   --        Mem_Id,
+   --        Stream_Id);
+   --    end;
+
+   procedure Expand_Pragma_CUDA_Execute (N : Node_Id) is
+
+      Loc : constant Source_Ptr := Sloc (N);
+
+      procedure Append_Copies
+        (Params : List_Id;
+         Decls  : List_Id;
+         Copies : Elist_Id);
+      --  For each parameter in list Params, create an object declaration of
+      --  the followinng form:
+      --
+      --    Copy_Id : Param_Typ := Param_Val;
+      --
+      --  Param_Typ is the type of the parameter. Param_Val is the initial
+      --  value of the parameter. The declarations are stored in Decls, the
+      --  entities of the new objects are collected in list Copies.
+
+      function Build_Dim3_Declaration
+        (Decl_Id  : Entity_Id;
+         Init_Val : Node_Id) return Node_Id;
+      --  Build an object declaration of the form
+      --
+      --    Decl_Id : CUDA.Vectory_Types.Dim3 := Val;
+      --
+      --  Val depends on the nature of Init_Val, as follows:
+      --
+      --    * If Init_Val is already of type CUDA.Vector_Types.Dim3, then
+      --      Init_Val is used.
+      --
+      --    * If Init_Val is a single Integer, Val has the following form:
+      --
+      --        (Interfaces.C.Unsigned (Init_Val),
+      --         Interfaces.C.Unsigned (1),
+      --         Interfaces.C.Unsigned (1))
+      --
+      --    * If Init_Val is an aggregate of three values, Val has the
+      --      following form:
+      --
+      --        (Interfaces.C.Unsigned (Val_1),
+      --         Interfaces.C.Unsigned (Val_2),
+      --         Interfaces.C.Unsigned (Val_3))
+
+      function Build_Kernel_Args_Declaration
+        (Kernel_Arg : Entity_Id;
+         Var_Ids    : Elist_Id) return Node_Id;
+      --  Given a list of variables, return an object declaration of the
+      --  following form:
+      --
+      --    Kernel_Arg : ... := (Var_1'Address, ..., Var_N'Address);
+
+      function Build_Launch_Kernel_Call
+        (Proc       : Entity_Id;
+         Grid_Dims  : Entity_Id;
+         Block_Dims : Entity_Id;
+         Kernel_Arg : Entity_Id;
+         Memory     : Entity_Id;
+         Stream     : Entity_Id) return Node_Id;
+      --  Builds and returns a call to CUDA.Launch_Kernel using the given
+      --  arguments. Proc is the entity of the procedure passed to the
+      --  CUDA_Execute pragma. Grid_Dims and Block_Dims are entities of the
+      --  generated declarations that hold the kernel's dimensions. Args is the
+      --  entity of the temporary array that holds the arguments of the kernel.
+      --  Memory and Stream are the entities of the temporaries that hold the
+      --  fourth and fith arguments of CUDA_Execute or their default values.
+
+      function Build_Shared_Memory_Declaration
+        (Decl_Id  : Entity_Id;
+         Init_Val : Node_Id) return Node_Id;
+      --  Builds a declaration the Defining_Identifier of which is Decl_Id, the
+      --  type of which is CUDA.Driver_Types.Stream_T and the value of which is
+      --  Init_Val if present or null if not.
+
+      function Build_Simple_Declaration_With_Default
+         (Decl_Id     : Entity_Id;
+          Init_Val    : Entity_Id;
+          Typ         : Entity_Id;
+          Default_Val : Entity_Id) return Node_Id;
+      --  Build a declaration the Defining_Identifier of which is Decl_Id, the
+      --  Object_Definition of which is Typ, the value of which is Init_Val if
+      --  present or Default otherwise.
+
+      function Build_Stream_Declaration
+        (Decl_Id  : Entity_Id;
+         Init_Val : Node_Id) return Node_Id;
+      --  Build a declaration the Defining_Identifier of which is Decl_Id, the
+      --  type of which is Integer, the value of which is Init_Val if present
+      --  and 0 otherwise.
+
+      function To_Addresses (Elmts : Elist_Id) return List_Id;
+      --  Returns a new list containing each element of Elmts wrapped in an
+      --  'address attribute reference. When passed No_Elist, returns an empty
+      --  list.
+
+      -------------------
+      -- Append_Copies --
+      -------------------
+
+      procedure Append_Copies
+        (Params : List_Id;
+         Decls  : List_Id;
+         Copies : Elist_Id)
+      is
+         Copy  : Entity_Id;
+         Param : Node_Id;
+      begin
+         Param := First (Params);
+         while Present (Param) loop
+            Copy := Make_Temporary (Loc, 'C');
+
+            Append_To (Decls,
+               Make_Object_Declaration (Loc,
+                 Defining_Identifier => Copy,
+                 Object_Definition   => New_Occurrence_Of (Etype (Param), Loc),
+                 Expression          => New_Copy_Tree (Param)));
+
+            Append_Elmt (Copy, Copies);
+            Next (Param);
+         end loop;
+      end Append_Copies;
+
+      ----------------------------
+      -- Build_Dim3_Declaration --
+      ----------------------------
+
+      function Build_Dim3_Declaration
+        (Decl_Id  : Entity_Id;
+         Init_Val : Node_Id) return Node_Id
+      is
+         Grid_Dim_X : Node_Id;
+         Grid_Dim_Y : Node_Id;
+         Grid_Dim_Z : Node_Id;
+         Init_Value : Node_Id;
+      begin
+         if Etype (Init_Val) = RTE (RE_Dim3) then
+            Init_Value := Init_Val;
+         else
+            --  If Init_Val is an aggregate, use each of its arguments
+
+            if Nkind (Init_Val) = N_Aggregate then
+               Grid_Dim_X := First (Expressions (Init_Val));
+               Grid_Dim_Y := Next (Grid_Dim_X);
+               Grid_Dim_Z := Next (Grid_Dim_Y);
+
+            --  Otherwise, we know it is an integer and the rest defaults to 1.
+
+            else
+               Grid_Dim_X := Init_Val;
+               Grid_Dim_Y := Make_Integer_Literal (Loc, 1);
+               Grid_Dim_Z := Make_Integer_Literal (Loc, 1);
+            end if;
+
+            --  Then cast every value to Interfaces.C.Unsigned and build an
+            --  aggregate we can use to initialize the Dim3.
+
+            Init_Value :=
+              Make_Aggregate (Loc,
+                Expressions => New_List (
+                  Make_Type_Conversion (Loc,
+                    Subtype_Mark =>
+                      New_Occurrence_Of (RTE (RO_IC_Unsigned), Loc),
+                    Expression   => New_Copy_Tree (Grid_Dim_X)),
+
+                  Make_Type_Conversion (Loc,
+                    Subtype_Mark =>
+                      New_Occurrence_Of (RTE (RO_IC_Unsigned), Loc),
+                    Expression   => New_Copy_Tree (Grid_Dim_Y)),
+
+                  Make_Type_Conversion (Loc,
+                    Subtype_Mark =>
+                      New_Occurrence_Of (RTE (RO_IC_Unsigned), Loc),
+                    Expression   => New_Copy_Tree (Grid_Dim_Z))));
+         end if;
+
+         --  Finally return the declaration
+
+         return Make_Object_Declaration (Loc,
+            Defining_Identifier => Decl_Id,
+            Object_Definition   => New_Occurrence_Of (RTE (RE_Dim3), Loc),
+            Expression          => Init_Value);
+      end Build_Dim3_Declaration;
+
+      -----------------------------------
+      -- Build_Kernel_Args_Declaration --
+      -----------------------------------
+
+      function Build_Kernel_Args_Declaration
+        (Kernel_Arg : Entity_Id;
+         Var_Ids    : Elist_Id) return Node_Id
+      is
+         Vals : constant List_Id := To_Addresses (Var_Ids);
+      begin
+         return
+           Make_Object_Declaration (Loc,
+             Defining_Identifier => Kernel_Arg,
+             Object_Definition   =>
+               Make_Constrained_Array_Definition (Loc,
+                 Discrete_Subtype_Definitions => New_List (
+                   Make_Range (Loc,
+                     Low_Bound  => Make_Integer_Literal (Loc, 1),
+                     High_Bound =>
+                       Make_Integer_Literal (Loc, List_Length (Vals)))),
+                 Component_Definition         =>
+                   Make_Component_Definition (Loc,
+                     Subtype_Indication =>
+                       New_Occurrence_Of (Etype (RTE (RE_Address)), Loc))),
+             Expression          => Make_Aggregate (Loc, Vals));
+      end Build_Kernel_Args_Declaration;
+
+      -------------------------------
+      --  Build_Launch_Kernel_Call --
+      -------------------------------
+
+      function Build_Launch_Kernel_Call
+        (Proc       : Entity_Id;
+         Grid_Dims  : Entity_Id;
+         Block_Dims : Entity_Id;
+         Kernel_Arg : Entity_Id;
+         Memory     : Entity_Id;
+         Stream     : Entity_Id) return Node_Id is
+      begin
+         return
+           Make_Procedure_Call_Statement (Loc,
+             Name                   =>
+               New_Occurrence_Of (RTE (RE_Launch_Kernel), Loc),
+             Parameter_Associations => New_List (
+               Make_Attribute_Reference (Loc,
+                 Prefix         => New_Occurrence_Of (Proc, Loc),
+                 Attribute_Name => Name_Address),
+               New_Occurrence_Of (Grid_Dims, Loc),
+               New_Occurrence_Of (Block_Dims, Loc),
+               Make_Attribute_Reference (Loc,
+                 Prefix         => New_Occurrence_Of (Kernel_Arg, Loc),
+                 Attribute_Name => Name_Address),
+               New_Occurrence_Of (Memory, Loc),
+               New_Occurrence_Of (Stream, Loc)));
+      end Build_Launch_Kernel_Call;
+
+      -------------------------------------
+      -- Build_Shared_Memory_Declaration --
+      -------------------------------------
+
+      function Build_Shared_Memory_Declaration
+        (Decl_Id  : Entity_Id;
+         Init_Val : Node_Id) return Node_Id
+      is
+      begin
+         return Build_Simple_Declaration_With_Default
+           (Decl_Id     => Decl_Id,
+            Init_Val    => Init_Val,
+            Typ         =>
+              New_Occurrence_Of (RTE (RO_IC_Unsigned_Long_Long), Loc),
+            Default_Val => Make_Integer_Literal (Loc, 0));
+      end Build_Shared_Memory_Declaration;
+
+      -------------------------------------------
+      -- Build_Simple_Declaration_With_Default --
+      -------------------------------------------
+
+      function Build_Simple_Declaration_With_Default
+        (Decl_Id     : Entity_Id;
+         Init_Val    : Node_Id;
+         Typ         : Entity_Id;
+         Default_Val : Node_Id) return Node_Id
+      is
+         Value : Node_Id := Init_Val;
+      begin
+         if No (Value) then
+            Value := Default_Val;
+         end if;
+
+         return Make_Object_Declaration (Loc,
+           Defining_Identifier => Decl_Id,
+           Object_Definition   => Typ,
+           Expression          => Value);
+      end Build_Simple_Declaration_With_Default;
+
+      ------------------------------
+      -- Build_Stream_Declaration --
+      ------------------------------
+
+      function Build_Stream_Declaration
+        (Decl_Id  : Entity_Id;
+         Init_Val : Node_Id) return Node_Id
+      is
+      begin
+         return Build_Simple_Declaration_With_Default
+           (Decl_Id     => Decl_Id,
+            Init_Val    => Init_Val,
+            Typ         => New_Occurrence_Of (RTE (RE_Stream_T), Loc),
+            Default_Val => Make_Null (Loc));
+      end Build_Stream_Declaration;
+
+      ------------------
+      -- To_Addresses --
+      ------------------
+
+      function To_Addresses (Elmts : Elist_Id) return List_Id is
+         Result : constant List_Id := New_List;
+         Elmt   : Elmt_Id;
+      begin
+         if Elmts = No_Elist then
+            return Result;
+         end if;
+
+         Elmt := First_Elmt (Elmts);
+         while Present (Elmt) loop
+            Append_To (Result,
+              Make_Attribute_Reference (Loc,
+                Prefix         => New_Occurrence_Of (Node (Elmt), Loc),
+                Attribute_Name => Name_Address));
+            Next_Elmt (Elmt);
+         end loop;
+
+         return Result;
+      end To_Addresses;
+
+      --  Local variables
+
+      --  Pragma arguments
+
+      Procedure_Call   : constant Node_Id := Get_Pragma_Arg (Arg_N (N, 1));
+      Grid_Dimensions  : constant Node_Id := Get_Pragma_Arg (Arg_N (N, 2));
+      Block_Dimensions : constant Node_Id := Get_Pragma_Arg (Arg_N (N, 3));
+      Shared_Memory    : constant Node_Id := Get_Pragma_Arg (Arg_N (N, 4));
+      CUDA_Stream      : constant Node_Id := Get_Pragma_Arg (Arg_N (N, 5));
+
+      --  Entities of objects that capture the value of pragma arguments
+
+      Grids_Id  : constant Entity_Id := Make_Temporary (Loc, 'C');
+      Blocks_Id : constant Entity_Id := Make_Temporary (Loc, 'C');
+      Memory_Id : constant Entity_Id := Make_Temporary (Loc, 'C');
+      Stream_Id : constant Entity_Id := Make_Temporary (Loc, 'C');
+
+      --  List holding the entities of the copies of Procedure_Call's
+      --  arguments.
+
+      Kernel_Arg_Copies : constant Elist_Id := New_Elmt_List;
+
+      --  Entity of the array that contains the address of each of the kernel's
+      --  arguments.
+
+      Kernel_Args_Id : constant Entity_Id := Make_Temporary (Loc, 'C');
+
+      --  Calls to the CUDA runtime API.
+
+      Launch_Kernel_Call : Node_Id;
+      Pop_Call           : Node_Id;
+      Push_Call          : Node_Id;
+
+      --  Declaration of all temporaries required for CUDA API Calls.
+
+      Blk_Decls  : constant List_Id := New_List;
+
+   --  Start of processing for CUDA_Execute
+
+   begin
+      --  Build parameter declarations for CUDA API calls
+
+      Append_To
+        (Blk_Decls, Build_Dim3_Declaration (Grids_Id, Grid_Dimensions));
+
+      Append_To
+        (Blk_Decls,
+         Build_Dim3_Declaration (Blocks_Id, Block_Dimensions));
+
+      Append_To
+        (Blk_Decls,
+         Build_Shared_Memory_Declaration (Memory_Id, Shared_Memory));
+
+      Append_To
+        (Blk_Decls, Build_Stream_Declaration (Stream_Id, CUDA_Stream));
+
+      Append_Copies
+        (Parameter_Associations (Procedure_Call),
+         Blk_Decls,
+         Kernel_Arg_Copies);
+
+      Append_To
+        (Blk_Decls,
+         Build_Kernel_Args_Declaration
+           (Kernel_Args_Id, Kernel_Arg_Copies));
+
+      --  Build calls to the CUDA API
+
+      Push_Call :=
+         Make_Procedure_Call_Statement (Loc,
+           Name                   =>
+             New_Occurrence_Of (RTE (RE_Push_Call_Configuration), Loc),
+           Parameter_Associations => New_List (
+             New_Occurrence_Of (Grids_Id, Loc),
+             New_Occurrence_Of (Blocks_Id, Loc),
+             New_Occurrence_Of (Memory_Id, Loc),
+             New_Occurrence_Of (Stream_Id, Loc)));
+
+      Pop_Call :=
+        Make_Procedure_Call_Statement (Loc,
+          Name                   =>
+            New_Occurrence_Of (RTE (RE_Pop_Call_Configuration), Loc),
+          Parameter_Associations => To_Addresses
+            (New_Elmt_List
+              (Grids_Id,
+               Blocks_Id,
+               Memory_Id,
+               Stream_Id)));
+
+      Launch_Kernel_Call := Build_Launch_Kernel_Call
+        (Proc       => Entity (Name (Procedure_Call)),
+         Grid_Dims  => Grids_Id,
+         Block_Dims => Blocks_Id,
+         Kernel_Arg => Kernel_Args_Id,
+         Memory     => Memory_Id,
+         Stream     => Stream_Id);
+
+      --  Finally make the block that holds declarations and calls
+
+      Rewrite (N,
+        Make_Block_Statement (Loc,
+          Declarations               => Blk_Decls,
+          Handled_Statement_Sequence =>
+            Make_Handled_Sequence_Of_Statements (Loc,
+             Statements => New_List (
+               Push_Call,
+               Pop_Call,
+               Launch_Kernel_Call))));
+      Analyze (N);
+   end Expand_Pragma_CUDA_Execute;
+
    ----------------------------------
    -- Expand_Pragma_Contract_Cases --
    ----------------------------------
index 7689375..83220ef 100644 (file)
@@ -589,7 +589,7 @@ package body Rtsfind is
      range CUDA_Driver_Types .. CUDA_Vector_Types;
 
    subtype Interfaces_Descendant is RTU_Id
-     range Interfaces_Packed_Decimal .. Interfaces_Packed_Decimal;
+     range Interfaces_C .. Interfaces_Packed_Decimal;
 
    subtype System_Descendant is RTU_Id
      range System_Address_Image .. System_Tasking_Stages;
index ff9eb0a..ed6b671 100644 (file)
@@ -159,13 +159,15 @@ package Rtsfind is
       Ada_Wide_Wide_Text_IO_Integer_IO,
       Ada_Wide_Wide_Text_IO_Modular_IO,
 
-      --  CUDA
+      --  Package CUDA
 
       CUDA,
 
       --  Children of CUDA
 
       CUDA_Driver_Types,
+      CUDA_Internal,
+      CUDA_Runtime_Api,
       CUDA_Vector_Types,
 
       --  Interfaces
@@ -174,6 +176,7 @@ package Rtsfind is
 
       --  Children of Interfaces
 
+      Interfaces_C,
       Interfaces_Packed_Decimal,
 
       --  Package System
@@ -625,6 +628,11 @@ package Rtsfind is
 
      RE_Stream_T,                        -- CUDA.Driver_Types
 
+     RE_Push_Call_Configuration,         -- CUDA.Internal
+     RE_Pop_Call_Configuration,          -- CUDA.Internal
+
+     RE_Launch_Kernel,                   -- CUDA.Runtime_Api
+
      RE_Dim3,                            -- CUDA.Vector_Types
 
      RE_Integer_8,                       -- Interfaces
@@ -636,6 +644,9 @@ package Rtsfind is
      RE_Unsigned_32,                     -- Interfaces
      RE_Unsigned_64,                     -- Interfaces
 
+     RO_IC_Unsigned,                     -- Interfaces.C
+     RO_IC_Unsigned_Long_Long,           -- Interfaces.C
+
      RE_Address,                         -- System
      RE_Any_Priority,                    -- System
      RE_Bit_Order,                       -- System
@@ -1916,6 +1927,11 @@ package Rtsfind is
 
      RE_Stream_T                         => CUDA_Driver_Types,
 
+     RE_Push_Call_Configuration          => CUDA_Internal,
+     RE_Pop_Call_Configuration           => CUDA_Internal,
+
+     RE_Launch_Kernel                    => CUDA_Runtime_Api,
+
      RE_Dim3                             => CUDA_Vector_Types,
 
      RE_Integer_8                        => Interfaces,
@@ -1927,6 +1943,9 @@ package Rtsfind is
      RE_Unsigned_32                      => Interfaces,
      RE_Unsigned_64                      => Interfaces,
 
+     RO_IC_Unsigned                      => Interfaces_C,
+     RO_IC_Unsigned_Long_Long            => Interfaces_C,
+
      RE_Address                          => System,
      RE_Any_Priority                     => System,
      RE_Bit_Order                        => System,