61#if __GNUC__ >= 11 && __GNUC__ <= 13 && defined MPICH
62#pragma GCC diagnostic push
63#pragma GCC diagnostic ignored "-Wstringop-overread"
64#pragma GCC diagnostic ignored "-Wstringop-overflow"
69 const void *src_data,
void *dst_data,
81 size_t num_tx = (size_t)nrecv + (
size_t)nsend;
83 requests = requests_auto;
84 buffer_sizes = buffer_sizes_auto;
87 requests =
xmalloc(num_tx *
sizeof (*requests));
88 buffer_sizes =
xmalloc(num_tx *
sizeof (*buffer_sizes));
89 ddts =
xmalloc(num_tx *
sizeof(*ddts));
92 size_t recv_buffer_size = 0;
93 size_t send_buffer_size = 0;
94 for (
int i = 0; i < nrecv; ++i)
99 for (
int i = 0; i < nsend; ++i)
101 ((buffer_sizes[nrecv+i] =
107 unsigned char * send_buffer =
109 unsigned char * recv_buffer =
113 for (
int i = 0; i < nrecv; ++i) {
114 int recv_size = (int)buffer_sizes[i];
115 xt_mpi_call(MPI_Irecv(recv_buffer + ofs, recv_size, MPI_BYTE,
119 ofs += (size_t)recv_size;
123 for (
int i = 0; i < nsend; ++i) {
124 size_t send_size = buffer_sizes[nrecv+i];
126 ddts[nrecv+i], CAST_MPI_SEND_BUF(src_data), send_buffer + ofs,
128 xt_mpi_call(MPI_Isend(send_buffer + ofs, (
int)send_size, MPI_BYTE,
131 requests+nrecv+i), comm);
135 xt_mpi_call(MPI_Waitall(nrecv + nsend, requests, MPI_STATUSES_IGNORE), comm);
138 for (
int i = 0; i < nrecv; ++i) {
139 size_t recv_size = buffer_sizes[i];
141 ddts[i], recv_buffer + ofs, dst_data, dst_data_memtype);
157 int nsend,
int nrecv,
165 MPI_Request * tmp_requests =
166 xmalloc((
size_t)(nrecv + nsend) *
sizeof (*tmp_requests));
168 xmalloc((
size_t)(nrecv + nsend) *
sizeof (*buffers));
173 Xt_ddt * recv_ddts =
xmalloc((
size_t)nrecv *
sizeof(*recv_ddts));
174 for (
int i = 0; i < nrecv; ++i) {
178 xt_mpi_call(MPI_Irecv(buffers[i], (
int)buffer_size, MPI_BYTE,
181 tmp_requests+i), comm);
184 for (
int i = 0; i < nsend; ++i) {
187 buffers[nrecv + i] =
xt_gpu_malloc(buffer_size, src_data_memtype);
191 send_ddt, src_data, buffers[nrecv + i], src_data_memtype);
192 xt_mpi_call(MPI_Isend(buffers[nrecv + i], (
int)buffer_size, MPI_BYTE,
195 tmp_requests+nrecv+i), comm);
200 nrecv + nsend, tmp_requests, comm, nrecv, nsend,
201 recv_ddts, buffers, buffers + nrecv, dst_data,
202 src_data_memtype, dst_data_memtype);
add versions of standard API functions not returning on error
void xt_ddt_unpack_internal(Xt_ddt ddt, const void *src, void *dst, enum xt_memtype memtype)
size_t xt_ddt_get_pack_size_internal(Xt_ddt ddt)
void xt_ddt_pack_internal(Xt_ddt ddt, const void *src, void *dst, enum xt_memtype memtype)
Xt_ddt xt_ddt_from_mpi_ddt(MPI_Datatype mpi_ddt)
internal utility routines for manual handling of MPI DDT's
static void xt_exchanger_irecv_isend_ddt_packed_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_ddt_packed_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_isend_ddt_packed_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)
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)
Xt_exchanger_omp_share(* xt_simple_create_omp_share_func)(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm)
void * xt_gpu_malloc(size_t alloc_size, enum xt_memtype memtype)
enum xt_memtype xt_gpu_get_memtype(const void *ptr)
void xt_gpu_free(void *ptr, enum xt_memtype memtype)
#define XT_GPU_INSTR_PUSH(arg)
#define xt_mpi_call(call, comm)
@ xt_mpi_tag_exchange_msg
redistribution of data, non-public declarations
Xt_request xt_request_msgs_ddt_packed_new(int n_requests, const MPI_Request requests[n_requests], MPI_Comm comm, int n_packed, int n_tmp_buffers, Xt_ddt packed_ddts[n_packed], void *packed_data[n_packed], void *tmp_buffers[n_tmp_buffers], void *dst_data, enum xt_memtype packed_memtype, enum xt_memtype tmp_memtype)