Spoc_core.Kernel_argtype t = | Vec : ('a, 'b) Vector.t -> tV2 Vector - carries full vector for Direct backends
*)| Int : int -> tInteger scalar (converted to int32)
*)| Int32 : int32 -> t32-bit integer scalar
*)| Int64 : int64 -> t64-bit integer scalar
*)| Float32 : float -> t32-bit float scalar
*)| Float64 : float -> t64-bit float scalar
*)Kernel argument GADT - each variant carries its typed value
Existential wrapper for vectors with element type info
val vector_length : t -> int optionGet vector length if argument is a Vec
val as_int32 : t -> int32 optionGet scalar as int32 if possible
val as_int64 : t -> int64 optionGet scalar as int64 if possible
val as_float : t -> float optionGet scalar as float if possible
type 'acc folder = {on_vec : 'a 'b. ('a, 'b) Vector.t -> 'acc -> 'acc;on_int : int -> 'acc -> 'acc;on_int32 : int32 -> 'acc -> 'acc;on_int64 : int64 -> 'acc -> 'acc;on_float32 : float -> 'acc -> 'acc;on_float64 : float -> 'acc -> 'acc;}Fold over kernel arguments with typed handlers. This is the main way backends consume args in a type-safe manner.
For JIT backends, the vector handler receives the vector and should bind (buffer_ptr, length) to the kernel args.
For Direct backends, the vector handler can access the vector directly.
type iterator = {iter_vec : 'a 'b. ('a, 'b) Vector.t -> unit;iter_int : int -> unit;iter_int32 : int32 -> unit;iter_int64 : int64 -> unit;iter_float32 : float -> unit;iter_float64 : float -> unit;}Iterate over args with side effects
type 'a mapper = {map_vec : 'b 'c. ('b, 'c) Vector.t -> 'a;map_int : int -> 'a;map_int32 : int32 -> 'a;map_int64 : int64 -> 'a;map_float32 : float -> 'a;map_float64 : float -> 'a;}Map args to a list of values using typed handlers