From b7da264b0a64c21bd9f45174c4d831e70243bc63 Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Sat, 21 Jan 2017 13:40:23 -0800 Subject: [PATCH] Hadrons: Application is not storing the environment ref but calling getInstance() each time, solving a very nasty set fault on Linux/KNL --- extras/Hadrons/Application.cc | 43 +++++++++++++++++++--------------- extras/Hadrons/Application.hpp | 8 ++++--- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/extras/Hadrons/Application.cc b/extras/Hadrons/Application.cc index 4bb3b383..62674f30 100644 --- a/extras/Hadrons/Application.cc +++ b/extras/Hadrons/Application.cc @@ -42,7 +42,6 @@ using namespace Hadrons; ******************************************************************************/ // constructors //////////////////////////////////////////////////////////////// Application::Application(void) -: env_(Environment::getInstance()) { LOG(Message) << "Modules available:" << std::endl; auto list = ModuleFactory::getInstance().getBuilderList(); @@ -74,11 +73,17 @@ Application::Application(const std::string parameterFileName) parameterFileName_ = parameterFileName; } +// environment shortcut //////////////////////////////////////////////////////// +Environment & Application::env(void) const +{ + return Environment::getInstance(); +} + // access ////////////////////////////////////////////////////////////////////// void Application::setPar(const Application::GlobalPar &par) { par_ = par; - env_.setSeed(strToVec(par_.seed)); + env().setSeed(strToVec(par_.seed)); } const Application::GlobalPar & Application::getPar(void) @@ -89,7 +94,7 @@ const Application::GlobalPar & Application::getPar(void) // execute ///////////////////////////////////////////////////////////////////// void Application::run(void) { - if (!parameterFileName_.empty() and (env_.getNModule() == 0)) + if (!parameterFileName_.empty() and (env().getNModule() == 0)) { parseParameterFile(parameterFileName_); } @@ -124,7 +129,7 @@ void Application::parseParameterFile(const std::string parameterFileName) do { read(reader, "id", id); - env_.createModule(id.name, id.type, reader); + env().createModule(id.name, id.type, reader); } while (reader.nextElement("module")); pop(reader); pop(reader); @@ -134,7 +139,7 @@ void Application::saveParameterFile(const std::string parameterFileName) { XmlWriter writer(parameterFileName); ObjectId id; - const unsigned int nMod = env_.getNModule(); + const unsigned int nMod = env().getNModule(); LOG(Message) << "Saving application to '" << parameterFileName << "'..." << std::endl; write(writer, "parameters", getPar()); @@ -142,10 +147,10 @@ void Application::saveParameterFile(const std::string parameterFileName) for (unsigned int i = 0; i < nMod; ++i) { push(writer, "module"); - id.name = env_.getModuleName(i); - id.type = env_.getModule(i)->getRegisteredName(); + id.name = env().getModuleName(i); + id.type = env().getModule(i)->getRegisteredName(); write(writer, "id", id); - env_.getModule(i)->saveParameters(writer, "options"); + env().getModule(i)->saveParameters(writer, "options"); pop(writer); } pop(writer); @@ -164,10 +169,10 @@ auto memPeak = [this](const std::vector &program)\ \ msg = HadronsLogMessage.isActive();\ HadronsLogMessage.Active(false);\ - env_.dryRun(true);\ - memPeak = env_.executeProgram(program);\ - env_.dryRun(false);\ - env_.freeAll();\ + env().dryRun(true);\ + memPeak = env().executeProgram(program);\ + env().dryRun(false);\ + env().freeAll();\ HadronsLogMessage.Active(true);\ \ return memPeak;\ @@ -179,7 +184,7 @@ void Application::schedule(void) // build module dependency graph LOG(Message) << "Building module graph..." << std::endl; - auto graph = env_.makeModuleGraph(); + auto graph = env().makeModuleGraph(); auto con = graph.getConnectedComponents(); // constrained topological sort using a genetic algorithm @@ -256,7 +261,7 @@ void Application::saveSchedule(const std::string filename) << std::endl; for (auto address: program_) { - program.push_back(env_.getModuleName(address)); + program.push_back(env().getModuleName(address)); } write(writer, "schedule", program); } @@ -274,7 +279,7 @@ void Application::loadSchedule(const std::string filename) program_.clear(); for (auto &name: program) { - program_.push_back(env_.getModuleAddress(name)); + program_.push_back(env().getModuleAddress(name)); } scheduled_ = true; memPeak_ = memPeak(program_); @@ -291,7 +296,7 @@ void Application::printSchedule(void) for (unsigned int i = 0; i < program_.size(); ++i) { LOG(Message) << std::setw(4) << i + 1 << ": " - << env_.getModuleName(program_[i]) << std::endl; + << env().getModuleName(program_[i]) << std::endl; } } @@ -304,9 +309,9 @@ void Application::configLoop(void) { LOG(Message) << BIG_SEP << " Starting measurement for trajectory " << t << " " << BIG_SEP << std::endl; - env_.setTrajectory(t); - env_.executeProgram(program_); + env().setTrajectory(t); + env().executeProgram(program_); } LOG(Message) << BIG_SEP << " End of measurement " << BIG_SEP << std::endl; - env_.freeAll(); + env().freeAll(); } diff --git a/extras/Hadrons/Application.hpp b/extras/Hadrons/Application.hpp index 4ea262df..fce9b6eb 100644 --- a/extras/Hadrons/Application.hpp +++ b/extras/Hadrons/Application.hpp @@ -98,11 +98,13 @@ public: void printSchedule(void); // loop on configurations void configLoop(void); +private: + // environment shortcut + Environment & env(void) const; private: long unsigned int locVol_; std::string parameterFileName_{""}; GlobalPar par_; - Environment &env_; std::vector program_; Environment::Size memPeak_; bool scheduled_{false}; @@ -115,14 +117,14 @@ private: template void Application::createModule(const std::string name) { - env_.createModule(name); + env().createModule(name); } template void Application::createModule(const std::string name, const typename M::Par &par) { - env_.createModule(name, par); + env().createModule(name, par); } END_HADRONS_NAMESPACE