72 const MPI_Aint displacements[num_redists],
74 const size_t num_ranks[num_redists],
75 const int *restrict ranks[num_redists],
81 size_t rank_pos[num_redists];
82 for (
size_t j = 0; j < num_redists; ++j)
84 MPI_Datatype datatypes[num_redists];
85 int block_lengths[num_redists];
86 for (
size_t i = 0; i < num_redists; ++i)
88 for (
size_t i = 0; i < nmsg; ++i) {
89 int min_rank = INT_MAX;
90 for (
size_t j = 0; j < num_redists; ++j)
91 if (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] < min_rank)
92 min_rank = ranks[j][rank_pos[j]];
94 for (
size_t j = 0; j < num_redists; ++j)
96 (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank)
100 msgs[i].
rank = min_rank;
103 block_lengths, ddt_list, comm);
104 for (
size_t j = 0; j < num_redists; ++j) {
106 += (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank);
114 const MPI_Aint src_displacements[num_redists],
115 const MPI_Aint dst_displacements[num_redists],
119 redists, num_redists, src_displacements, dst_displacements, comm,
126 const MPI_Aint src_displacements[num_redists],
127 const MPI_Aint dst_displacements[num_redists],
137 size_t num_redists_ = num_redists >= 0 ? (size_t)num_redists : 0;
138 int *restrict ranks[2][num_redists_];
139 size_t num_ranks[2][num_redists_];
142 for (
size_t i = 0; i < 2; ++i)
144 redists, num_ranks[i], ranks[i], config);
145 size_t nmsg_sum = nmsg[
SEND] + nmsg[
RECV];
148 for (
size_t i = 0; i < 2; ++i) {
149 size_t ofs = i == 0 ? 0 : nmsg[
SEND];
150 const MPI_Aint *disp = i == 0 ? src_displacements : dst_displacements;
153 (
const int *restrict (*))(intptr_t)ranks[i],
163 (
int)nmsg[
SEND], (
int)nmsg[
RECV], msgs, msgs+nmsg[
SEND], new_comm,
168 return redist_collection;
add versions of standard API functions not returning on error
struct Xt_config_ xt_default_config
struct Xt_config_ * Xt_config
implementation of configuration object
struct Xt_redist_ * Xt_redist
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)
void Xt_mpi_ddt_cache_free(struct Xt_mpiddt_list *ddt_list, MPI_Comm comm)
#define Xt_mpiddt_empty_list
MPI_Datatype xt_redist_get_MPI_Datatype(Xt_redist redist, int rank, enum xt_msg_direction direction, bool do_dup)
MPI_Datatype xt_create_compound_datatype(size_t count, const MPI_Aint displacements[count], const MPI_Datatype datatypes[count], const int block_lengths[count], struct Xt_mpiddt_list *ddt_list, MPI_Comm comm)
void xt_redist_check_comms(Xt_redist *redists, int num_redists, MPI_Comm comm)
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], Xt_config config)
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 void generate_msg_infos(size_t nmsg, size_t num_redists, struct Xt_redist_msg *msgs, const MPI_Aint displacements[num_redists], const Xt_redist redists[num_redists], const size_t num_ranks[num_redists], const int *restrict ranks[num_redists], struct Xt_mpiddt_list *ddt_list, 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
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)