From 2dedcb0e7340b0682d530dc26e764408b301e3b8 Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Tue, 6 Aug 2013 18:20:01 -0400 Subject: CarpetLib: Do not reallocate communication buffers; instead, keep them around --- Carpet/CarpetLib/src/commstate.cc | 77 ++++++++++++++++++++++++++++++++++----- 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::typebufs; +vector comm_state::srequests; +vector 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 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 typebufs; // [type] + static bool typebufs_busy; + static vector typebufs; // [type] // outstanding requests for posted send/recv communications - vector srequests; - vector rrequests; + static vector srequests; + static vector rrequests; static inline MPI_Request & push_back (vector & reqs) -- cgit v1.2.3