67#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
68#pragma GCC diagnostic push
69#pragma GCC diagnostic ignored "-Wstringop-overread"
70#pragma GCC diagnostic ignored "-Wstringop-overflow"
79 MPI_Request *requests)
81 for (
int i = 0; i < nrecv; ++i)
82 xt_mpi_call(MPI_Irecv(dst_data, 1, recv_msgs[i].datatype,
87 for (
int i = 0; i < nsend; ++i)
88 xt_mpi_call(MPI_Isend(CAST_MPI_SEND_BUF(src_data), 1, send_msgs[i].datatype,
91 requests+nrecv+i), comm);
100 MPI_Request *requests
101 =
xmalloc((
size_t)(nrecv + nsend) *
sizeof (*requests));
104 send_msgs, recv_msgs, tag_offset,
106 xt_mpi_call(MPI_Waitall(nrecv + nsend, requests, MPI_STATUSES_IGNORE), comm);
112xt_exchanger_irecv_isend_a_exchange_mt(
const void *src_data,
void *dst_data,
113 int nsend,
int nrecv,
118 MPI_Request *requests
120 int num_threads = omp_get_num_threads(),
121 tid = omp_get_thread_num();
122 int start_send = (nsend * tid) / num_threads,
123 nsend_ = (nsend * (tid+1)) / num_threads - start_send,
124 start_recv = (nrecv * tid) / num_threads,
125 nrecv_ = (nrecv * (tid+1)) / num_threads - start_recv;
129 send_msgs+start_send, recv_msgs+start_recv, tag_offset,
130 comm, requests+start_recv+start_send);
134xt_exchanger_irecv_isend_s_exchange_mt(
const void *src_data,
void *dst_data,
135 int nsend,
int nrecv,
141 int num_threads = omp_get_num_threads(),
142 tid = omp_get_thread_num();
143 xt_exchanger_irecv_isend_a_exchange_mt(src_data, dst_data,
149 MPI_Request *requests
151 int start_send = (nsend * tid) / num_threads,
152 nsend_ = (nsend * (tid+1)) / num_threads - start_send,
153 start_recv = (nrecv * tid) / num_threads,
154 nrecv_ = (nrecv * (tid+1)) / num_threads - start_recv,
155 start_req = start_send+start_recv,
156 nreq_ = nrecv_+nsend_;
158 MPI_STATUSES_IGNORE), comm);
162xt_exchanger_irecv_isend_s_exchange_omp(
const void *src_data,
void *dst_data,
163 int nsend,
int nrecv,
172 xt_exchanger_irecv_isend_s_exchange_mt(src_data, dst_data,
186 int nsend,
int nrecv,
197 MPI_Request *requests
200 send_msgs, recv_msgs, tag_offset, comm, requests);
205xt_exchanger_irecv_isend_a_exchange_omp(
const void *src_data,
void *dst_data,
206 int nsend,
int nrecv,
218 xt_exchanger_irecv_isend_a_exchange_mt(src_data, dst_data,
220 send_msgs, recv_msgs,
228 int nsend,
int nrecv,
237 int nmsg = nsend + nrecv;
254 s_exch_by_mthread_mode[] = {
257 xt_exchanger_irecv_isend_s_exchange_omp,
263 a_exch_by_mthread_mode[] = {
266 xt_exchanger_irecv_isend_a_exchange_omp,
274 s_exch_by_mthread_mode[mthread_mode],
275 a_exch_by_mthread_mode[mthread_mode],
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)
int xt_config_get_redist_mthread_mode(Xt_config config)
implementation of configuration object
struct Xt_exchanger_omp_share_ * Xt_exchanger_omp_share
static Xt_exchanger_omp_share xt_exchanger_irecv_isend_create_omp_share(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm)
static void redist_msgs_to_req(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 *requests)
static void xt_exchanger_irecv_isend_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 void xt_exchanger_irecv_isend_a_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, Xt_request *request)
Xt_exchanger xt_exchanger_irecv_isend_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)
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)
void(* xt_simple_a_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, Xt_request *request)
#define xt_mpi_call(call, comm)
@ xt_mpi_tag_exchange_msg
redistribution of data, non-public declarations
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