76 if (!disp_len)
return 0;
78 int cur_stride = 1, cur_size = 1;
79 int last_disp = disp[pos[0]];
80 for (
size_t p = 1; p < disp_len; ++p) {
81 int new_disp = disp[pos[p]];
82 int new_stride = new_disp - last_disp;
84 cur_stride = new_stride;
86 }
else if (new_stride == cur_stride) {
89 }
else if (cur_size > 2 || (cur_size == 2 && cur_stride == 1) ) {
98 cur_stride = new_stride;
100 last_disp = new_disp;
103 if (cur_size > 2 || (cur_size == 2 && cur_stride == 1)) {
105 }
else if (cur_size == 2) {
118 if (disp_len<1)
return 0;
120 int cur_start = disp[pos[0]], cur_stride = 1, cur_size = 1;
121 int last_disp = cur_start;
123 for (
size_t p = 1; p < disp_len; ++p) {
124 int new_disp = disp[pos[p]];
125 int new_stride = new_disp - last_disp;
127 cur_stride = new_stride;
129 }
else if (new_stride == cur_stride) {
132 }
else if (cur_size > 2 || (cur_size == 2 && cur_stride == 1) ) {
134 v[i] = (
struct Xt_offset_ext){ .start = cur_start, .stride = cur_stride,
137 cur_start = new_disp;
142 v[i].start = cur_start;
146 cur_start += cur_stride;
148 cur_stride = new_stride;
150 last_disp = new_disp;
153 if (cur_size > 2 || (cur_size == 2 && cur_stride == 1)) {
154 v[i] = (
struct Xt_offset_ext){ .start = cur_start, .stride = cur_stride,
157 }
else if (cur_size == 2) {
158 v[i].start = cur_start;
162 v[i].start = cur_start + cur_stride;
167 v[i].start = cur_start;
185 if (offsets != NULL) {
188 *v = v_ =
xrealloc(v_,
sizeof(*v_) * vlen);
191 xt_mdisp2ext((
size_t)num_transfer_pos, offsets, transfer_pos, v_);
195 *v = v_ =
xrealloc(v_,
sizeof(*v_) * vlen);
198 xt_disp2ext((
size_t)num_transfer_pos, transfer_pos, v_);
221 offsets, &vsize, &v, params);
232 const int *dst_offsets, MPI_Datatype
datatype)
240 const int *dst_offsets, MPI_Datatype
datatype,
247 size_t nmsg = (size_t)nsend + (
size_t)nrecv;
249 *send_msgs = msgs, *recv_msgs = msgs + nsend;
270 nsend, nrecv, send_msgs, recv_msgs, comm, &config_);
280pos2disp(
int pos,
int num_ext,
const int psum_ext_size[])
285 while (j < num_ext && pos >= psum_ext_size[j + 1])
292 const int psum_ext_size[],
int start_ext)
295 if (pos < psum_ext_size[j + 1] && pos >= psum_ext_size[j])
297 else if (pos < psum_ext_size[j + 1])
300 while (j < start_ext && pos >= psum_ext_size[j + 1])
304 while (j < num_ext && pos >= psum_ext_size[j + 1])
309#define XT_EXT_TYPE struct Xt_offset_ext
310#define XT_EXT_TAG ext
311#define XT_MPI_PARSE_STRIPE xt_mpi_parse_stripe
312#define XT_EXT_STRIDE_MASK isign_mask_current_pos_ext_size
313#define XT_EXT_STRIDE_MASK_PREP
317#undef XT_MPI_PARSE_STRIPE
318#undef XT_EXT_STRIDE_MASK
319#undef XT_EXT_STRIDE_MASK_PREP
321#define XT_EXT_TYPE struct Xt_aoffset_ext
322#define XT_EXT_TAG aext
323#define XT_MPI_PARSE_STRIPE xt_mpi_parse_astripe
324#define XT_EXT_STRIDE_MASK asign_mask_current_pos_ext_size
325#define XT_EXT_STRIDE_MASK_PREP MPI_Aint asign_mask_current_pos_ext_size \
326 = asign_mask(current_pos_ext.size)
330#undef XT_MPI_PARSE_STRIPE
331#undef XT_EXT_STRIDE_MASK
332#undef XT_EXT_STRIDE_MASK_PREP
341 if (num_blocks > 0) {
343 for (
size_t i = 0; i < num_blocks; ++i) {
344 block_offsets[i] = accum;
345 accum += block_sizes[i];
352 const int *block_offsets,
const int *block_sizes,
355 assert(block_sizes && block_offsets);
357 int *bdispl_vec =
xmalloc(2 * (
size_t)num_transfer_pos *
sizeof(*bdispl_vec)),
358 *blen_vec = bdispl_vec + num_transfer_pos;
360 for (
int i = 0; i < num_transfer_pos; ++i) {
361 int j = transfer_pos[i];
362 bdispl_vec[i] = block_offsets[j];
363 blen_vec[i] = block_sizes[j];
376 const int *block_offsets,
377 const int *block_sizes,
int **aux_offsets,
384 const int *block_offsets_;
386 block_offsets_ = block_offsets;
388 block_offsets_ = *aux_offsets
389 =
xrealloc(*aux_offsets, num_blocks *
sizeof(*block_offsets_));
399 block_offsets_, block_sizes, params);
410 const int *src_block_offsets,
411 const int *src_block_sizes,
413 const int *dst_block_offsets,
414 const int *dst_block_sizes,
416 MPI_Datatype datatype)
419 xmap, src_block_offsets, src_block_sizes, src_block_num, dst_block_offsets,
426 const int *src_block_offsets,
427 const int *src_block_sizes,
429 const int *dst_block_offsets,
430 const int *dst_block_sizes,
432 MPI_Datatype datatype,
446 size_t nmsg = ((size_t)nsend + (
size_t)nrecv);
449 int *aux_offsets = NULL;
457 if (dst_block_num < max_dst_pos)
458 die(
"xt_redist_p2p_blocks_off_new: dst_block_num too small");
463 &aux_offsets, (
size_t)dst_block_num,
470 if (src_block_num < max_src_pos)
471 die(
"xt_redist_p2p_blocks_off_new: src_block_num too small");
474 &aux_offsets, (
size_t)src_block_num,
475 ¶ms, msgs+nrecv);
486 nsend, nrecv, msgs+nrecv, msgs, comm, &config_);
494 const int *src_block_sizes,
496 const int *dst_block_sizes,
498 MPI_Datatype datatype)
501 xmap, src_block_sizes, src_block_num, dst_block_sizes, dst_block_num,
507 const int *src_block_sizes,
int src_block_num,
508 const int *dst_block_sizes,
int dst_block_num,
509 MPI_Datatype datatype,
513 xmap, NULL, src_block_sizes, src_block_num,
514 NULL, dst_block_sizes, dst_block_num, datatype, config);
add versions of standard API functions not returning on error
#define xrealloc(ptr, size)
struct Xt_mpiddt_list ddt_list
struct Xt_config_ xt_default_config
implementation of configuration object
MPI_Comm xt_mpi_comm_smart_dup(MPI_Comm comm, int *tag_offset)
size_t xt_disp2ext_count(size_t disp_len, const int *disp)
size_t xt_disp2ext(size_t disp_len, const int *disp, struct Xt_offset_ext *restrict v)
void xt_mpi_comm_smart_dedup(MPI_Comm *comm, int tag_offset)
void Xt_mpi_ddt_cache_check_retention(struct Xt_mpiddt_list *ddt_list, size_t nmsg, struct Xt_redist_msg msgs[nmsg])
MPI_Datatype xt_mpi_ddt_block_gen(int count, const int *disp, const int *blocklengths, struct Xt_mpi_strp_prs_params *params)
static void xt_destroy_mpi_strp_prs_params(struct Xt_mpi_strp_prs_params *params)
static void xt_init_mpi_strp_prs_params(struct Xt_mpi_strp_prs_params *params, MPI_Datatype old_type, MPI_Comm comm)
PPM_DSO_INTERNAL MPI_Datatype xt_mpi_parse_stripe(size_t vlen, const struct Xt_offset_ext v[vlen], struct Xt_mpi_strp_prs_params *params)
redistribution of data, non-public declarations
static size_t xt_mdisp2ext_count(size_t disp_len, const int *disp, const int *pos)
static MPI_Datatype generate_datatype(const int *transfer_pos, int num_transfer_pos, const int *offsets, size_t *vsize, struct Xt_offset_ext **v, struct Xt_mpi_strp_prs_params *params)
static void generate_block_msg_infos(int num_msgs, Xt_xmap_iter iter, const int *block_offsets, const int *block_sizes, int **aux_offsets, size_t num_blocks, struct Xt_mpi_strp_prs_params *params, struct Xt_redist_msg *msgs)
static size_t xt_mdisp2ext(size_t disp_len, const int *disp, const int *pos, struct Xt_offset_ext *restrict v)
static MPI_Datatype generate_block_datatype(const int *transfer_pos, int num_transfer_pos, const int *block_offsets, const int *block_sizes, struct Xt_mpi_strp_prs_params *params)
static void generate_msg_infos(int num_msgs, Xt_xmap_iter iter, const int *offsets, struct Xt_redist_msg *msgs, struct Xt_mpi_strp_prs_params *params)
static int pos2disp2(int pos, int num_ext, const int psum_ext_size[], int start_ext)
static void aux_gen_simple_block_offsets(int block_offsets[], const int block_sizes[], size_t num_blocks)
static int pos2disp(int pos, int num_ext, const int psum_ext_size[])
Xt_redist xt_redist_p2p_custom_new(Xt_xmap xmap, MPI_Datatype datatype, Xt_config config)
Xt_redist xt_redist_p2p_off_new(Xt_xmap xmap, const int *src_offsets, const int *dst_offsets, MPI_Datatype datatype)
Xt_redist xt_redist_p2p_blocks_custom_new(Xt_xmap xmap, const int *src_block_sizes, int src_block_num, const int *dst_block_sizes, int dst_block_num, MPI_Datatype datatype, Xt_config config)
Xt_redist xt_redist_p2p_new(Xt_xmap xmap, MPI_Datatype datatype)
Xt_redist xt_redist_p2p_off_custom_new(Xt_xmap xmap, const int *src_offsets, const int *dst_offsets, MPI_Datatype datatype, Xt_config config)
Xt_redist xt_redist_p2p_blocks_off_custom_new(Xt_xmap xmap, const int *src_block_offsets, const int *src_block_sizes, int src_block_num, const int *dst_block_offsets, const int *dst_block_sizes, int dst_block_num, MPI_Datatype datatype, Xt_config config)
Xt_redist xt_redist_p2p_blocks_off_new(Xt_xmap xmap, const int *src_block_offsets, const int *src_block_sizes, int src_block_num, const int *dst_block_offsets, const int *dst_block_sizes, int dst_block_num, MPI_Datatype datatype)
Xt_redist xt_redist_p2p_blocks_new(Xt_xmap xmap, const int *src_block_sizes, int src_block_num, const int *dst_block_sizes, int dst_block_num, MPI_Datatype datatype)
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)
exchange map declarations
int xt_xmap_iterator_next(Xt_xmap_iter iter)
Xt_xmap_iter xt_xmap_get_out_iterator(Xt_xmap xmap)
void xt_xmap_iterator_delete(Xt_xmap_iter iter)
int xt_xmap_get_num_destinations(Xt_xmap xmap)
int xt_xmap_iterator_get_rank(Xt_xmap_iter iter)
int xt_xmap_get_max_dst_pos(Xt_xmap xmap)
int xt_xmap_get_num_sources(Xt_xmap xmap)
Xt_xmap_iter xt_xmap_get_in_iterator(Xt_xmap xmap)
MPI_Comm xt_xmap_get_communicator(Xt_xmap xmap)
int const * xt_xmap_iterator_get_transfer_pos(Xt_xmap_iter iter)
int xt_xmap_get_max_src_pos(Xt_xmap xmap)
int xt_xmap_iterator_get_num_transfer_pos(Xt_xmap_iter iter)