aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2013-08-06 18:20:01 -0400
committerErik Schnetter <schnetter@gmail.com>2013-08-06 18:20:01 -0400
commit2dedcb0e7340b0682d530dc26e764408b301e3b8 (patch)
tree07f2c893f26b07a3785ef53dc1f7c73b90cc4321
parent1843ac6e88b63d8eeaadfca723f4b2d13698cd62 (diff)
CarpetLib: Do not reallocate communication buffers; instead, keep them around
-rw-r--r--Carpet/CarpetLib/src/commstate.cc77
-rw-r--r--Carpet/CarpetLib/src/commstate.hh22
2 files changed, 75 insertions, 24 deletions
diff --git a/Carpet/CarpetLib/src/commstate.cc b/Carpet/CarpetLib/src/commstate.cc
index 25a7a7f29..5e9eb9108 100644
--- a/Carpet/CarpetLib/src/commstate.cc
+++ b/Carpet/CarpetLib/src/commstate.cc
@@ -29,13 +29,53 @@ char const * tostring (astate const & thestate)
case state_do_some_work: return "state_do_some_work";
case state_empty_recv_buffers: return "state_empty_recv_buffers";
case state_done: return "state_done";
- default: assert(0); abort();
+ default: CCTK_BUILTIN_UNREACHABLE();
}
return NULL;
}
+comm_state::procbufdesc::procbufdesc() :
+ sendbufsize(0), recvbufsize(0),
+ sendbuf(NULL), recvbuf(NULL),
+ did_post_send(false), did_post_recv(false)
+{
+}
+
+void comm_state::procbufdesc::reinitialize()
+{
+ // Note: calling resize(0) instead of clear() ensures that the
+ // vector capacity does not change
+ sendbufbase.resize(0);
+ recvbufbase.resize(0);
+ // Re-initialize the procbuf
+ sendbufsize = 0;
+ recvbufsize = 0;
+ sendbuf = NULL;
+ recvbuf = NULL;
+ did_post_send = false;
+ did_post_recv = false;
+}
+
+
+
+comm_state::typebufdesc::typebufdesc() :
+ in_use(false),
+ mpi_datatype(MPI_DATATYPE_NULL), datatypesize(0)
+{
+}
+
+
+
+// Define static class members
+bool comm_state::typebufs_busy = false;
+vector<comm_state::typebufdesc> comm_state::typebufs;
+vector<MPI_Request> comm_state::srequests;
+vector<MPI_Request> comm_state::rrequests;
+
+
+
// Communication state control
comm_state::comm_state ()
{
@@ -45,19 +85,25 @@ comm_state::comm_state ()
timer.start ();
thestate = state_get_buffer_sizes;
- typebufs.resize (dist::c_ndatatypes());
+ assert (not typebufs_busy);
+ typebufs_busy = true;
+ if (typebufs.empty()) {
+ typebufs.resize (dist::c_ndatatypes());
#define TYPECASE(N,T) \
- { \
- T dummy; \
- unsigned const type = dist::c_datatype (dummy); \
- typebufs.AT(type).mpi_datatype = dist::mpi_datatype (dummy); \
- typebufs.AT(type).datatypesize = sizeof dummy; \
- }
+ { \
+ T dummy; \
+ unsigned const type = dist::c_datatype (dummy); \
+ typebufs.AT(type).mpi_datatype = dist::mpi_datatype (dummy); \
+ typebufs.AT(type).datatypesize = sizeof dummy; \
+ }
#include "typecase.hh"
#undef TYPECASE
+ }
srequests.reserve (dist::c_ndatatypes() * dist::size());
rrequests.reserve (dist::c_ndatatypes() * dist::size());
+ assert (srequests.empty());
+ assert (rrequests.empty());
timer.stop (0);
}
@@ -459,13 +505,13 @@ void comm_state::step ()
case state_done: {
- assert (0); abort();
+ CCTK_BUILTIN_UNREACHABLE();
}
default:
- assert (0); abort();
+ CCTK_BUILTIN_UNREACHABLE();
}
@@ -485,6 +531,17 @@ comm_state::~comm_state ()
{
DECLARE_CCTK_PARAMETERS;
+ for (size_t type=0; type<typebufs.size(); ++type) {
+ typebufdesc& typebuf = typebufs.AT(type);
+ for (size_t proc=0; proc<typebuf.procbufs.size(); ++proc) {
+ procbufdesc& procbuf = typebuf.procbufs.AT(proc);
+ procbuf.reinitialize();
+ }
+ }
+
+ assert (typebufs_busy);
+ typebufs_busy = false;
+
assert (thestate == state_done or
thestate == state_get_buffer_sizes);
}
diff --git a/Carpet/CarpetLib/src/commstate.hh b/Carpet/CarpetLib/src/commstate.hh
index b5f0c55b1..12b6e4f69 100644
--- a/Carpet/CarpetLib/src/commstate.hh
+++ b/Carpet/CarpetLib/src/commstate.hh
@@ -77,12 +77,8 @@ private:
bool did_post_recv;
// constructor for an instance of this structure
- procbufdesc() :
- sendbufsize(0), recvbufsize(0),
- sendbuf(NULL), recvbuf(NULL),
- did_post_send(false), did_post_recv(false)
- {
- }
+ procbufdesc();
+ void reinitialize();
};
@@ -99,26 +95,24 @@ private:
int datatypesize;
// per-process buffers
+ // TODO: make this scale (by using e.g. a map)
vector<procbufdesc> procbufs; // [dist::size()]
// constructor for an instance of this structure
- typebufdesc() :
- in_use(false),
- mpi_datatype(MPI_DATATYPE_NULL), datatypesize(0)
- {
- }
+ typebufdesc();
};
// datatype buffers
- vector<typebufdesc> typebufs; // [type]
+ static bool typebufs_busy;
+ static vector<typebufdesc> typebufs; // [type]
// outstanding requests for posted send/recv communications
- vector<MPI_Request> srequests;
- vector<MPI_Request> rrequests;
+ static vector<MPI_Request> srequests;
+ static vector<MPI_Request> rrequests;
static inline
MPI_Request & push_back (vector<MPI_Request> & reqs)