70 const int *offsets, MPI_Datatype base_datatype,
MPI_Comm comm)
76 int * tmp_displ = NULL;
78 if (offsets != NULL) {
80 tmp_displ =
xmalloc((
size_t)num_transfer_pos *
sizeof(
int));
82 for (
int i = 0; i < num_transfer_pos; ++i)
83 tmp_displ[i] = offsets[transfer_pos[i]];
108 = *msgs =
xmalloc((
size_t)num_msgs *
sizeof(**msgs));
117 offsets, base_datatype, comm);
126 const int *dst_offsets, MPI_Datatype
datatype) {
163 const int psum_ext_size[])
168 while (j < num_ext && pos >= psum_ext_size[j + 1])
170 int disp = extents[j].start + (pos - psum_ext_size[j]) * extents[j].stride;
176 const int psum_ext_size[], int start_ext)
179 if (pos < psum_ext_size[j + 1] && pos >= psum_ext_size[j])
181 else if (pos < psum_ext_size[j + 1])
184 while (j < start_ext && pos >= psum_ext_size[j + 1])
188 while (j < num_ext && pos >= psum_ext_size[j + 1])
190 int disp = extents[j].start + (pos - psum_ext_size[j]) * extents[j].stride;
198 const int psum_ext_size[],
199 MPI_Datatype base_datatype,
MPI_Comm comm)
201 if (num_transfer_pos_ext > 0)
203 size_t size_dt_stripes = 8, num_dt_stripes = 0;
205 =
xmalloc(size_dt_stripes *
sizeof (*dt_stripes));
209 num_ext, extents, psum_ext_size).
ext_idx;
212 struct Xt_pos_ext current_pos_ext = transfer_pos_ext[i];
213 if (num_dt_stripes >= size_dt_stripes)
216 size_dt_stripes *= 2;
218 size_dt_stripes *
sizeof (*dt_stripes));
223 num_ext, extents, psum_ext_size,
225 search_start_ext = pos.
ext_idx;
228 int preceding = psum_ext_size[pos.
ext_idx];
230 = base_ext.
start + ((current_pos_ext.
start - preceding)
232 int isign_mask_current_pos_ext_size =
isign_mask(current_pos_ext.
size);
238 derived_ext.size =
imin(abs(current_pos_ext.
size),
239 (~isign_mask_current_pos_ext_size
241 - (current_pos_ext.
start - preceding)))
242 | (isign_mask_current_pos_ext_size
243 & (current_pos_ext.
start - preceding + 1)));
245 = (~isign_mask_current_pos_ext_size & base_ext.
stride)
246 | (isign_mask_current_pos_ext_size & -base_ext.
stride);
247 dt_stripes[num_dt_stripes++] = derived_ext;
249 += (~isign_mask_current_pos_ext_size & -derived_ext.size)
250 | (isign_mask_current_pos_ext_size & derived_ext.size);
251 current_pos_ext.
start += derived_ext.size;
252 }
while ((abs(current_pos_ext.
size) > 0)
253 & (num_dt_stripes < size_dt_stripes));
256 if (abs(current_pos_ext.
size) > 0)
259 }
while (++i < num_transfer_pos_ext);
262 base_datatype, comm);
267 return MPI_DATATYPE_NULL;
274 MPI_Datatype base_datatype,
284 *msgs =
xmalloc((
size_t)num_msgs *
sizeof(**msgs));
288 =
xmalloc(((
size_t)num_ext + 1) *
sizeof (psum_ext_size[0]));
289 psum_ext_size[0] = 0;
290 for (
size_t i = 0; i < (size_t)num_ext; ++i)
291 psum_ext_size[i + 1] = psum_ext_size[i] + extents[i].size;
295 const struct Xt_pos_ext *curr_transfer_pos_ext
297 int curr_num_transfer_pos_ext
302 num_ext, extents, psum_ext_size,
303 base_datatype, comm);
317 MPI_Datatype datatype)
329 datatype, &recv_msgs, comm);
335 datatype, &send_msgs, comm);
350 if (num_blocks > 0) {
351 block_offsets[0] = 0;
352 for (
size_t i = 1; i < num_blocks; ++i)
353 block_offsets[i] = block_offsets[i-1] + block_sizes[i-1];
359 const int *block_offsets,
const int *block_sizes,
360 MPI_Datatype base_datatype,
MPI_Comm comm) {
362 assert(block_sizes != NULL);
365 =
xmalloc(2 * (
size_t)num_transfer_pos *
sizeof(*bdispl_vec)),
366 *blen_vec = bdispl_vec + num_transfer_pos;
367 assert(block_offsets);
369 for (
int i = 0; i < num_transfer_pos; ++i) {
370 int j = transfer_pos[i];
371 bdispl_vec[i] = block_offsets[j];
372 blen_vec[i] = block_sizes[j];
377 num_transfer_pos, base_datatype, comm);
384 #if defined (__PGIC__) && (__PGIC__ == 15 && __PGIC_MINOR__ == 4) 385 #pragma routine novector 389 const int *block_offsets,
390 const int *block_sizes,
int **aux_offsets,
392 MPI_Datatype base_datatype,
397 const int *block_offsets_;
399 block_offsets_ = block_offsets;
401 block_offsets_ = *aux_offsets
402 =
xrealloc(*aux_offsets, num_blocks *
sizeof(*block_offsets_));
407 = *msgs =
xmalloc((
size_t)num_msgs *
sizeof(**msgs));
414 block_offsets_, block_sizes, base_datatype,
427 const int *src_block_offsets,
428 const int *src_block_sizes,
430 const int *dst_block_offsets,
431 const int *dst_block_sizes,
438 if (!src_block_sizes)
439 die(
"xt_redist_p2p_blocks_off_new: undefined src_block_sizes");
440 if (!dst_block_sizes)
441 die(
"xt_redist_p2p_blocks_off_new: undefined dst_block_sizes");
451 int *aux_offsets = NULL;
458 if (dst_block_num < max_dst_pos)
459 die(
"xt_redist_p2p_blocks_off_new: dst_block_num too small");
461 &aux_offsets, (
size_t)dst_block_num,
462 datatype, &recv_msgs, comm);
467 if (src_block_num < max_src_pos)
468 die(
"xt_redist_p2p_blocks_off_new: src_block_num too small");
470 &aux_offsets, (
size_t)src_block_num,
471 datatype, &send_msgs, comm);
483 const int *src_block_sizes,
485 const int *dst_block_sizes,
490 NULL, src_block_sizes, src_block_num,
491 NULL, dst_block_sizes, dst_block_num,
Xt_xmap_iter xt_xmap_get_out_iterator(Xt_xmap xmap)
int xt_xmap_get_num_sources(Xt_xmap xmap)
redistribution of data, non-public declarations
static int imin(int a, int b)
add versions of standard API functions not returning on error
const struct Xt_pos_ext * xt_xmap_iterator_get_transfer_pos_ext(Xt_xmap_iter iter)
int xt_xmap_get_max_dst_pos(Xt_xmap xmap)
int xt_xmap_iterator_get_num_transfer_pos(Xt_xmap_iter iter)
int xt_xmap_iterator_get_num_transfer_pos_ext(Xt_xmap_iter iter)
void xt_xmap_iterator_delete(Xt_xmap_iter iter)
static void aux_gen_simple_block_offsets(int block_offsets[], const int block_sizes[], size_t num_blocks)
Xt_redist xt_redist_p2p_new(Xt_xmap xmap, MPI_Datatype datatype)
static struct ext_disp pos2disp2(int pos, int num_ext, const struct Xt_offset_ext extents[], const int psum_ext_size[], int start_ext)
#define xrealloc(ptr, size)
exchange map declarations
Xt_redist xt_redist_p2p_off_new(Xt_xmap xmap, const int *src_offsets, const int *dst_offsets, MPI_Datatype datatype)
int xt_xmap_iterator_get_rank(Xt_xmap_iter iter)
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)
static int isign_mask(int x)
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)
Xt_redist xt_redist_single_array_base_new(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm)
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_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)
int xt_xmap_get_num_destinations(Xt_xmap xmap)
static MPI_Datatype generate_datatype(const int *transfer_pos, int num_transfer_pos, const int *offsets, MPI_Datatype base_datatype, MPI_Comm comm)
Xt_xmap_iter xt_xmap_get_in_iterator(Xt_xmap xmap)
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)
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(int const *displacements, int count, MPI_Datatype old_type, 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)
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)
int const * xt_xmap_iterator_get_transfer_pos(Xt_xmap_iter iter)
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 struct ext_disp pos2disp(int pos, int num_ext, const struct Xt_offset_ext extents[], const int psum_ext_size[])
MPI_Comm xt_xmap_get_communicator(Xt_xmap xmap)
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)
int xt_xmap_iterator_next(Xt_xmap_iter iter)
MPI_Datatype xt_mpi_generate_datatype_block(const int *displacements, const int *blocklengths, int count, MPI_Datatype old_type, MPI_Comm comm)
int xt_xmap_get_max_src_pos(Xt_xmap xmap)