66#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
67#pragma GCC diagnostic push
68#pragma GCC diagnostic ignored "-Wstringop-overread"
69#pragma GCC diagnostic ignored "-Wstringop-overflow"
78 MPI_Request *recv_request)
80 for (
int i = 0; i < nrecv; ++i)
81 xt_mpi_call(MPI_Irecv(dst_data, 1, recv_msgs[i].datatype,
84 recv_request+i), comm);
86 for (
int i = 0; i < nsend; ++i)
87 xt_mpi_call(MPI_Send(CAST_MPI_SEND_BUF(src_data), 1, send_msgs[i].datatype,
92 xt_mpi_call(MPI_Waitall(nrecv, recv_request, MPI_STATUSES_IGNORE), comm);
103 MPI_Request *recv_request
104 =
xmalloc((
size_t)nrecv *
sizeof (*recv_request));
108 send_msgs, recv_msgs,
117xt_exchanger_irecv_send_s_exchange_mt(
const void *src_data,
void *dst_data,
118 int nsend,
int nrecv,
124 MPI_Request *recv_request
126 int num_threads = omp_get_num_threads(),
127 tid = omp_get_thread_num();
128 int start_send = (nsend * tid) / num_threads,
129 nsend_ = (nsend * (tid+1)) / num_threads - start_send,
130 start_recv = (nrecv * tid) / num_threads,
131 nrecv_ = (nrecv * (tid+1)) / num_threads - start_recv;
135 send_msgs+start_send,
136 recv_msgs+start_recv,
138 recv_request+start_recv);
142xt_exchanger_irecv_send_s_exchange_omp(
const void *src_data,
void *dst_data,
143 int nsend,
int nrecv,
153 xt_exchanger_irecv_send_s_exchange_mt(src_data, dst_data,
155 send_msgs, recv_msgs,
167 int nsend,
int nrecv,
192 s_exch_by_mthread_mode[] = {
195 xt_exchanger_irecv_send_s_exchange_omp,
202 nsend, nrecv, send_msgs, recv_msgs,
204 s_exch_by_mthread_mode[mthread_mode], 0,
add versions of standard API functions not returning on error
struct Xt_config_ xt_default_config
void xt_config_set_redist_mthread_mode(Xt_config config, int mode)
struct Xt_config_ * Xt_config
int xt_config_get_redist_mthread_mode(Xt_config config)
implementation of configuration object
struct Xt_exchanger_omp_share_ * Xt_exchanger_omp_share
struct Xt_exchanger_ * Xt_exchanger
Xt_exchanger xt_exchanger_irecv_send_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
static void xt_exchanger_irecv_send_s_exchange_(const void *src_data, void *dst_data, int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, int tag_offset, MPI_Comm comm, MPI_Request *recv_request)
static void xt_exchanger_irecv_send_s_exchange(const void *src_data, void *dst_data, int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, int tag_offset, MPI_Comm comm)
static Xt_exchanger_omp_share xt_exchanger_irecv_send_create_omp_share(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm)
Xt_exchanger xt_exchanger_simple_base_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, xt_simple_s_exchange_func s_func, xt_simple_a_exchange_func a_func, xt_simple_create_omp_share_func create_omp_share_func, Xt_config config)
void(* xt_simple_s_exchange_func)(const void *src_data, void *dst_data, int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, int tag_offset, MPI_Comm comm)
#define xt_mpi_call(call, comm)
@ xt_mpi_tag_exchange_msg
redistribution of data, non-public declarations
struct Xt_request_ * Xt_request
MPI_Request * xt_request_msgs_get_req_ptr(Xt_request request)
Xt_request xt_request_msgs_alloc(int n, MPI_Comm comm, Xt_config config)
internal interfaces for xt_request_msgs