value caml_mpi_group_translate_ranks(value group1, value ranks, value group2) { int n = Wosize_val(ranks); int * ranks1 = stat_alloc(n * sizeof(int)); int * ranks2 = stat_alloc(n * sizeof(int)); int i; value res; for (i = 0; i < n; i++) ranks1[i] = Int_val(Field(ranks, i)); MPI_Group_translate_ranks(Group_val(group1), n, ranks1, Group_val(group2), ranks2); res = alloc(n, 0); for (i = 0; i < n; i++) Field(res, i) = Val_int(ranks2[i]); stat_free(ranks1); stat_free(ranks2); return res; }
value caml_mpi_alloc_group(MPI_Group g) { value res = alloc_final(1 + (sizeof(MPI_Group) + sizeof(value) - 1) / sizeof(value), caml_mpi_finalize_group, 1, 100); Group_val(res) = g; return res; }
value caml_mpi_group_range_excl(value group, value vranges) { int num; int (*ranges)[3]; MPI_Group newgroup; caml_mpi_extract_ranges(vranges, &num, &ranges); MPI_Group_range_excl(Group_val(group), num, ranges, &newgroup); stat_free(ranges); return caml_mpi_alloc_group(newgroup); }
value caml_mpi_group_incl(value group, value vranks) { MPI_Group newgroup; int n = Wosize_val(vranks); int * ranks = stat_alloc(n * sizeof(int)); int i; for (i = 0; i < n; i++) ranks[i] = Int_val(Field(vranks, i)); MPI_Group_incl(Group_val(group), n, ranks, &newgroup); stat_free(ranks); return caml_mpi_alloc_group(newgroup); }
value caml_mpi_group_intersection(value group1, value group2) { MPI_Group group; MPI_Group_intersection(Group_val(group1), Group_val(group2), &group); return caml_mpi_alloc_group(group); }
value caml_mpi_group_difference(value group1, value group2) { MPI_Group group; MPI_Group_difference(Group_val(group1), Group_val(group2), &group); return caml_mpi_alloc_group(group); }
value caml_mpi_group_rank(value group) { int size; MPI_Group_rank(Group_val(group), &size); return Val_int(size); }
static void caml_mpi_finalize_group(value v) { MPI_Group_free(&Group_val(v)); }
value caml_mpi_comm_create(value comm, value group) { MPI_Comm newcomm; MPI_Comm_create(Comm_val(comm), Group_val(group), &newcomm); return caml_mpi_alloc_comm(newcomm); }