67 return exchanger->
vtable->
copy(exchanger, new_comm, new_tag_offset);
82 int rank_a = *(
const int *)msg_a;
83 int rank_b = *(
const int *)msg_b;
84 return ( rank_a - rank_b );
90 int comm_rank, comm_size;
91 MPI_Comm_rank(comm, &comm_rank);
92 MPI_Comm_size(comm, &comm_size);
102 unsigned char *msgs_ = (
unsigned char *)msgs;
104 for (
size_t i = 0; i < n; ++i) {
105 int *p = (
int *)(
void *)(msgs_ + i * msg_type_size),
107 if (r <= comm_rank) *p = r + comm_size;
111 for (
size_t i = 0; i < n; ++i) {
112 int *p = (
int *)(
void *)(msgs_ + i * msg_type_size),
114 if (r >= comm_size) *p = r - comm_size;
void xt_exchanger_s_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data)
void(* s_exchange)(Xt_exchanger, const void *, void *)
struct Xt_exchanger_ * Xt_exchanger
MPI_Datatype(* get_MPI_Datatype)(Xt_exchanger, int, enum xt_msg_direction)
Xt_exchanger xt_exchanger_mix_isend_irecv_new(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset)
int(* get_msg_ranks)(Xt_exchanger, enum xt_msg_direction, int **)
void(* delete)(Xt_exchanger)
int xt_exchanger_get_msg_ranks(Xt_exchanger exchanger, enum xt_msg_direction direction, int **ranks)
Xt_exchanger xt_exchanger_copy(Xt_exchanger exchanger, MPI_Comm new_comm, int new_tag_offset)
Xt_exchanger(* copy)(Xt_exchanger, MPI_Comm, int)
Xt_exchanger(* xt_exchanger_default_constructor)(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset)
struct xt_exchanger_vtable * vtable
void xt_exchanger_delete(Xt_exchanger exchanger)
void xt_exchanger_internal_optimize(size_t n, void *msgs, size_t msg_type_size, MPI_Comm comm)
exchanging of data based on information provided by redist's
static int compare_exchange_messages(const void *msg_a, const void *msg_b)
MPI_Datatype xt_exchanger_get_MPI_Datatype(Xt_exchanger exchanger, int rank, enum xt_msg_direction direction)