value caml_mpi_broadcast_floatarray(value data, value root, value comm) { mlsize_t len = Wosize_val(data) / Double_wosize; double * d = caml_mpi_input_floatarray(data, len); MPI_Bcast(d, len, MPI_DOUBLE, Int_val(root), Comm_val(comm)); caml_mpi_commit_floatarray(d, data, len); return Val_unit; }
value caml_mpi_scatter_float(value data, value root, value comm) { double * src = caml_mpi_input_floatarray(data, len); double dst; MPI_Scatter(src, 1, MPI_DOUBLE, &dst, 1, MPI_DOUBLE, Int_val(root), Comm_val(comm)); caml_mpi_free_floatarray(src); return copy_double(dst); }
double * caml_mpi_input_floatarray_at_node(value data, mlsize_t len, value root, value comm) { int myrank; MPI_Comm_rank(Comm_val(comm), &myrank); if (myrank == Int_val(root)) return caml_mpi_input_floatarray(data, len); else return NULL; }
value caml_mpi_scan_floatarray(value data, value result, value op, value comm) { mlsize_t len = Wosize_val(data) / Double_wosize; double * d = caml_mpi_input_floatarray(data, len); double * res = caml_mpi_output_floatarray(result, len); MPI_Scan(d, res, len, MPI_DOUBLE, reduce_floatop[Int_val(op)], Comm_val(comm)); caml_mpi_free_floatarray(d); caml_mpi_commit_floatarray(res, result, len); return Val_unit; }
value caml_mpi_allgather_float(value data, value result, value comm) { mlsize_t len = Wosize_val(data) / Double_wosize; double * d = caml_mpi_input_floatarray(data, len); double * res = caml_mpi_output_floatarray(result, reslen); MPI_Allgather(d, len, MPI_DOUBLE, res, len, MPI_DOUBLE, Comm_val(comm)); caml_mpi_free_floatarray(d); caml_mpi_commit_floatarray(res, result, reslen); return Val_unit; }
value caml_mpi_gather_float(value data, value result, value root, value comm) { mlsize_t len = Wosize_val(data) / Double_wosize; mlsize_t reslen = Wosize_val(result) / Double_wosize; double * d = caml_mpi_input_floatarray(data, len); double * res = caml_mpi_output_floatarray_at_node(result, reslen, root, comm); MPI_Gather(d, len, MPI_DOUBLE, res, len, MPI_DOUBLE, Int_val(root), Comm_val(comm)); caml_mpi_free_floatarray(d); caml_mpi_commit_floatarray(res, result, reslen); return Val_unit; }