sig
  type kernel
  external relax_vcustom : 'Vector.vcustom -> 'Vector.vcustom
    = "%identity"
  type ('a, 'b) kernelArgs =
      VCustom of 'Vector.vcustom
    | VFloat32 of Vector.vfloat32
    | VFloat64 of Vector.vfloat64
    | VComplex32 of Vector.vcomplex32
    | VInt32 of Vector.vint32
    | VInt64 of Vector.vint64
    | Int32 of int
    | Int64 of int
    | Float32 of float
    | Float64 of float
    | Vector of ('a, 'b) Vector.vector
    | LocalFloat32 of Vector.localvfloat32
  type block = {
    mutable blockX : int;
    mutable blockY : int;
    mutable blockZ : int;
  }
  type grid = {
    mutable gridX : int;
    mutable gridY : int;
    mutable gridZ : int;
  }
  val nbCaches : int
  module Cuda :
    sig
      type cuda_extra
      external cuda_create_extra : int -> Kernel.Cuda.cuda_extra
        = "spoc_cuda_create_extra"
      external cuda_load_param_vec :
        int Pervasives.ref ->
        Kernel.Cuda.cuda_extra -> Vector.device_vec -> unit
        = "spoc_cuda_load_param_vec_b" "spoc_cuda_load_param_vec_n"
      external cuda_custom_load_param_vec :
        int Pervasives.ref ->
        Kernel.Cuda.cuda_extra -> Vector.device_vec -> unit
        = "spoc_cuda_custom_load_param_vec_b"
        "spoc_cuda_custom_load_param_vec_n"
      external cuda_load_param_int :
        int Pervasives.ref -> Kernel.Cuda.cuda_extra -> int -> unit
        = "spoc_cuda_load_param_int_b" "spoc_cuda_load_param_int_n"
      external cuda_load_param_int64 :
        int Pervasives.ref -> Kernel.Cuda.cuda_extra -> int -> unit
        = "spoc_cuda_load_param_int64_b" "spoc_cuda_load_param_int64_n"
      external cuda_load_param_float :
        int Pervasives.ref -> Kernel.Cuda.cuda_extra -> float -> unit
        = "spoc_cuda_load_param_float_b" "spoc_cuda_load_param_float_n"
      external cuda_load_param_float64 :
        int Pervasives.ref -> Kernel.Cuda.cuda_extra -> float -> unit
        = "spoc_cuda_load_param_float64_b" "spoc_cuda_load_param_float64_n"
      external set_block_shape :
        Kernel.kernel -> Kernel.block -> Devices.generalInfo -> unit
        = "spoc_cuda_set_block_shape"
      external cuda_launch_grid :
        int Pervasives.ref ->
        Kernel.kernel ->
        Kernel.grid ->
        Kernel.block -> Kernel.Cuda.cuda_extra -> Devices.generalInfo -> unit
        = "spoc_cuda_launch_grid_b" "spoc_cuda_launch_grid_n"
      external cuda_create_dummy_kernel : unit -> Kernel.kernel
        = "spoc_cuda_create_dummy_kernel"
      val cudaKernelCache :
        (Digest.t, Devices.generalInfo -> Kernel.kernel) Hashtbl.t array
        Pervasives.ref
      val cuda_load :
        bool ->
        int ->
        string ->
        string ->
        ('a, 'b) Kernel.kernelArgs array ->
        Devices.generalInfo -> Kernel.kernel
      val cuda_load_arg :
        int Pervasives.ref ->
        Kernel.Cuda.cuda_extra ->
        Devices.device -> '-> '-> ('c, 'd) Kernel.kernelArgs -> unit
    end
  module OpenCL :
    sig
      external opencl_load_debug :
        string -> string -> Devices.generalInfo -> Kernel.kernel
        = "spoc_debug_opencl_load"
      external opencl_load_param_vec :
        int Pervasives.ref ->
        Kernel.kernel ->
        int -> Vector.device_vec -> Devices.generalInfo -> unit
        = "spoc_opencl_load_param_vec"
      external opencl_load_param_local_vec :
        int Pervasives.ref ->
        Kernel.kernel ->
        int -> Vector.device_vec -> Devices.generalInfo -> unit
        = "spoc_opencl_load_param_local_vec"
      external opencl_load_param_int :
        int Pervasives.ref ->
        Kernel.kernel -> int -> Devices.generalInfo -> unit
        = "spoc_opencl_load_param_int"
      external opencl_load_param_int64 :
        int Pervasives.ref ->
        Kernel.kernel -> int -> Devices.generalInfo -> unit
        = "spoc_opencl_load_param_int64"
      external opencl_load_param_float :
        int Pervasives.ref ->
        Kernel.kernel -> float -> Devices.generalInfo -> unit
        = "spoc_opencl_load_param_float"
      external opencl_load_param_float64 :
        int Pervasives.ref ->
        Kernel.kernel -> float -> Devices.generalInfo -> unit
        = "spoc_opencl_load_param_float64"
      external opencl_launch_grid :
        Kernel.kernel ->
        Kernel.grid -> Kernel.block -> Devices.generalInfo -> int -> unit
        = "spoc_opencl_launch_grid"
      external opencl_create_dummy_kernel : unit -> Kernel.kernel
        = "spoc_opencl_create_dummy_kernel"
      val openCLKernelCache :
        (Digest.t, Devices.generalInfo -> Kernel.kernel) Hashtbl.t array
        Pervasives.ref
      val opencl_load :
        bool ->
        bool ->
        int -> string -> string -> Devices.generalInfo -> Kernel.kernel
      val opencl_load_arg :
        int Pervasives.ref ->
        Devices.device ->
        Kernel.kernel -> int -> ('a, 'b) Kernel.kernelArgs -> unit
    end
  exception ERROR_BLOCK_SIZE
  exception ERROR_GRID_SIZE
  val exec :
    string ->
    string ->
    ('a, 'b) Kernel.kernelArgs array ->
    Kernel.block * Kernel.grid ->
    bool -> bool -> int -> Devices.device -> unit
  val run :
    Devices.device ->
    Kernel.block * Kernel.grid ->
    ?debug:bool ->
    ?cached:bool ->
    ?queue_id:int ->
    (Kernel.block * Kernel.grid ->
     bool -> bool -> int -> Devices.device -> 'a) ->
    'a
  val max : '-> '-> 'a
end