63 return exchanger->
vtable->
copy(exchanger, new_comm, new_tag_offset);
77 const void *src_data,
void *dst_data,
85 int rank_a = *(
const int *)msg_a;
86 int rank_b = *(
const int *)msg_b;
87 return ( rank_a - rank_b );
93 int comm_size, comm_rank, is_inter;
95 xt_mpi_call(MPI_Comm_test_inter(comm, &is_inter), comm);
96 int (*get_comm_size)(
MPI_Comm,
int *)
97 = is_inter ? MPI_Comm_remote_size : MPI_Comm_size;
108 unsigned char *msgs_ = (
unsigned char *)msgs;
110 for (
size_t i = 0; i < n; ++i) {
111 int *p = (
int *)(
void *)(msgs_ + i * msg_type_size),
113 if (r <= comm_rank) *p = r + comm_size;
117 for (
size_t i = 0; i < n; ++i) {
118 int *p = (
int *)(
void *)(msgs_ + i * msg_type_size),
120 if (r >= comm_size) *p = r - comm_size;
128 int *restrict *ranks)
struct xt_exchanger_vtable * vtable
int(* get_msg_ranks)(Xt_exchanger, enum xt_msg_direction, int *restrict *)
Xt_exchanger(* copy)(Xt_exchanger, MPI_Comm, int)
void(* a_exchange)(Xt_exchanger, const void *, void *, Xt_request *request)
void(* delete)(Xt_exchanger)
MPI_Datatype(* get_MPI_Datatype)(Xt_exchanger, int, enum xt_msg_direction)
void(* s_exchange)(Xt_exchanger, const void *, void *)
static int compare_exchange_messages(const void *msg_a, const void *msg_b)
void xt_exchanger_internal_optimize(size_t n, void *msgs, size_t msg_type_size, MPI_Comm comm)
void xt_exchanger_s_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data)
int xt_exchanger_get_msg_ranks(Xt_exchanger exchanger, enum xt_msg_direction direction, int *restrict *ranks)
void xt_exchanger_a_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data, Xt_request *request)
void xt_exchanger_delete(Xt_exchanger exchanger)
Xt_exchanger xt_exchanger_copy(Xt_exchanger exchanger, MPI_Comm new_comm, int new_tag_offset)
MPI_Datatype xt_exchanger_get_MPI_Datatype(Xt_exchanger exchanger, int rank, enum xt_msg_direction direction)
exchanging of data based on information provided by redist's
#define xt_mpi_call(call, comm)