Skip to content
Snippets Groups Projects
Commit b41877c1 authored by Joerg Behrens's avatar Joerg Behrens Committed by Moritz Hanke
Browse files

extend redist: single field exchange

parent f353fec5
No related branches found
No related tags found
No related merge requests found
......@@ -11,3 +11,8 @@ void xt_redist_s_exchange(Xt_redist redist, void **src_data, unsigned num_src_ar
redist->vtable->s_exchange(redist, src_data, num_src_arrays, dst_data, num_dst_arrays);
}
void xt_redist_s_exchange1(Xt_redist redist, void *src_data, void *dst_data) {
redist->vtable->s_exchange1(redist, src_data, dst_data);
}
......@@ -14,8 +14,8 @@
struct xt_redist_vtable {
void (*delete)(Xt_redist);
void (*s_exchange)(Xt_redist, void **, unsigned, void **, unsigned);
void (*s_exchange1)(Xt_redist, void *, void *);
};
struct xt_redist {
......@@ -35,10 +35,19 @@ void xt_redist_delete(Xt_redist redist);
* @param[in] redist redistribution structure
* @param[in] src_data array containing the base addresses of the input arrays
* @param[in] num_src_arrays number of base addresses in src_data
* @param[in,out] dst_data array containing the base addresses of the input arrays
* @param[in,out] dst_data array containing the base addresses of the output arrays
* @param[in] num_dst_arrays number of base addresses in dst_data
*/
void xt_redist_s_exchange(Xt_redist redist, void **src_data, unsigned num_src_arrays,
void **dst_data, unsigned num_dst_arrays);
/**
* synchronouse redistribution of data - single array case
*
* @param[in] redist redistribution structure
* @param[in] src_data input array
* @param[in,out] dst_data output array
*/
void xt_redist_s_exchange1(Xt_redist redist, void *src_data, void *dst_data);
#endif // XT_REDIST_H
......@@ -17,8 +17,14 @@ static void
redist_p2p_s_exchange(Xt_redist redist, void **src_data, unsigned num_src_arrays,
void **dst_data, unsigned num_dst_arrays);
static const struct xt_redist_vtable redist_p2p_vtable = {redist_p2p_delete,
redist_p2p_s_exchange};
static void
redist_p2p_s_exchange1(Xt_redist redist, void *src_data, void *dst_data);
static const struct xt_redist_vtable redist_p2p_vtable = {
.delete = redist_p2p_delete,
.s_exchange = redist_p2p_s_exchange,
.s_exchange1 = redist_p2p_s_exchange1
};
struct Xt_redist_p2p_msg {
......@@ -274,12 +280,18 @@ static void
redist_p2p_s_exchange(Xt_redist redist, void **src_data, unsigned num_src_arrays,
void **dst_data, unsigned num_dst_arrays) {
assert(num_src_arrays == 1 && num_dst_arrays == 1);
redist_p2p_s_exchange1(redist, *src_data, *dst_data);
}
static void
redist_p2p_s_exchange1(Xt_redist redist, void *src_data, void *dst_data) {
struct Xt_redist_p2p *redist_p2p;
redist_p2p = (struct Xt_redist_p2p *)redist;
assert(num_src_arrays == 1 && num_dst_arrays == 1);
MPI_Request * recv_request;
recv_request = xmalloc(redist_p2p->ndst * sizeof(*recv_request));
......@@ -287,12 +299,12 @@ redist_p2p_s_exchange(Xt_redist redist, void **src_data, unsigned num_src_arrays
int i;
for (i = 0; i < redist_p2p->ndst; ++i)
mpi_err_handler(MPI_Irecv(dst_data[0], 1, redist_p2p->recv_msgs[i].datatype,
mpi_err_handler(MPI_Irecv(dst_data, 1, redist_p2p->recv_msgs[i].datatype,
redist_p2p->recv_msgs[i].rank, 0, redist_p2p->comm,
recv_request+i), redist_p2p->comm);
for (i = 0; i < redist_p2p->nsrc; ++i)
mpi_err_handler(MPI_Send(src_data[0], 1, redist_p2p->send_msgs[i].datatype,
mpi_err_handler(MPI_Send(src_data, 1, redist_p2p->send_msgs[i].datatype,
redist_p2p->send_msgs[i].rank, 0, redist_p2p->comm),
redist_p2p->comm);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment