71 const MPI_Aint *displacements,
76 size_t num_ranks[num_redists];
77 int *restrict ranks[num_redists];
80 redists, num_ranks, ranks);
82 size_t rank_pos[num_redists];
83 for (
size_t j = 0; j < num_redists; ++j)
87 MPI_Datatype datatypes[num_redists];
88 int block_lengths[num_redists];
89 for (
size_t i = 0; i < num_redists; ++i)
91 p =
xmalloc(
sizeof (*p) * num_messages);
92 for (
size_t i = 0; i < num_messages; ++i) {
93 int min_rank = INT_MAX;
94 for (
size_t j = 0; j < num_redists; ++j)
95 if (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] < min_rank)
96 min_rank = ranks[j][rank_pos[j]];
98 for (
size_t j = 0; j < num_redists; ++j)
100 (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank)
104 p[i].
rank = min_rank;
107 block_lengths, comm);
108 for (
size_t j = 0; j < num_redists; ++j) {
109 if (datatypes[j] != MPI_DATATYPE_NULL)
112 += (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank);
116 for (
size_t j = 0; j < num_redists; ++j)
124 const MPI_Aint src_displacements[num_redists],
125 const MPI_Aint dst_displacements[num_redists],
129 redists, num_redists, src_displacements, dst_displacements, comm,
136 const MPI_Aint src_displacements[num_redists],
137 const MPI_Aint dst_displacements[num_redists],
149 size_t num_redists_ = num_redists >= 0 ? (size_t)num_redists : 0;
160 (
int)nsend, (
int)nrecv, send_msgs, recv_msgs, new_comm, config);
165 return redist_collection;
add versions of standard API functions not returning on error
struct Xt_config_ xt_default_config
implementation of configuration object
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)
#define xt_mpi_call(call, comm)
MPI_Datatype xt_redist_get_MPI_Datatype(Xt_redist redist, int rank, enum xt_msg_direction direction)
unsigned xt_redist_agg_msg_count(size_t num_redists, enum xt_msg_direction direction, const Xt_redist redists[num_redists], size_t num_ranks[num_redists], int *restrict ranks[num_redists])
void xt_redist_check_comms(Xt_redist *redists, int num_redists, MPI_Comm comm)
MPI_Datatype xt_create_compound_datatype(size_t count, const MPI_Aint displacements[count], const MPI_Datatype datatypes[count], const int block_lengths[count], 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)
static size_t generate_msg_infos(struct Xt_redist_msg **msgs, const MPI_Aint *displacements, const Xt_redist *redists, size_t num_redists, MPI_Comm comm, enum xt_msg_direction direction)
Xt_redist xt_redist_collection_static_custom_new(Xt_redist *redists, int num_redists, const MPI_Aint src_displacements[num_redists], const MPI_Aint dst_displacements[num_redists], MPI_Comm comm, Xt_config config)
redistribution of data, non-public declarations
static void xt_redist_msgs_free(size_t n, struct Xt_redist_msg *msgs, MPI_Comm comm)
Xt_redist xt_redist_single_array_base_custom_new(int nsend, int nrecv, const struct Xt_redist_msg send_msgs[], const struct Xt_redist_msg recv_msgs[], MPI_Comm comm, Xt_config config)