Yet Another eXchange Tool  0.9.0
Functions
xt_xmap_dist_dir_common.c File Reference

Implementation of uitlity functions for creation of distributed directories. More...

#include <string.h>
#include <assert.h>
#include "core/ppm_xfuncs.h"
#include "xt/xt_idxstripes.h"
#include "xt/xt_mpi.h"
#include "xt/xt_xmap_dist_dir.h"
#include "xt/xt_xmap_dist_dir_intercomm.h"
#include "xt_arithmetic_util.h"
#include "xt_xmap_dist_dir_common.h"
#include "ensure_array_size.h"
#include "xt_idxstripes_internal.h"
Include dependency graph for xt_xmap_dist_dir_common.c:

Go to the source code of this file.

Functions

void xt_xmdd_free_dist_dir (struct dist_dir *dist_dir)
 
Xt_idxlist xt_xmap_dist_dir_get_bucket (const struct bucket_params *bucket_params, struct Xt_stripe **stripes_, size_t *stripes_array_size, int dist_dir_rank)
 generates the buckets of the distributed directory More...
 
struct Xt_xmdd_txstat xt_xmap_dist_dir_send_intersections (void *restrict send_buffer, size_t send_size_asize, size_t send_size_entry, int tag, MPI_Comm comm, int rank_lim, MPI_Request *restrict requests, const int(*send_size)[send_size_asize])
 
size_t xt_xmap_dist_dir_match_src_dst (const struct dist_dir *src_dist_dir, const struct dist_dir *dst_dist_dir, struct isect **src_dst_intersections)
 
size_t xt_xmap_dist_dir_pack_intersections (enum xt_xmdd_direction target, size_t num_intersections, const struct isect *restrict src_dst_intersections, bool isect_idxlist_delete, size_t send_size_asize, size_t send_size_idx, int(*send_size)[send_size_asize], unsigned char *buffer, size_t buf_size, size_t *ofs, MPI_Comm comm)
 
static int stripe_cmp (const void *a, const void *b)
 
void xt_xmap_dist_dir_same_rank_merge (struct dist_dir **dist_dir_results)
 
int xt_xmdd_cmp_isect_src_rank (const void *a_, const void *b_)
 
int xt_xmdd_cmp_isect_dst_rank (const void *a_, const void *b_)
 
int xt_com_list_rank_cmp (const void *a_, const void *b_)
 
