71 const MPI_Aint *displacements,
Xt_redist *redists,
74 MPI_Datatype (*get_MPI_datatype)(
Xt_redist,
int)) {
76 int block_lengths[num_redists];
77 MPI_Datatype datatypes[num_redists];
79 for (
size_t i = 0; i < num_redists; ++i)
82 size_t num_ranks[num_redists], rank_pos[num_redists];
83 int *restrict ranks[num_redists];
84 bool ranks_left =
false;
86 for (
size_t j = 0; j < num_redists; ++j) {
92 ranks_left |= (num_ranks[j] > 0);
96 size_t num_messages = ranks_left
100 p =
xmalloc(
sizeof (*p) * num_messages);
101 for (
size_t i = 0; i < num_messages; ++i) {
102 int min_rank = INT_MAX;
103 for (
size_t j = 0; j < num_redists; ++j)
104 if (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] < min_rank)
105 min_rank = ranks[j][rank_pos[j]];
107 for (
size_t j = 0; j < num_redists; ++j)
109 (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank)
110 ? get_MPI_datatype(redists[j], min_rank) : MPI_DATATYPE_NULL;
112 p[i].
rank = min_rank;
115 block_lengths, comm);
116 for (
size_t j = 0; j < num_redists; ++j) {
117 if (datatypes[j] != MPI_DATATYPE_NULL)
120 += (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank);
124 for (
size_t j = 0; j < num_redists; ++j)
132 const MPI_Aint src_displacements[num_redists],
133 const MPI_Aint dst_displacements[num_redists],
143 size_t num_redists_ = num_redists >= 0 ? (size_t)num_redists : 0;
154 send_msgs, recv_msgs, new_comm);
156 return redist_collection;
void xt_redist_check_comms(Xt_redist *redists, int num_redists, MPI_Comm comm)
redistribution of data, non-public declarations
add versions of standard API functions not returning on error
MPI_Datatype xt_redist_get_send_MPI_Datatype(Xt_redist redist, int rank)
MPI_Datatype xt_redist_get_recv_MPI_Datatype(Xt_redist redist, int rank)
static size_t generate_msg_infos(struct Xt_redist_msg **msgs, const MPI_Aint *displacements, Xt_redist *redists, size_t num_redists, MPI_Comm comm, enum xt_msg_direction direction, MPI_Datatype(*get_MPI_datatype)(Xt_redist, int))
MPI_Datatype xt_create_compound_datatype(size_t num_redists, const MPI_Aint displacements[num_redists], const MPI_Datatype datatypes[num_redists], const int block_lengths[num_redists], MPI_Comm comm)
Xt_redist xt_redist_single_array_base_new(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm)
Xt_redist xt_redist_collection_static_new(Xt_redist *redists, int num_redists, const MPI_Aint src_displacements[num_redists], const MPI_Aint dst_displacements[num_redists], MPI_Comm comm)
MPI_Comm xt_mpi_comm_smart_dup(MPI_Comm comm, int *tag_offset)
void xt_mpi_comm_smart_dedup(MPI_Comm *comm, int tag_offset)
int xt_redist_get_msg_ranks(Xt_redist redist, enum xt_msg_direction direction, int **ranks)
#define xt_mpi_call(call, comm)
void(* xt_sort_int)(int *a, size_t n)
size_t xt_ranks_uniq_count(size_t num_rank_sets, size_t *restrict num_ranks, const int *ranks[num_rank_sets])