64 MPI_Request * requests =
65 xmalloc((
size_t)(nrecv + nsend) *
sizeof (*requests));
67 xmalloc((
size_t)(nrecv + nsend) *
sizeof (*buffers));
70 for (
int i = 0; i < nrecv; ++i) {
73 buffers[i] =
xmalloc((
size_t)buffer_size);
74 xt_mpi_call(MPI_Irecv(buffers[i], buffer_size, MPI_PACKED,
80 for (
int i = 0; i < nsend; ++i) {
84 buffers[nrecv + i] =
xmalloc((
size_t)buffer_size);
85 xt_mpi_call(MPI_Pack((
void*)src_data, 1, send_msgs[i].datatype,
86 buffers[nrecv + i], buffer_size, &position,
88 xt_mpi_call(MPI_Isend(buffers[nrecv + i], buffer_size, MPI_PACKED,
91 requests+nrecv+i), comm);
94 xt_mpi_call(MPI_Waitall(nrecv + nsend, requests, MPI_STATUSES_IGNORE), comm);
96 for (
int i = 0; i < nrecv; ++i) {
100 xt_mpi_call(MPI_Unpack(buffers[i], buffer_size, &position, dst_data,
101 1, recv_msgs[i].datatype, comm), comm);
104 for (
int i = 0; i < nsend + nrecv; ++i)
redistribution of data, non-public declarations
Xt_exchanger xt_exchanger_simple_base_new(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, xt_simple_exchange_func func)
add versions of standard API functions not returning on error
Xt_exchanger xt_exchanger_irecv_isend_packed_new(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset)
static void xt_exchanger_irecv_isend_packed_s_exchange(const void *src_data, void *dst_data, int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, int tag_offset, MPI_Comm comm)
#define xt_mpi_call(call, comm)