sig
  exception Error of string
  type communicator
  type rank = int
  val comm_world : Mpi.communicator
  external comm_size : Mpi.communicator -> int = "caml_mpi_comm_size"
  external comm_rank : Mpi.communicator -> Mpi.rank = "caml_mpi_comm_rank"
  type tag = int
  val send : '-> Mpi.rank -> Mpi.tag -> Mpi.communicator -> unit
  val receive : Mpi.rank -> Mpi.tag -> Mpi.communicator -> 'a
  val receive_status :
    Mpi.rank -> Mpi.tag -> Mpi.communicator -> 'a * Mpi.rank * Mpi.tag
  val probe : Mpi.rank -> Mpi.tag -> Mpi.communicator -> Mpi.rank * Mpi.tag
  val any_tag : Mpi.tag
  val any_source : Mpi.rank
  val send_int : int -> Mpi.rank -> Mpi.tag -> Mpi.communicator -> unit
  val receive_int : Mpi.rank -> Mpi.tag -> Mpi.communicator -> int
  val send_float : float -> Mpi.rank -> Mpi.tag -> Mpi.communicator -> unit
  val receive_float : Mpi.rank -> Mpi.tag -> Mpi.communicator -> float
  val send_int_array :
    int array -> Mpi.rank -> Mpi.tag -> Mpi.communicator -> unit
  val receive_int_array :
    int array -> Mpi.rank -> Mpi.tag -> Mpi.communicator -> unit
  val send_float_array :
    float array -> Mpi.rank -> Mpi.tag -> Mpi.communicator -> unit
  val receive_float_array :
    float array -> Mpi.rank -> Mpi.tag -> Mpi.communicator -> unit
  val barrier : Mpi.communicator -> unit
  val broadcast : '-> Mpi.rank -> Mpi.communicator -> 'a
  val broadcast_opt : 'a option -> Mpi.rank -> Mpi.communicator -> 'a
  val broadcast_int : int -> Mpi.rank -> Mpi.communicator -> int
  val broadcast_float : float -> Mpi.rank -> Mpi.communicator -> float
  val broadcast_int_array : int array -> Mpi.rank -> Mpi.communicator -> unit
  val broadcast_float_array :
    float array -> Mpi.rank -> Mpi.communicator -> unit
  val scatter : 'a array -> Mpi.rank -> Mpi.communicator -> 'a
  val scatter_int : int array -> Mpi.rank -> Mpi.communicator -> int
  val scatter_float : float array -> Mpi.rank -> Mpi.communicator -> float
  val scatter_int_array :
    int array -> int array -> Mpi.rank -> Mpi.communicator -> unit
  val scatter_float_array :
    float array -> float array -> Mpi.rank -> Mpi.communicator -> unit
  val gather : '-> Mpi.rank -> Mpi.communicator -> 'a array
  val gather_int : int -> int array -> Mpi.rank -> Mpi.communicator -> unit
  val gather_float :
    float -> float array -> Mpi.rank -> Mpi.communicator -> unit
  val gather_int_array :
    int array -> int array -> Mpi.rank -> Mpi.communicator -> unit
  val gather_float_array :
    float array -> float array -> Mpi.rank -> Mpi.communicator -> unit
  val allgather : '-> Mpi.communicator -> 'a array
  val allgather_int : int -> int array -> Mpi.communicator -> unit
  val allgather_float : float -> float array -> Mpi.communicator -> unit
  val allgather_int_array :
    int array -> int array -> Mpi.communicator -> unit
  val allgather_float_array :
    float array -> float array -> Mpi.communicator -> unit
  type intop =
      Int_max
    | Int_min
    | Int_sum
    | Int_prod
    | Int_land
    | Int_lor
    | Int_xor
  type floatop = Float_max | Float_min | Float_sum | Float_prod
  val reduce_int : int -> Mpi.intop -> Mpi.rank -> Mpi.communicator -> int
  val reduce_float :
    float -> Mpi.floatop -> Mpi.rank -> Mpi.communicator -> float
  val reduce_int_array :
    int array ->
    int array -> Mpi.intop -> Mpi.rank -> Mpi.communicator -> unit
  val reduce_float_array :
    float array ->
    float array -> Mpi.floatop -> Mpi.rank -> Mpi.communicator -> unit
  val allreduce_int : int -> Mpi.intop -> Mpi.communicator -> int
  val allreduce_float : float -> Mpi.floatop -> Mpi.communicator -> float
  val allreduce_int_array :
    int array -> int array -> Mpi.intop -> Mpi.communicator -> unit
  val allreduce_float_array :
    float array -> float array -> Mpi.floatop -> Mpi.communicator -> unit
  val scan_int : int -> Mpi.intop -> Mpi.communicator -> int
  val scan_float : float -> Mpi.floatop -> Mpi.communicator -> float
  val scan_int_array :
    int array -> int array -> Mpi.intop -> Mpi.communicator -> unit
  val scan_float_array :
    float array -> float array -> Mpi.floatop -> Mpi.communicator -> unit
  val comm_compare : Mpi.communicator -> Mpi.communicator -> bool
  type color = int
  val comm_split : Mpi.communicator -> Mpi.color -> int -> Mpi.communicator
  val color_none : Mpi.color
  val cart_create :
    Mpi.communicator -> int array -> bool array -> bool -> Mpi.communicator
  val dims_create : int -> int array -> int array
  val cart_rank : Mpi.communicator -> int array -> Mpi.rank
  val cart_coords : Mpi.communicator -> Mpi.rank -> int array
  type group
  val comm_create : Mpi.communicator -> Mpi.group -> Mpi.communicator
  val group_size : Mpi.group -> int
  val group_rank : Mpi.group -> Mpi.rank
  val group_translate_ranks :
    Mpi.group -> Mpi.rank array -> Mpi.group -> Mpi.rank array
  val comm_group : Mpi.communicator -> Mpi.group
  val group_union : Mpi.group -> Mpi.group -> Mpi.group
  val group_intersection : Mpi.group -> Mpi.group -> Mpi.group
  val group_difference : Mpi.group -> Mpi.group -> Mpi.group
  val group_incl : Mpi.group -> Mpi.rank array -> Mpi.group
  val group_excl : Mpi.group -> Mpi.rank array -> Mpi.group
  type group_range = {
    range_first : int;
    range_last : int;
    range_stride : int;
  }
  val group_range_incl : Mpi.group -> Mpi.group_range array -> Mpi.group
  val group_range_excl : Mpi.group -> Mpi.group_range array -> Mpi.group
  external wtime : unit -> float = "caml_mpi_wtime"
end