80 const void *
const src_data[],
void *
const dst_data[]) {
86 const void *
const *src_data,
void *
const *dst_data,
136 int *restrict *ranks)
146 for (
int i = 0; i < num_redists; ++i) {
148 if (redists[i] == NULL)
149 Xt_abort(comm,
"ERROR: invalid redist; cannot build "
150 "redistribution collection\n",
filename, __LINE__);
153 comm, &result), comm);
155 if ((result != MPI_IDENT) && (result != MPI_CONGRUENT))
156 Xt_abort(comm,
"ERROR: MPI communicators do not match; cannot build "
157 "redistribution collection\n",
filename, __LINE__);
163 const size_t *restrict num_ranks,
164 const int *
const ranks[num_rank_sets])
166 size_t rank_pos[num_rank_sets];
167 for (
size_t j = 0; j < num_rank_sets; ++j)
170 size_t num_messages = 0;
172 int min_rank = INT_MAX;
174 for (
size_t j = 0; j < num_rank_sets; ++j)
175 if (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] < min_rank)
176 min_rank = ranks[j][rank_pos[j]];
180 for (
size_t j = 0; j < num_rank_sets; ++j) {
182 += (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank);
183 ranks_left |= (rank_pos[j] < num_ranks[j]);
186 }
while (ranks_left);
193 size_t num_ranks[num_redists],
194 int *restrict ranks[num_redists],
197 bool ranks_left =
false;
199 size_t num_ranks_total = 0;
200 for (
size_t j = 0; j < num_redists; ++j) {
201 size_t redist_num_ranks
202 = (size_t)(redists[j]->
vtable->get_num_msg(redists[j], direction));
203 num_ranks[j] = redist_num_ranks;
204 num_ranks_total += redist_num_ranks;
206 if (num_ranks_total) {
207 int *ranks_buf =
xmalloc(num_ranks_total *
sizeof (*ranks_buf));
210 for (
size_t j = 0; j < num_redists; ++j) {
211 ranks[j] = ranks_buf + ofs;
214 ranks_left |= (nranks > 0);
216 sort_int(ranks[j], nranks);
220 for (
size_t j = 0; j < num_redists; ++j)
223 size_t num_messages = ranks_left
225 (
const int *
const *)(intptr_t)ranks)
227 return (
unsigned)num_messages;
232 const MPI_Aint displacements[count],
233 const MPI_Datatype datatypes[count],
234 const int block_lengths[count],
238 size_t num_datatypes = 0;
240 enum { max_auto_dt = 8 };
241 for (
size_t i = 0; i < count; ++i)
242 num_datatypes += (datatypes[i] != MPI_DATATYPE_NULL);
243 MPI_Datatype *datatypes_, dt_auto[max_auto_dt];
244 MPI_Aint *displacements_ = NULL, disp_auto[max_auto_dt];
245 int *block_lengths_, bl_auto[max_auto_dt];
247 if (num_datatypes != count) {
248 if (num_datatypes > max_auto_dt) {
249 size_t buf_size = num_datatypes *
sizeof(*datatypes_)
250 + num_datatypes *
sizeof(*displacements_)
251 + num_datatypes *
sizeof(*block_lengths_);
252 displacements_ =
xmalloc(buf_size);
253 datatypes_ = (MPI_Datatype *)(displacements_ + num_datatypes);
254 block_lengths_ = (
int *)(datatypes_ + num_datatypes);
256 datatypes_ = dt_auto;
257 displacements_ = disp_auto;
258 block_lengths_ = bl_auto;
262 for (
size_t i = 0; i < count; ++i) {
263 if (datatypes[i] != MPI_DATATYPE_NULL) {
265 datatypes_[num_datatypes] = datatypes[i];
266 displacements_[num_datatypes] = displacements[i];
267 block_lengths_[num_datatypes] = block_lengths[i];
271 datatypes = datatypes_;
272 displacements = displacements_;
273 block_lengths = block_lengths_;
275 MPI_Datatype datatype;
276 if (num_datatypes > 1)
278 ddt_list, (
int)num_datatypes, block_lengths,
279 displacements, datatypes, comm);
280 else if (displacements[0] == 0)
284 ddt_list, 1, (
int [1]){1}, displacements, datatypes[0], comm);
287 if (num_datatypes != count && num_datatypes > max_auto_dt)
288 free(displacements_);
add versions of standard API functions not returning on error
const struct Xt_sort_algo_funcptr * sort_funcs
const struct xt_redist_vtable * vtable
void(* sort_int)(int *a, size_t n)
MPI_Datatype(* get_msg_MPI_Datatype)(Xt_redist, int, enum xt_msg_direction, bool need_dup)
Xt_redist(* copy)(Xt_redist)
void(* s_exchange1)(Xt_redist, const void *, void *)
void(* a_exchange)(Xt_redist, int, const void *const *, void *const *, Xt_request *)
void(* a_exchange1)(Xt_redist, const void *, void *, Xt_request *)
int(* get_num_msg)(Xt_redist, enum xt_msg_direction)
int(* get_msg_ranks)(Xt_redist, enum xt_msg_direction, int *restrict *)
void(* delete)(Xt_redist)
MPI_Comm(* get_MPI_Comm)(Xt_redist)
void(* s_exchange)(Xt_redist, int, const void *const *, void *const *)
int MPI_Type_dup(MPI_Datatype oldtype, MPI_Datatype *newtype)
int MPI_Type_commit(MPI_Datatype *datatype)
static const char filename[]
struct Xt_config_ * Xt_config
implementation of configuration object
base definitions header file
struct Xt_redist_ * Xt_redist
static struct xt_gpu_vtable vtable
#define xt_mpi_call(call, comm)
MPI_Datatype Xt_mpi_ddt_cache_acquire_hindexed(struct Xt_mpiddt_list *ddt_list, int count, const int blocklength[count], const MPI_Aint disp[count], MPI_Datatype oldtype, MPI_Comm comm)
MPI_Datatype Xt_mpi_ddt_cache_acquire_struct(struct Xt_mpiddt_list *ddt_list, int count, const int blocklength[count], const MPI_Aint disp[count], const MPI_Datatype oldtype[count], MPI_Comm comm)
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)
int xt_redist_get_msg_ranks(Xt_redist redist, enum xt_msg_direction direction, int *restrict *ranks)
MPI_Datatype xt_redist_get_recv_MPI_Datatype(Xt_redist redist, int rank)
void xt_redist_delete(Xt_redist redist)
int xt_redist_get_num_recv_msg(Xt_redist redist)
static size_t xt_ranks_uniq_count(size_t num_rank_sets, const size_t *restrict num_ranks, const int *const ranks[num_rank_sets])
void xt_redist_check_comms(Xt_redist *redists, int num_redists, MPI_Comm comm)
int xt_redist_get_num_send_msg(Xt_redist redist)
void xt_redist_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data, Xt_request *request)
void xt_redist_a_exchange(Xt_redist redist, int num_arrays, const void *const *src_data, void *const *dst_data, Xt_request *request)
Xt_redist xt_redist_copy(Xt_redist redist)
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)
void xt_redist_s_exchange(Xt_redist redist, int num_arrays, const void *const src_data[], void *const dst_data[])
MPI_Comm xt_redist_get_MPI_Comm(Xt_redist redist)
MPI_Datatype xt_redist_get_send_MPI_Datatype(Xt_redist redist, int rank)
void xt_redist_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data)
redistribution of data, non-public declarations
struct Xt_request_ * Xt_request