79 const void **src_data,
void **dst_data) {
85 const void **src_data,
void **dst_data,
135 int *restrict *ranks)
145 for (
int i = 0; i < num_redists; ++i) {
147 if (redists[i] == NULL)
148 Xt_abort(comm,
"ERROR: invalid redist; cannot build "
149 "redistribution collection\n",
filename, __LINE__);
152 comm, &result), comm);
154 if ((result != MPI_IDENT) && (result != MPI_CONGRUENT))
155 Xt_abort(comm,
"ERROR: MPI communicators do not match; cannot build "
156 "redistribution collection\n",
filename, __LINE__);
162 const size_t *restrict num_ranks,
163 const int *
const ranks[num_rank_sets])
165 size_t rank_pos[num_rank_sets];
166 for (
size_t j = 0; j < num_rank_sets; ++j)
169 size_t num_messages = 0;
171 int min_rank = INT_MAX;
173 for (
size_t j = 0; j < num_rank_sets; ++j)
174 if (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] < min_rank)
175 min_rank = ranks[j][rank_pos[j]];
179 for (
size_t j = 0; j < num_rank_sets; ++j) {
181 += (rank_pos[j] < num_ranks[j] && ranks[j][rank_pos[j]] == min_rank);
182 ranks_left |= (rank_pos[j] < num_ranks[j]);
185 }
while (ranks_left);
192 size_t num_ranks[num_redists],
193 int *restrict ranks[num_redists],
196 bool ranks_left =
false;
198 size_t num_ranks_total = 0;
199 for (
size_t j = 0; j < num_redists; ++j) {
200 size_t redist_num_ranks
201 = (size_t)(redists[j]->
vtable->get_num_msg(redists[j], direction));
202 num_ranks[j] = redist_num_ranks;
203 num_ranks_total += redist_num_ranks;
205 if (num_ranks_total) {
206 int *ranks_buf =
xmalloc(num_ranks_total *
sizeof (*ranks_buf));
209 for (
size_t j = 0; j < num_redists; ++j) {
210 ranks[j] = ranks_buf + ofs;
213 ranks_left |= (nranks > 0);
215 sort_int(ranks[j], nranks);
219 for (
size_t j = 0; j < num_redists; ++j)
222 size_t num_messages = ranks_left
225 return (
unsigned)num_messages;
230 const MPI_Aint displacements[count],
231 const MPI_Datatype datatypes[count],
232 const int block_lengths[count],
236 size_t num_datatypes = 0;
238 enum { max_auto_dt = 8 };
239 for (
size_t i = 0; i < count; ++i)
240 num_datatypes += (datatypes[i] != MPI_DATATYPE_NULL);
241 MPI_Datatype *datatypes_, dt_auto[max_auto_dt];
242 MPI_Aint *displacements_, disp_auto[max_auto_dt];
243 int *block_lengths_, bl_auto[max_auto_dt];
245 if (num_datatypes != count) {
246 if (num_datatypes > max_auto_dt) {
247 size_t buf_size = num_datatypes *
sizeof(*datatypes_)
248 + num_datatypes *
sizeof(*displacements_)
249 + num_datatypes *
sizeof(*block_lengths_);
250 displacements_ =
xmalloc(buf_size);
251 datatypes_ = (MPI_Datatype *)(displacements_ + num_datatypes);
252 block_lengths_ = (
int *)(datatypes_ + num_datatypes);
254 datatypes_ = dt_auto;
255 displacements_ = disp_auto;
256 block_lengths_ = bl_auto;
260 for (
size_t i = 0; i < count; ++i) {
261 if (datatypes[i] != MPI_DATATYPE_NULL) {
263 datatypes_[num_datatypes] = datatypes[i];
264 displacements_[num_datatypes] = displacements[i];
265 block_lengths_[num_datatypes] = block_lengths[i];
270 datatypes_ = (MPI_Datatype *)datatypes;
271 displacements_ = (MPI_Aint *)displacements;
272 block_lengths_ = (
int *)block_lengths;
274 MPI_Datatype datatype;
275 if (num_datatypes > 1)
277 ddt_list, (
int)num_datatypes, block_lengths_,
278 displacements_, datatypes_, comm);
279 else if (displacements_[0] == 0)
283 ddt_list, 1, (
int [1]){1}, displacements_, datatypes_[0], comm);
286 if (num_datatypes != count && num_datatypes > max_auto_dt)
287 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(* a_exchange)(Xt_redist, int, const void **, void **, Xt_request *)
void(* s_exchange1)(Xt_redist, const void *, void *)
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(* s_exchange)(Xt_redist, int, const void **, void **)
void(* delete)(Xt_redist)
MPI_Comm(* get_MPI_Comm)(Xt_redist)
int MPI_Type_dup(MPI_Datatype oldtype, MPI_Datatype *newtype)
int MPI_Type_commit(MPI_Datatype *datatype)
implementation of configuration object
base definitions header file
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, int blocklength[count], 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, int blocklength[count], MPI_Aint disp[count], 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)
static const char filename[]
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)
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)
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)
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_delete(Xt_redist redist)
int xt_redist_get_num_recv_msg(Xt_redist redist)
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)
Xt_redist xt_redist_copy(Xt_redist redist)
void xt_redist_a_exchange(Xt_redist redist, int num_arrays, const void **src_data, void **dst_data, Xt_request *request)
void xt_redist_s_exchange(Xt_redist redist, int num_arrays, const void **src_data, void **dst_data)
void xt_redist_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data)
redistribution of data, non-public declarations