diff options
author | Erik Schnetter <schnetter@gmail.com> | 2013-08-06 18:20:01 -0400 |
---|---|---|
committer | Erik Schnetter <schnetter@gmail.com> | 2013-08-06 18:20:01 -0400 |
commit | 2dedcb0e7340b0682d530dc26e764408b301e3b8 (patch) | |
tree | 07f2c893f26b07a3785ef53dc1f7c73b90cc4321 | |
parent | 1843ac6e88b63d8eeaadfca723f4b2d13698cd62 (diff) |
CarpetLib: Do not reallocate communication buffers; instead, keep them around
-rw-r--r-- | Carpet/CarpetLib/src/commstate.cc | 77 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/commstate.hh | 22 |
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) |