Xt_xmap xt_xmap_dist_dir_new (Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
 

Detailed Description

Implementation of uitlity functions for creation of distributed directories.

Author
Jörg Behrens behre.nosp@m.ns@d.nosp@m.krz.d.nosp@m.e Moritz Hanke hanke.nosp@m.@dkr.nosp@m.z.de Thomas Jahns jahns.nosp@m.@dkr.nosp@m.z.de

Definition in file xt_xmap_dist_dir_common.c.

Function Documentation

◆ stripe_cmp()

static int stripe_cmp ( const void *  a,
const void *  b 
)
static

Definition at line 278 of file xt_xmap_dist_dir_common.c.

Here is the caller graph for this function:

◆ xt_com_list_rank_cmp()

int xt_com_list_rank_cmp ( const void *  a_,
const void *  b_ 
)

Definition at line 358 of file xt_xmap_dist_dir_common.c.

Here is the caller graph for this function:

◆ xt_xmap_dist_dir_get_bucket()

Xt_idxlist xt_xmap_dist_dir_get_bucket ( const struct bucket_params bucket_params,
struct Xt_stripe **  stripes_,
size_t *  stripes_array_size,
int  dist_dir_rank 
)

generates the buckets of the distributed directory

The buckets of the distributed directory are computed as follows:

  • compute sum of the sizes of all src_idxlist's and round to next multiple of comm_size -> global_interval
  • local_interval_size = global_interval / comm_size
  • local_interval_start = rank * local_interval_size
  • local_interval_end = (rank + 1) * local_interval_size
  • local_interval = $[local_interval_start,local_interval_end)$
  • bucket of each rank is the set of stripes that is defined as: stripe[i].start = start + rank*local_interval_start + i*global_interval stripe[i].stride = 1; stripe[i].nstrides = (int)local_interval; with i in [0,num_stripes) bucket[rank] = xt_idxstripes_new(stripes, num_stripes);
  • num_stripes and start are choosen such that: start + local_interval > get_min_idxlist_index(src_idxlist, dst_idxlist) (which implies for rank 0 stripe[0].start <= get_min_idxlist_index(src_idxlist, dst_idxlist)) where start = global_interval * k, k is minimal and start + num_stripes*global_interval > get_max_idxlist_index(src_idxlist, dst_idxlist); i.e. local_interval is replicated modulo global_interval for the whole range of indices.
Parameters
[in]bucket_paramsthe parameters
[out]stripes_pointer to pointer of array of the stripes describing the bucket for rank dist_dir_rank. Must point to a pointer allocated by malloc or related and will be resized if necessary.
[in,out]stripes_array_sizenumber of stripes stored in stripes_
[in]dist_dir_rankrank for which to compute bucket
Returns
newly created bucket. The bucket must not be longer lived than the dynamic memory referenced by stripes_ .

Definition at line 116 of file xt_xmap_dist_dir_common.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xt_xmap_dist_dir_match_src_dst()

size_t xt_xmap_dist_dir_match_src_dst ( const struct dist_dir src_dist_dir,
const struct dist_dir dst_dist_dir,
struct isect **  src_dst_intersections 
)

Definition at line 196 of file xt_xmap_dist_dir_common.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xt_xmap_dist_dir_new()

Xt_xmap xt_xmap_dist_dir_new ( Xt_idxlist  src_idxlist,
Xt_idxlist  dst_idxlist,
MPI_Comm  comm 
)

Construct an exchange map.
This operation is collective over all processes in comm.
It uses a distributed directory to reduce communication and computation during the initialisation at the cost of some extra latency because more network transfers than for xt_xmap_all2all_new are required.

Parameters
[in]src_idxlistsource index list
[in]dst_idxlistdestination index list
[in]commMPI communicator that contains all processes that take part in the exchange (xt_xmap_dist_dir_new will make its own copy of comm)

Definition at line 366 of file xt_xmap_dist_dir_common.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xt_xmap_dist_dir_pack_intersections()

size_t xt_xmap_dist_dir_pack_intersections ( enum xt_xmdd_direction  target,
size_t  num_intersections,
const struct isect *restrict  src_dst_intersections,
bool  isect_idxlist_delete,
size_t  send_size_asize,
size_t  send_size_idx,
int(*)  send_size[send_size_asize],
unsigned char *  buffer,
size_t  buf_size,
size_t *  ofs,
MPI_Comm  comm 
)

Definition at line 232 of file xt_xmap_dist_dir_common.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xt_xmap_dist_dir_same_rank_merge()

void xt_xmap_dist_dir_same_rank_merge ( struct dist_dir **  dist_dir_results)

Definition at line 294 of file xt_xmap_dist_dir_common.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xt_xmap_dist_dir_send_intersections()

struct Xt_xmdd_txstat xt_xmap_dist_dir_send_intersections ( void *restrict  send_buffer,
size_t  send_size_asize,
size_t  send_size_entry,
int  tag,
MPI_Comm  comm,
int  rank_lim,
MPI_Request *restrict  requests,
const int(*)  send_size[send_size_asize] 
)

Definition at line 116 of file xt_xmap_dist_dir_common.c.

Here is the caller graph for this function:

◆ xt_xmdd_cmp_isect_dst_rank()

int xt_xmdd_cmp_isect_dst_rank ( const void *  a_,
const void *  b_ 
)

Definition at line 350 of file xt_xmap_dist_dir_common.c.

Here is the caller graph for this function:

◆ xt_xmdd_cmp_isect_src_rank()

int xt_xmdd_cmp_isect_src_rank ( const void *  a_,
const void *  b_ 
)

Definition at line 342 of file xt_xmap_dist_dir_common.c.

Here is the caller graph for this function:

◆ xt_xmdd_free_dist_dir()

void xt_xmdd_free_dist_dir ( struct dist_dir dist_dir)

Definition at line 66 of file xt_xmap_dist_dir_common.c.

Here is the call graph for this function:
Here is the caller graph for this function: