71 const int *offsets, MPI_Datatype base_datatype,
MPI_Comm comm)
74 int * tmp_displ = NULL;
76 if (offsets != NULL) {
78 tmp_displ =
xmalloc((
size_t)num_transfer_pos *
sizeof(
int));
80 for (
int i = 0; i < num_transfer_pos; ++i)
81 tmp_displ[i] = offsets[transfer_pos[i]];
112 offsets, base_datatype, comm);
122 const int *dst_offsets, MPI_Datatype
datatype)
130 const int *dst_offsets, MPI_Datatype
datatype,
137 size_t nmsg = (size_t)nsend + (
size_t)nrecv;
139 *send_msgs = msgs, *recv_msgs = msgs + nsend;
155 nsend, nrecv, send_msgs, recv_msgs, comm, config);
171 const int psum_ext_size[])
176 while (j < num_ext && pos >= psum_ext_size[j + 1])
178 int disp = extents[j].start + (pos - psum_ext_size[j]) * extents[j].stride;
184 const int psum_ext_size[], int start_ext)
187 if (pos < psum_ext_size[j + 1] && pos >= psum_ext_size[j])
189 else if (pos < psum_ext_size[j + 1])
192 while (j < start_ext && pos >= psum_ext_size[j + 1])
196 while (j < num_ext && pos >= psum_ext_size[j + 1])
198 int disp = extents[j].start + (pos - psum_ext_size[j]) * extents[j].stride;
206 const int psum_ext_size[],
207 MPI_Datatype base_datatype,
MPI_Comm comm)
209 if (num_transfer_pos_ext > 0)
211 size_t size_dt_stripes = 8, num_dt_stripes = 0;
213 =
xmalloc(size_dt_stripes *
sizeof (*dt_stripes));
217 num_ext, extents, psum_ext_size).
ext_idx;
220 struct Xt_pos_ext current_pos_ext = transfer_pos_ext[i];
221 if (num_dt_stripes >= size_dt_stripes)
224 size_dt_stripes *= 2;
226 size_dt_stripes *
sizeof (*dt_stripes));
231 num_ext, extents, psum_ext_size,
233 search_start_ext = pos.
ext_idx;
236 int preceding = psum_ext_size[pos.
ext_idx];
238 = base_ext.
start + ((current_pos_ext.
start - preceding)
240 int isign_mask_current_pos_ext_size =
isign_mask(current_pos_ext.
size);
246 derived_ext.size =
imin(abs(current_pos_ext.
size),
247 (~isign_mask_current_pos_ext_size
249 - (current_pos_ext.
start - preceding)))
250 | (isign_mask_current_pos_ext_size
251 & (current_pos_ext.
start - preceding + 1)));
253 = (~isign_mask_current_pos_ext_size & base_ext.
stride)
254 | (isign_mask_current_pos_ext_size & -base_ext.
stride);
255 dt_stripes[num_dt_stripes++] = derived_ext;
257 += (~isign_mask_current_pos_ext_size & -derived_ext.size)
258 | (isign_mask_current_pos_ext_size & derived_ext.size);
259 current_pos_ext.
start += derived_ext.size;
260 }
while ((abs(current_pos_ext.
size) > 0)
261 & (num_dt_stripes < size_dt_stripes));
264 if (abs(current_pos_ext.
size) > 0)
267 }
while (++i < num_transfer_pos_ext);
270 base_datatype, comm);
275 return MPI_DATATYPE_NULL;
282 MPI_Datatype base_datatype,
289 =
xmalloc(((
size_t)num_ext + 1) *
sizeof (psum_ext_size[0]));
290 psum_ext_size[0] = 0;
291 for (
size_t i = 0; i < (size_t)num_ext; ++i)
292 psum_ext_size[i + 1] = psum_ext_size[i] + extents[i].
size;
297 const struct Xt_pos_ext *curr_transfer_pos_ext
299 int curr_num_transfer_pos_ext
304 curr_transfer_pos_ext,
305 num_ext, extents, psum_ext_size,
306 base_datatype, comm);
322 MPI_Datatype datatype)
325 num_dst_ext, dst_extents, datatype,
335 MPI_Datatype datatype,
346 size_t nmsg = (size_t)nrecv + (
size_t)nsend;
348 *send_msgs = msgs, *recv_msgs = msgs + nsend;
360 nsend, nrecv, send_msgs, recv_msgs, comm, config);
373 if (num_blocks > 0) {
375 for (
size_t i = 0; i < num_blocks; ++i) {
376 block_offsets[i] = accum;
377 accum += block_sizes[i];
384 const int *block_offsets,
const int *block_sizes,
385 MPI_Datatype base_datatype,
MPI_Comm comm) {
387 assert(block_sizes && block_offsets);
389 int *bdispl_vec =
xmalloc(2 * (
size_t)num_transfer_pos *
sizeof(*bdispl_vec)),
390 *blen_vec = bdispl_vec + num_transfer_pos;
392 for (
int i = 0; i < num_transfer_pos; ++i) {
393 int j = transfer_pos[i];
394 bdispl_vec[i] = block_offsets[j];
395 blen_vec[i] = block_sizes[j];
400 num_transfer_pos, base_datatype, comm);
409 const int *block_offsets,
410 const int *block_sizes,
int **aux_offsets,
412 MPI_Datatype base_datatype,
417 const int *block_offsets_;
419 block_offsets_ = block_offsets;
421 block_offsets_ = *aux_offsets
422 =
xrealloc(*aux_offsets, num_blocks *
sizeof(*block_offsets_));
427 = *msgs =
xmalloc((
size_t)num_msgs *
sizeof(**msgs));
434 block_offsets_, block_sizes, base_datatype,
447 const int *src_block_offsets,
448 const int *src_block_sizes,
450 const int *dst_block_offsets,
451 const int *dst_block_sizes,
456 xmap, src_block_offsets, src_block_sizes, src_block_num, dst_block_offsets,
463 const int *src_block_offsets,
464 const int *src_block_sizes,
466 const int *dst_block_offsets,
467 const int *dst_block_sizes,
478 assert(src_block_sizes && dst_block_sizes);
488 int *aux_offsets = NULL;
496 if (dst_block_num < max_dst_pos)
497 die(
"xt_redist_p2p_blocks_off_new: dst_block_num too small");
500 &aux_offsets, (
size_t)dst_block_num,
507 if (src_block_num < max_src_pos)
508 die(
"xt_redist_p2p_blocks_off_new: src_block_num too small");
511 &aux_offsets, (
size_t)src_block_num,
519 nsend, nrecv, send_msgs, recv_msgs, comm, config);
528 const int *src_block_sizes,
530 const int *dst_block_sizes,
535 xmap, src_block_sizes, src_block_num, dst_block_sizes, dst_block_num,
541 const int *src_block_sizes,
int src_block_num,
542 const int *dst_block_sizes,
int dst_block_num,
547 xmap, NULL, src_block_sizes, src_block_num,
548 NULL, dst_block_sizes, dst_block_num,
datatype, config);
add versions of standard API functions not returning on error
#define xrealloc(ptr, size)
static int isign_mask(int x)
static int imin(int a, int b)
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)
MPI_Datatype xt_mpi_generate_datatype(int const *displacements, int count, MPI_Datatype old_type, MPI_Comm comm)
MPI_Datatype xt_mpi_generate_datatype_stripe(const struct Xt_offset_ext *v, int count, MPI_Datatype old_type, MPI_Comm comm)
MPI_Datatype xt_mpi_generate_datatype_block(const int *displacements, const int *blocklengths, int count, MPI_Datatype old_type, MPI_Comm comm)
redistribution of data, non-public declarations
static void xt_redist_msgs_free(size_t n, struct Xt_redist_msg *msgs, MPI_Comm comm)
static void generate_msg_infos(int num_msgs, Xt_xmap_iter iter, const int *offsets, MPI_Datatype base_datatype, struct Xt_redist_msg *msgs, MPI_Comm comm)
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)
static struct ext_disp pos2disp2(int pos, int num_ext, const struct Xt_offset_ext extents[], const int psum_ext_size[], int start_ext)
static MPI_Datatype generate_ext_datatype(int num_transfer_pos_ext, const struct Xt_pos_ext transfer_pos_ext[], int num_ext, const struct Xt_offset_ext extents[], const int psum_ext_size[], MPI_Datatype base_datatype, MPI_Comm comm)
static struct ext_disp pos2disp(int pos, int num_ext, const struct Xt_offset_ext extents[], const int psum_ext_size[])
Xt_redist xt_redist_p2p_ext_new(Xt_xmap xmap, int num_src_ext, const struct Xt_offset_ext src_extents[], int num_dst_ext, const struct Xt_offset_ext dst_extents[], MPI_Datatype datatype)
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)
static MPI_Datatype generate_datatype(const int *transfer_pos, int num_transfer_pos, const int *offsets, MPI_Datatype base_datatype, MPI_Comm comm)
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)
static void generate_ext_msg_infos(int num_msgs, Xt_xmap_iter iter, int num_ext, const struct Xt_offset_ext extents[], MPI_Datatype base_datatype, struct Xt_redist_msg *msgs, MPI_Comm comm)
static void aux_gen_simple_block_offsets(int block_offsets[], const int block_sizes[], size_t num_blocks)
static MPI_Datatype generate_block_datatype(const int *transfer_pos, int num_transfer_pos, const int *block_offsets, const int *block_sizes, MPI_Datatype base_datatype, MPI_Comm comm)
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, MPI_Datatype base_datatype, struct Xt_redist_msg **msgs, MPI_Comm comm)
Xt_redist xt_redist_p2p_ext_custom_new(Xt_xmap xmap, int num_src_ext, const struct Xt_offset_ext src_extents[], int num_dst_ext, const struct Xt_offset_ext dst_extents[], MPI_Datatype datatype, Xt_config config)
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)
int xt_xmap_iterator_get_num_transfer_pos_ext(Xt_xmap_iter iter)
int const * xt_xmap_iterator_get_transfer_pos(Xt_xmap_iter iter)
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)
const struct Xt_pos_ext * xt_xmap_iterator_get_transfer_pos_ext(Xt_xmap_iter iter)
Xt_xmap_iter xt_xmap_get_in_iterator(Xt_xmap xmap)
MPI_Comm xt_xmap_get_communicator(Xt_xmap xmap)
int xt_xmap_get_max_src_pos(Xt_xmap xmap)
int xt_xmap_iterator_get_num_transfer_pos(Xt_xmap_iter iter)