mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
Hadrons: smarter memory profiler
This commit is contained in:
parent
80de748737
commit
ef5452cddf
@ -35,7 +35,7 @@ using namespace QCD;
|
|||||||
using namespace Hadrons;
|
using namespace Hadrons;
|
||||||
|
|
||||||
#define ERROR_NO_ADDRESS(address)\
|
#define ERROR_NO_ADDRESS(address)\
|
||||||
HADRONS_ERROR(Definition, "no object with address " + std::to_string(address));
|
HADRONS_ERROR_REF(ObjectDefinition, "no object with address " + std::to_string(address), address);
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Environment implementation *
|
* Environment implementation *
|
||||||
@ -220,7 +220,8 @@ void Environment::addObject(const std::string name, const int moduleAddress)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "object '" + name + "' already exists");
|
HADRONS_ERROR_REF(ObjectDefinition, "object '" + name + "' already exists",
|
||||||
|
getObjectAddress(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +245,7 @@ void Environment::createDerivedObject(const std::string name,
|
|||||||
(object_[address].type != &typeid(B)) or
|
(object_[address].type != &typeid(B)) or
|
||||||
(object_[address].derivedType != &typeid(T)))
|
(object_[address].derivedType != &typeid(T)))
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "object '" + name + "' already allocated");
|
HADRONS_ERROR_REF(ObjectDefinition, "object '" + name + "' already allocated", address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,28 +279,31 @@ T * Environment::getDerivedObject(const unsigned int address) const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "object with address " + std::to_string(address) +
|
HADRONS_ERROR_REF(ObjectDefinition, "object with address " +
|
||||||
|
std::to_string(address) +
|
||||||
" cannot be casted to '" + typeName(&typeid(T)) +
|
" cannot be casted to '" + typeName(&typeid(T)) +
|
||||||
"' (has type '" + typeName(&typeid(h->get())) + "')");
|
"' (has type '" + typeName(&typeid(h->get())) + "')", address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "object with address " + std::to_string(address) +
|
HADRONS_ERROR_REF(ObjectDefinition, "object with address " +
|
||||||
|
std::to_string(address) +
|
||||||
" does not have type '" + typeName(&typeid(B)) +
|
" does not have type '" + typeName(&typeid(B)) +
|
||||||
"' (has type '" + getObjectType(address) + "')");
|
"' (has type '" + getObjectType(address) + "')", address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "object with address " + std::to_string(address) +
|
HADRONS_ERROR_REF(ObjectDefinition, "object with address " +
|
||||||
" is empty");
|
std::to_string(address) + " is empty", address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "no object with address " + std::to_string(address));
|
HADRONS_ERROR_REF(ObjectDefinition, "no object with address " +
|
||||||
|
std::to_string(address), address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,7 +341,8 @@ bool Environment::isObjectOfType(const unsigned int address) const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "no object with address " + std::to_string(address));
|
HADRONS_ERROR_REF(ObjectDefinition, "no object with address "
|
||||||
|
+ std::to_string(address), address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ void TRBPrecCG<FImpl, nBasis>::setup(void)
|
|||||||
guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse,
|
guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse,
|
||||||
epack.evalCoarse));
|
epack.evalCoarse));
|
||||||
}
|
}
|
||||||
catch (Exceptions::Definition &e)
|
catch (Exceptions::ObjectDefinition &)
|
||||||
{
|
{
|
||||||
auto &epack = envGet(EPack, par().eigenPack);
|
auto &epack = envGet(EPack, par().eigenPack);
|
||||||
|
|
||||||
|
@ -123,10 +123,11 @@ void VirtualMachine::pushModule(VirtualMachine::ModPt &pt)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// output already fully registered, error
|
// output already fully registered, error
|
||||||
HADRONS_ERROR(Definition, "object '" + out
|
HADRONS_ERROR_REF(ObjectDefinition, "object '" + out
|
||||||
+ "' is already produced by module '"
|
+ "' is already produced by module '"
|
||||||
+ module_[env().getObjectModule(out)].name
|
+ module_[env().getObjectModule(out)].name
|
||||||
+ "' (while pushing module '" + name + "')");
|
+ "' (while pushing module '" + name + "')",
|
||||||
|
env().getObjectAddress(out));
|
||||||
}
|
}
|
||||||
if (getModule(address)->getReference().size() > 0)
|
if (getModule(address)->getReference().size() > 0)
|
||||||
{
|
{
|
||||||
@ -306,10 +307,10 @@ void VirtualMachine::makeModuleGraph(void)
|
|||||||
|
|
||||||
if (min < 0)
|
if (min < 0)
|
||||||
{
|
{
|
||||||
HADRONS_ERROR(Definition, "dependency '"
|
HADRONS_ERROR_REF(ObjectDefinition, "dependency '"
|
||||||
+ env().getObjectName(in) + "' (address "
|
+ env().getObjectName(in) + "' (address "
|
||||||
+ std::to_string(in)
|
+ std::to_string(in)
|
||||||
+ ") is not produced by any module");
|
+ ") is not produced by any module", in);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -394,7 +395,7 @@ void VirtualMachine::makeMemoryProfile(void)
|
|||||||
if (profile_.module[a].empty())
|
if (profile_.module[a].empty())
|
||||||
{
|
{
|
||||||
LOG(Debug) << "Profiling memory for module '" << module_[a].name
|
LOG(Debug) << "Profiling memory for module '" << module_[a].name
|
||||||
<< "' (" << a << ")..." << std::endl;
|
<< "' (" << a << ")" << std::endl;
|
||||||
memoryProfile(a);
|
memoryProfile(a);
|
||||||
env().freeAll();
|
env().freeAll();
|
||||||
}
|
}
|
||||||
@ -471,7 +472,7 @@ void VirtualMachine::memoryProfile(const unsigned int address)
|
|||||||
auto m = getModule(address);
|
auto m = getModule(address);
|
||||||
|
|
||||||
LOG(Debug) << "Setting up module '" << m->getName()
|
LOG(Debug) << "Setting up module '" << m->getName()
|
||||||
<< "' (" << address << ")..." << std::endl;
|
<< "' (" << address << ")" << std::endl;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
currentModule_ = address;
|
currentModule_ = address;
|
||||||
@ -479,25 +480,17 @@ void VirtualMachine::memoryProfile(const unsigned int address)
|
|||||||
currentModule_ = -1;
|
currentModule_ = -1;
|
||||||
updateProfile(address);
|
updateProfile(address);
|
||||||
}
|
}
|
||||||
catch (Exceptions::Definition &)
|
catch (Exceptions::ObjectDefinition &exc)
|
||||||
{
|
{
|
||||||
cleanEnvironment();
|
cleanEnvironment();
|
||||||
for (auto &in: m->getInput())
|
if (!env().hasCreatedObject(exc.getAddress()))
|
||||||
{
|
{
|
||||||
if (!env().hasCreatedObject(in))
|
LOG(Debug) << "Object '" << env().getObjectName(exc.getAddress())
|
||||||
{
|
<< "' missing for setup of '" << m->getName()
|
||||||
memoryProfile(env().getObjectModule(in));
|
<< "' (" << address << ")" << std::endl;
|
||||||
}
|
memoryProfile(env().getObjectModule(exc.getAddress()));
|
||||||
}
|
}
|
||||||
for (auto &ref: m->getReference())
|
memoryProfile(address);
|
||||||
{
|
|
||||||
if (!env().hasCreatedObject(ref))
|
|
||||||
{
|
|
||||||
memoryProfile(env().getObjectModule(ref));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m->setup();
|
|
||||||
updateProfile(address);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user