72static void xt_request_msgs_wait_omp(
Xt_request request);
73static int xt_request_msgs_test_omp(
Xt_request request);
82 , request_msgs_auto_omp_vtable = {
83 .wait = xt_request_msgs_wait_omp,
84 .test = xt_request_msgs_test_omp,
103 =
xmalloc(
sizeof(*request) + (
size_t)n *
sizeof(MPI_Request) +
104 (
size_t)n *
sizeof(
int));
110 request->
vtable = &request_msgs_auto_omp_vtable;
115 request->
comm = comm;
122 const MPI_Request requests[n],
130 const MPI_Request requests[n],
138 memcpy(request->
requests, requests, (
size_t)n *
sizeof(*request->
requests));
149 || request->
vtable == &request_msgs_auto_omp_vtable);
161#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
164#pragma GCC diagnostic push
165#pragma GCC diagnostic ignored "-Wstringop-overread"
166#pragma GCC diagnostic ignored "-Wstringop-overflow"
169 MPI_STATUSES_IGNORE), request_msgs->
comm);
170#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
171#pragma GCC diagnostic pop
181 size_t n = (size_t)request_msgs->
n;
182 int *ops_completed_buffer = (
int *)(request_msgs->
requests + n);
184 ops_completed_buffer, request_msgs->
comm);
186 if (flag) free(request_msgs);
199#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
202#pragma GCC diagnostic push
203#pragma GCC diagnostic ignored "-Wstringop-overread"
204#pragma GCC diagnostic ignored "-Wstringop-overflow"
206 int num_threads = omp_get_num_threads(),
207 tid = omp_get_thread_num();
208 int nreq = request_msgs->
n,
209 start_req = (nreq * tid) / num_threads,
210 nreq_ = (nreq * (tid+1)) / num_threads - start_req;
212 MPI_STATUSES_IGNORE), request_msgs->
comm);
213#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
214#pragma GCC diagnostic pop
225#pragma omp parallel reduction(&: flag)
228 size_t n = (size_t)request_msgs->
n;
229 int *ops_completed_buffer = (
int *)(request_msgs->
requests + n);
231 flag &= xt_mpi_test_some_mt(&request_msgs->
n, request_msgs->
requests,
232 ops_completed_buffer, request_msgs->
comm);
234 if (flag) free(request);
add versions of standard API functions not returning on error
const struct Xt_request_vtable * vtable
const struct Xt_request_vtable * vtable
struct Xt_config_ xt_default_config
opaque configuration object for settings where the default needs to be overridden
struct Xt_config_ * Xt_config
int xt_config_get_redist_mthread_mode(Xt_config config)
implementation of configuration object
bool xt_mpi_test_some(int *restrict num_req, MPI_Request *restrict req, int *restrict ops_completed, MPI_Comm comm)
#define xt_mpi_call(call, comm)
struct Xt_request_ * Xt_request
Provide non-public declarations common to all requests.
static int xt_request_msgs_test(Xt_request request)
Xt_request xt_request_msgs_custom_new(int n, const MPI_Request requests[n], MPI_Comm comm, Xt_config config)
MPI_Request * xt_request_msgs_get_req_ptr(Xt_request request)
static const struct Xt_request_vtable request_msgs_vtable
static void xt_request_msgs_wait(Xt_request request)
Xt_request xt_request_msgs_alloc(int n, MPI_Comm comm, Xt_config config)
Xt_request xt_request_msgs_new(int n, const MPI_Request requests[n], MPI_Comm comm)
struct Xt_request_msgs_ * Xt_request_msgs
internal interfaces for xt_request_msgs