Skip to content
Snippets Groups Projects
Commit fc1831f5 authored by Pedro Gonnet's avatar Pedro Gonnet
Browse files

extend the proxies to handle gparts.

parent 5c8a03e3
No related branches found
No related tags found
2 merge requests!136Master,!117Engine exchange strays
...@@ -195,7 +195,8 @@ void proxy_parts_exch1(struct proxy *p) { ...@@ -195,7 +195,8 @@ void proxy_parts_exch1(struct proxy *p) {
#ifdef WITH_MPI #ifdef WITH_MPI
/* Send the number of particles. */ /* Send the number of particles. */
if (MPI_Isend(&p->nr_parts_out, 1, MPI_INT, p->nodeID, int buff_out[2] = {p->nr_parts_out, p->nr_gparts_out};
if (MPI_Isend(buff_out, 2, MPI_INT, p->nodeID,
p->mynodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD, p->mynodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD,
&p->req_parts_count_out) != MPI_SUCCESS) &p->req_parts_count_out) != MPI_SUCCESS)
error("Failed to isend nr of parts."); error("Failed to isend nr of parts.");
...@@ -210,7 +211,11 @@ void proxy_parts_exch1(struct proxy *p) { ...@@ -210,7 +211,11 @@ void proxy_parts_exch1(struct proxy *p) {
MPI_Isend(p->xparts_out, sizeof(struct xpart) * p->nr_parts_out, MPI_Isend(p->xparts_out, sizeof(struct xpart) * p->nr_parts_out,
MPI_BYTE, p->nodeID, MPI_BYTE, p->nodeID,
p->mynodeID * proxy_tag_shift + proxy_tag_xparts, p->mynodeID * proxy_tag_shift + proxy_tag_xparts,
MPI_COMM_WORLD, &p->req_xparts_out) != MPI_SUCCESS) MPI_COMM_WORLD, &p->req_xparts_out) != MPI_SUCCESS ||
MPI_Isend(p->gparts_out, sizeof(struct gpart) * p->nr_gparts_out,
MPI_BYTE, p->nodeID,
p->mynodeID * proxy_tag_shift + proxy_tag_gparts,
MPI_COMM_WORLD, &p->req_gparts_out) != MPI_SUCCESS)
error("Failed to isend part data."); error("Failed to isend part data.");
// message( "isent particle data (%i) to node %i." , p->nr_parts_out , // message( "isent particle data (%i) to node %i." , p->nr_parts_out ,
// p->nodeID ); fflush(stdout); // p->nodeID ); fflush(stdout);
...@@ -221,10 +226,13 @@ void proxy_parts_exch1(struct proxy *p) { ...@@ -221,10 +226,13 @@ void proxy_parts_exch1(struct proxy *p) {
} }
/* Receive the number of particles. */ /* Receive the number of particles. */
if (MPI_Irecv(&p->nr_parts_in, 1, MPI_INT, p->nodeID, int buff_in[2];
if (MPI_Irecv(buff_in, 2, MPI_INT, p->nodeID,
p->nodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD, p->nodeID * proxy_tag_shift + proxy_tag_count, MPI_COMM_WORLD,
&p->req_parts_count_in) != MPI_SUCCESS) &p->req_parts_count_in) != MPI_SUCCESS)
error("Failed to irecv nr of parts."); error("Failed to irecv nr of parts.");
p->nr_parts_in = buff_in[0];
p->nr_gparts_in = buff_in[1];
// message( "irecv particle count on node %i from node %i." , p->mynodeID , // message( "irecv particle count on node %i from node %i." , p->mynodeID ,
// p->nodeID ); fflush(stdout); // p->nodeID ); fflush(stdout);
...@@ -250,6 +258,15 @@ void proxy_parts_exch2(struct proxy *p) { ...@@ -250,6 +258,15 @@ void proxy_parts_exch2(struct proxy *p) {
p->size_parts_in)) == NULL) p->size_parts_in)) == NULL)
error("Failed to re-allocate parts_in buffers."); error("Failed to re-allocate parts_in buffers.");
} }
if (p->nr_gparts_in > p->size_gparts_in) {
do {
p->size_gparts_in *= proxy_buffgrow;
} while (p->nr_gparts_in > p->size_gparts_in);
free(p->gparts_in);
if ((p->gparts_in = (struct gpart *)malloc(
sizeof(struct gpart) *p->size_gparts_in)) == NULL)
error("Failed to re-allocate gparts_in buffers.");
}
/* Receive the particle buffers. */ /* Receive the particle buffers. */
if (p->nr_parts_in > 0) { if (p->nr_parts_in > 0) {
...@@ -258,7 +275,10 @@ void proxy_parts_exch2(struct proxy *p) { ...@@ -258,7 +275,10 @@ void proxy_parts_exch2(struct proxy *p) {
MPI_COMM_WORLD, &p->req_parts_in) != MPI_SUCCESS || MPI_COMM_WORLD, &p->req_parts_in) != MPI_SUCCESS ||
MPI_Irecv(p->xparts_in, sizeof(struct xpart) * p->nr_parts_in, MPI_BYTE, MPI_Irecv(p->xparts_in, sizeof(struct xpart) * p->nr_parts_in, MPI_BYTE,
p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_xparts, p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_xparts,
MPI_COMM_WORLD, &p->req_xparts_in) != MPI_SUCCESS) MPI_COMM_WORLD, &p->req_xparts_in) != MPI_SUCCESS ||
MPI_Irecv(p->gparts_in, sizeof(struct gpart) * p->nr_gparts_in, MPI_BYTE,
p->nodeID, p->nodeID * proxy_tag_shift + proxy_tag_gparts,
MPI_COMM_WORLD, &p->req_gparts_in) != MPI_SUCCESS)
error("Failed to irecv part data."); error("Failed to irecv part data.");
// message( "irecv particle data (%i) from node %i." , p->nr_parts_in , // message( "irecv particle data (%i) from node %i." , p->nr_parts_in ,
// p->nodeID ); fflush(stdout); // p->nodeID ); fflush(stdout);
...@@ -309,6 +329,37 @@ void proxy_parts_load(struct proxy *p, struct part *parts, struct xpart *xparts, ...@@ -309,6 +329,37 @@ void proxy_parts_load(struct proxy *p, struct part *parts, struct xpart *xparts,
p->nr_parts_out += N; p->nr_parts_out += N;
} }
/**
* @brief Load parts onto a proxy for exchange.
*
* @param p The #proxy.
* @param gparts Pointer to an array of #gpart to send.
* @param N The number of parts.
*/
void proxy_gparts_load(struct proxy *p, struct gpart *gparts, int N) {
/* Is there enough space in the buffer? */
if (p->nr_gparts_out + N > p->size_gparts_out) {
do {
p->size_gparts_out *= proxy_buffgrow;
} while (p->nr_gparts_out + N > p->size_gparts_out);
struct gpart *tp;
if ((tp = (struct gpart *)malloc(sizeof(struct gpart) *p->size_gparts_out)) ==
NULL)
error("Failed to re-allocate gparts_out buffers.");
memcpy(tp, p->gparts_out, sizeof(struct gpart) * p->nr_gparts_out);
free(p->gparts_out);
p->gparts_out = tp;
}
/* Copy the parts and xparts data to the buffer. */
memcpy(&p->gparts_out[p->nr_gparts_out], parts, sizeof(struct gpart) * N);
/* Increase the counters. */
p->nr_gparts_out += N;
}
/** /**
* @brief Initialize the given proxy. * @brief Initialize the given proxy.
* *
...@@ -358,4 +409,20 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) { ...@@ -358,4 +409,20 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) {
error("Failed to allocate parts_out buffers."); error("Failed to allocate parts_out buffers.");
} }
p->nr_parts_out = 0; p->nr_parts_out = 0;
/* Allocate the gpart send and receive buffers, if needed. */
if (p->gparts_in == NULL) {
p->size_gparts_in = proxy_buffinit;
if ((p->gparts_in = (struct gpart *)malloc(
sizeof(struct gpart) *p->size_gparts_in)) == NULL)
error("Failed to allocate gparts_in buffers.");
}
p->nr_gparts_in = 0;
if (p->gparts_out == NULL) {
p->size_gparts_out = proxy_buffinit;
if ((p->gparts_out = (struct gpart *)malloc(
sizeof(struct gpart) *p->size_gparts_out)) == NULL)
error("Failed to allocate gparts_out buffers.");
}
p->nr_gparts_out = 0;
} }
...@@ -32,7 +32,8 @@ ...@@ -32,7 +32,8 @@
#define proxy_tag_count 0 #define proxy_tag_count 0
#define proxy_tag_parts 1 #define proxy_tag_parts 1
#define proxy_tag_xparts 2 #define proxy_tag_xparts 2
#define proxy_tag_cells 3 #define proxy_tag_xparts 3
#define proxy_tag_cells 4
/* Data structure for the proxy. */ /* Data structure for the proxy. */
struct proxy { struct proxy {
...@@ -53,14 +54,18 @@ struct proxy { ...@@ -53,14 +54,18 @@ struct proxy {
/* The parts and xparts buffers for input and output. */ /* The parts and xparts buffers for input and output. */
struct part *parts_in, *parts_out; struct part *parts_in, *parts_out;
struct xpart *xparts_in, *xparts_out; struct xpart *xparts_in, *xparts_out;
struct gpart *gparts_in, *gparts_out;
int size_parts_in, size_parts_out; int size_parts_in, size_parts_out;
int nr_parts_in, nr_parts_out; int nr_parts_in, nr_parts_out;
int size_gparts_in, size_gparts_out;
int nr_gparts_in, nr_gparts_out;
/* MPI request handles. */ /* MPI request handles. */
#ifdef WITH_MPI #ifdef WITH_MPI
MPI_Request req_parts_count_out, req_parts_count_in; MPI_Request req_parts_count_out, req_parts_count_in;
MPI_Request req_parts_out, req_parts_in; MPI_Request req_parts_out, req_parts_in;
MPI_Request req_xparts_out, req_xparts_in; MPI_Request req_xparts_out, req_xparts_in;
MPI_Request req_gparts_out, req_gparts_in;
MPI_Request req_cells_count_out, req_cells_count_in; MPI_Request req_cells_count_out, req_cells_count_in;
MPI_Request req_cells_out, req_cells_in; MPI_Request req_cells_out, req_cells_in;
#endif #endif
...@@ -70,6 +75,7 @@ struct proxy { ...@@ -70,6 +75,7 @@ struct proxy {
void proxy_init(struct proxy *p, int mynodeID, int nodeID); void proxy_init(struct proxy *p, int mynodeID, int nodeID);
void proxy_parts_load(struct proxy *p, struct part *parts, struct xpart *xparts, void proxy_parts_load(struct proxy *p, struct part *parts, struct xpart *xparts,
int N); int N);
void proxy_gparts_load(struct proxy *p, struct gpart *gparts, int N);
void proxy_parts_exch1(struct proxy *p); void proxy_parts_exch1(struct proxy *p);
void proxy_parts_exch2(struct proxy *p); void proxy_parts_exch2(struct proxy *p);
void proxy_addcell_in(struct proxy *p, struct cell *c); void proxy_addcell_in(struct proxy *p, struct cell *c);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment