104 bool *stripify,
MPI_Comm comm,
int comm_size,
107 unsigned long long local_vals[2], global_sums[2];
110 local_vals[0] = num_indices_src;
114 xt_mpi_call(MPI_Allreduce(local_vals, global_sums, 2,
115 MPI_UNSIGNED_LONG_LONG, MPI_SUM, comm), comm);
117 *stripify = global_sums[1] > 0;
118 return (
Xt_int)(
MAX(((global_sums[0] + (
unsigned)comm_size - 1)
119 / (
unsigned)comm_size), 1) * (unsigned)comm_size);
128 min_index = (
Xt_int)
MIN(min_index_a, min_index_b);
138 max_index =
MAX(max_index_a, max_index_b);
153 size_t first_overlapping_bucket = 0;
157 first_overlapping_bucket
161 size_t start_of_non_overlapping_bucket_suffix
165 || start_of_non_overlapping_bucket_suffix > (
size_t)comm_size)
166 start_of_non_overlapping_bucket_suffix = (size_t)comm_size;
176 .most_recent_rank_generated = (int)first_overlapping_bucket - 1,
183#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
184#pragma GCC diagnostic push
185#pragma GCC diagnostic ignored "-Wstringop-overread"
186#pragma GCC diagnostic ignored "-Wstringop-overflow"
195 bool *stripify,
Xt_int interval_size[2],
197 int comm_size,
int remote_size,
202 unsigned long long local_vals[2], global_sums[2][2];
205 local_vals[0] = num_indices_src;
206 local_vals[1] = (num_indices_src > (unsigned)config->
idxv_cnv_size)
209 xt_mpi_call(MPI_Allreduce(local_vals, global_sums[0], 2,
210 MPI_UNSIGNED_LONG_LONG, MPI_SUM,
222 if (comm_rank == 0) {
224 xt_mpi_call(MPI_Sendrecv(global_sums[0], 2, MPI_UNSIGNED_LONG_LONG, 0, tag,
225 global_sums[1], 2, MPI_UNSIGNED_LONG_LONG, 0, tag,
229 xt_mpi_call(MPI_Bcast(global_sums[1], 2, MPI_UNSIGNED_LONG_LONG,
231 *stripify = (global_sums[0][1] > 0 || global_sums[1][1] > 0);
233 = (
Xt_int)(((global_sums[0][0] + (
unsigned)comm_size - 1)
234 / (
unsigned)comm_size) * (
unsigned)comm_size);
236 = (
Xt_int)(((global_sums[1][0] + (
unsigned)remote_size - 1)
237 / (
unsigned)remote_size) * (
unsigned)remote_size);
265 size_t first_overlapping_bucket = 0;
269 first_overlapping_bucket
273 size_t start_of_non_overlapping_bucket_suffix
277 || start_of_non_overlapping_bucket_suffix > (
size_t)comm_size)
278 start_of_non_overlapping_bucket_suffix = (size_t)comm_size;
284 .most_recent_rank_generated = (int)first_overlapping_bucket - 1,
300 bool stripify =
false;
306 Xt_int global_interval_size
308 src_idxlist, dst_idxlist,
309 &stripify, comms->
intra_comm, comm_size, config);
312 src_idxlist, dst_idxlist, comm_size);
314 Xt_int global_interval_size[2];
319 src_idxlist, dst_idxlist,
320 &stripify, global_interval_size,
321 comms, comm_size, remote_size, config);
347 int max_num_intersect = 0;
350 ? &gen_state->
src : &gen_state->dst;
358 return max_num_intersect;
415 long long start_correction
418 = (
Xt_int)((start_correction
432 num_stripes = (int)(((
long long)end - (
long long)start)/
global_interval)
433 + (int)use_start_stripe;
442 for (
int j = 0; j < num_stripes; ++j) {
443 stripes[j].start = (
Xt_int)(
start + j * global_interval);
444 stripes[j].stride = 1;
445 stripes[j].nstrides = (int)local_interval;
464 while (next_rank < max_rank
466 gen_state, params, ++next_rank)))
#define ENSURE_ARRAY_SIZE(arrayp, curr_array_size, req_size)
add versions of standard API functions not returning on error
struct Xt_stripe * stripes
struct bucket_params dst src
Xt_idxlist last_list_generated
size_t stripes_array_size
Xt_int local_index_range_lbound
int most_recent_rank_generated
Xt_int local_index_range_ubound
static long long llsign_mask(long long x)
implementation of configuration object
bool xt_idxlist_is_stripe_conversion_profitable_(Xt_idxlist idxlist, Xt_config config)
Xt_int xt_idxlist_get_min_index(Xt_idxlist idxlist)
Xt_int xt_idxlist_get_max_index(Xt_idxlist idxlist)
void xt_idxlist_delete(Xt_idxlist idxlist)
Provide non-public declarations common to all index lists.
#define xt_idxlist_get_num_indices(idxlist)
Xt_idxlist xt_idxstripes_prealloc_new(const struct Xt_stripe *stripes, int num_stripes)
#define xt_mpi_call(call, comm)
@ xt_mpi_tag_xmap_dist_dir_src_send
@ Xt_dist_dir_bucket_gen_type_send
static Xt_idxlist xt_xmap_dist_dir_get_bucket(struct Xt_xmdd_bucket_gen_cycl_stripe_state *gen_state, struct bucket_params *bucket_params, int dist_dir_rank)
generates the buckets of the distributed directory
static struct bucket_params get_intracomm_bucket_params(Xt_int global_interval, Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, int comm_size)
static Xt_int get_intracomm_dist_dir_global_interval_size(Xt_idxlist src, Xt_idxlist dst, bool *stripify, MPI_Comm comm, int comm_size, Xt_config config)
static Xt_int get_intercomm_max_idxlist_index(Xt_idxlist l)
static void get_intercomm_dist_dir_global_interval_size(Xt_idxlist src, Xt_idxlist dst, bool *stripify, Xt_int interval_size[2], struct Xt_xmdd_bucket_gen_comms *comms, int comm_size, int remote_size, Xt_config config)
static Xt_int get_max_idxlist_index(Xt_idxlist a, Xt_idxlist b)
static struct bucket_params get_intercomm_bucket_params(Xt_idxlist idxlist, Xt_int global_interval, int comm_size)
static Xt_int get_min_idxlist_index(Xt_idxlist a, Xt_idxlist b)
const struct Xt_xmdd_bucket_gen_ Xt_xmdd_cycl_stripe_bucket_gen_desc
static void xt_xmdd_bucket_gen_cycl_stripe_destroy(void *gen_state)
static Xt_int get_intercomm_min_idxlist_index(Xt_idxlist l)
static int xt_xmdd_bucket_gen_cycl_stripe_init(void *gen_state_, Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, Xt_config config, struct Xt_xmdd_bucket_gen_comms *comms, void *init_params)
static int xt_xmdd_bucket_gen_cycl_stripe_get_intersect_max_num(void *gen_state, int type)
static struct Xt_com_list xt_xmdd_cycl_stripe_get_next_bucket(void *gen_state_, int type)
Default bucket generator for creation of distributed directories.
Default bucket generator for creation of distributed directories.
int(* Xt_xmdd_bucket_gen_init_state_internal)(void *gen_state, Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, Xt_config config, const struct Xt_xmdd_bucket_gen_comms *comms, void *init_params, const struct Xt_xmdd_bucket_gen_ *gen)
Utility functions for creation of distributed directories.