statistics.hh:
same - bin printing statistics.cc: printing of bins! now all the nice binning functionality is actually useful cuz you can see the data it so nicely took. this prints out only the individual bin values. totals to come. statistics.hh: add a binned() function to each stat so that at print time, we can know if it's binned in order to print it right. base/statistics.hh: add a binned() function to each stat so that at print time, we can know if it's binned in order to print it right. base/statistics.cc: printing of bins! now all the nice binning functionality is actually useful cuz you can see the data it so nicely took. this prints out only the individual bin values. totals to come. base/statistics.hh: same - bin printing --HG-- extra : convert_revision : 09df9aae62b0e522230ee6bedcb51079346735a4
This commit is contained in:
parent
4489583dfe
commit
66f115a2df
2 changed files with 120 additions and 6 deletions
|
@ -131,6 +131,10 @@ class Database
|
|||
typedef list<Stat *> list_t;
|
||||
typedef map<const Stat *, StatData *> map_t;
|
||||
|
||||
list<BinBase *> bins;
|
||||
map<const BinBase *, std::string > bin_names;
|
||||
list_t binnedStats;
|
||||
|
||||
list_t allStats;
|
||||
list_t printStats;
|
||||
map_t map;
|
||||
|
@ -145,6 +149,7 @@ class Database
|
|||
void check();
|
||||
void regStat(Stat *stat);
|
||||
StatData *print(Stat *stat);
|
||||
void regBin(BinBase *bin, std::string name);
|
||||
};
|
||||
|
||||
Database::Database()
|
||||
|
@ -156,15 +161,51 @@ Database::~Database()
|
|||
void
|
||||
Database::dump(ostream &stream)
|
||||
{
|
||||
|
||||
list_t::iterator i = printStats.begin();
|
||||
list_t::iterator end = printStats.end();
|
||||
while (i != end) {
|
||||
Stat *stat = *i;
|
||||
if (stat->binned())
|
||||
binnedStats.push_back(stat);
|
||||
++i;
|
||||
}
|
||||
|
||||
list<BinBase *>::iterator j = bins.begin();
|
||||
list<BinBase *>::iterator bins_end=bins.end();
|
||||
|
||||
if (!bins.empty()) {
|
||||
ccprintf(stream, "PRINTING BINNED STATS\n");
|
||||
while (j != bins_end) {
|
||||
(*j)->activate();
|
||||
::map<const BinBase *, std::string>::const_iterator iter;
|
||||
iter = bin_names.find(*j);
|
||||
if (iter == bin_names.end())
|
||||
panic("a binned stat not found in names map!");
|
||||
ccprintf(stream,"---%s Bin------------\n", (*iter).second);
|
||||
|
||||
list_t::iterator i = binnedStats.begin();
|
||||
list_t::iterator end = binnedStats.end();
|
||||
while (i != end) {
|
||||
Stat *stat = *i;
|
||||
if (stat->dodisplay())
|
||||
stat->display(stream);
|
||||
++i;
|
||||
}
|
||||
++j;
|
||||
ccprintf(stream, "---------------------------------\n");
|
||||
}
|
||||
}
|
||||
|
||||
list_t::iterator k = printStats.begin();
|
||||
list_t::iterator endprint = printStats.end();
|
||||
ccprintf(stream, "*****ALL STATS*****\n");
|
||||
while (k != endprint) {
|
||||
Stat *stat = *k;
|
||||
if (stat->dodisplay() && !stat->binned())
|
||||
stat->display(stream);
|
||||
++k;
|
||||
}
|
||||
}
|
||||
|
||||
StatData *
|
||||
|
@ -221,6 +262,21 @@ Database::regStat(Stat *stat)
|
|||
assert(success && "this should never fail");
|
||||
}
|
||||
|
||||
void
|
||||
Database::regBin(BinBase *bin, std::string name)
|
||||
{
|
||||
if (bin_names.find(bin) != bin_names.end())
|
||||
panic("shouldn't register bin twice");
|
||||
|
||||
bins.push_back(bin);
|
||||
|
||||
bool success = (bin_names.insert(make_pair(bin,name))).second;
|
||||
assert(bin_names.find(bin) != bin_names.end());
|
||||
assert(success && "this should not fail");
|
||||
|
||||
cprintf("registering %s\n", name);
|
||||
}
|
||||
|
||||
bool
|
||||
Stat::less(Stat *stat1, Stat *stat2)
|
||||
{
|
||||
|
@ -274,6 +330,7 @@ Stat::Stat(bool reg)
|
|||
|
||||
if (reg)
|
||||
StatDB().regStat(this);
|
||||
|
||||
#ifdef STAT_DEBUG
|
||||
number = ++total_stats;
|
||||
cprintf("I'm stat number %d\n",number);
|
||||
|
@ -828,6 +885,12 @@ BinBase::memory()
|
|||
return mem;
|
||||
}
|
||||
|
||||
void
|
||||
BinBase::regBin(BinBase *bin, std::string name)
|
||||
{
|
||||
StatDB().regBin(bin, name);
|
||||
}
|
||||
|
||||
} // namespace Detail
|
||||
|
||||
void
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
#include "sim/host.hh"
|
||||
|
||||
//
|
||||
// Un-comment this to enable wierdo-stat debugging
|
||||
// Un-comment this to enable weirdo-stat debugging
|
||||
//
|
||||
// #define STAT_DEBUG
|
||||
|
||||
|
@ -226,6 +226,8 @@ class Stat
|
|||
*/
|
||||
virtual bool zero() const = 0;
|
||||
|
||||
//need to document
|
||||
virtual bool binned() const = 0;
|
||||
|
||||
/**
|
||||
* Set the name and marks this stat to print at the end of simulation.
|
||||
|
@ -320,6 +322,9 @@ class ScalarStat : public Stat
|
|||
* @param stream The output stream.
|
||||
*/
|
||||
virtual void display(std::ostream &stream) const;
|
||||
|
||||
//need to document
|
||||
virtual bool binned() const = 0;
|
||||
};
|
||||
|
||||
void
|
||||
|
@ -363,6 +368,9 @@ class VectorStat : public Stat
|
|||
* @param stream The output stream.
|
||||
*/
|
||||
virtual void display(std::ostream &stream) const;
|
||||
|
||||
//need to document
|
||||
virtual bool binned() const = 0;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
@ -608,6 +616,8 @@ class ScalarBase : public ScalarStat
|
|||
* @return 1.
|
||||
*/
|
||||
virtual size_t size() const { return 1; }
|
||||
|
||||
virtual bool binned() const { return bin_t::binned; }
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
@ -732,6 +742,8 @@ class VectorBase : public VectorStat
|
|||
* @return The size of the vector.
|
||||
*/
|
||||
virtual size_t size() const { return bin.size(); }
|
||||
|
||||
virtual bool binned() const { return bin_t::binned; }
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -855,6 +867,8 @@ class ScalarProxy : public ScalarStat
|
|||
* @return 1.
|
||||
*/
|
||||
virtual size_t size() const { return 1; }
|
||||
|
||||
virtual bool binned() const { return false; }
|
||||
};
|
||||
|
||||
template <typename T, template <typename T> class Storage, class Bin>
|
||||
|
@ -931,6 +945,7 @@ class Vector2dBase : public Stat
|
|||
|
||||
virtual size_t size() const { return bin.size(); }
|
||||
virtual bool zero() const { return data(0)->value(params) == 0.0; }
|
||||
virtual bool binned() const { return bin_t::binned; }
|
||||
|
||||
virtual void
|
||||
display(std::ostream &out) const
|
||||
|
@ -1058,6 +1073,8 @@ class VectorProxy : public VectorStat
|
|||
assert (index >= 0 && index < size());
|
||||
return ScalarProxy<T, Storage, Bin>(*bin, *params, offset + index);
|
||||
}
|
||||
|
||||
virtual bool binned() const { return false; }
|
||||
};
|
||||
|
||||
template <typename T, template <typename T> class Storage, class Bin>
|
||||
|
@ -1433,6 +1450,8 @@ class DistBase : public Stat
|
|||
data()->display(stream, myname(), mydesc(), myprecision(), myflags(),
|
||||
params);
|
||||
}
|
||||
|
||||
virtual bool binned() const { return bin_t::binned; }
|
||||
};
|
||||
|
||||
template <typename T, template <typename T> class Storage, class Bin>
|
||||
|
@ -1472,6 +1491,7 @@ class VectorDistBase : public Stat
|
|||
virtual size_t size() const { return bin.size(); }
|
||||
virtual bool zero() const { return false; }
|
||||
virtual void display(std::ostream &stream) const;
|
||||
virtual bool binned() const { return bin_t::binned; }
|
||||
};
|
||||
|
||||
template <typename T, template <typename T> class Storage, class Bin>
|
||||
|
@ -1528,6 +1548,8 @@ class VectorDistProxy : public Stat
|
|||
data()->display(stream, name.str(), desc.str(),
|
||||
cstat->myprecision(), cstat->myflags(), cstat->params);
|
||||
}
|
||||
|
||||
virtual bool binned() const { return false; }
|
||||
};
|
||||
|
||||
template <typename T, template <typename T> class Storage, class Bin>
|
||||
|
@ -1598,6 +1620,8 @@ class Node : public RefCounted
|
|||
* @return The total of the result vector.
|
||||
*/
|
||||
virtual result_t total() const = 0;
|
||||
|
||||
virtual bool binned() const = 0;
|
||||
};
|
||||
|
||||
/** Reference counting pointer to a function Node. */
|
||||
|
@ -1615,6 +1639,8 @@ class ScalarStatNode : public Node
|
|||
virtual result_t total() const { return stat.val(); };
|
||||
|
||||
virtual size_t size() const { return 1; }
|
||||
|
||||
virtual bool binned() const { return stat.binned(); }
|
||||
};
|
||||
|
||||
template <typename T, template <typename T> class Storage, class Bin>
|
||||
|
@ -1631,6 +1657,8 @@ class ScalarProxyNode : public Node
|
|||
virtual result_t total() const { return proxy.val(); };
|
||||
|
||||
virtual size_t size() const { return 1; }
|
||||
|
||||
virtual bool binned() const { return proxy.binned(); }
|
||||
};
|
||||
|
||||
class VectorStatNode : public Node
|
||||
|
@ -1644,6 +1672,8 @@ class VectorStatNode : public Node
|
|||
virtual result_t total() const { return stat.total(); };
|
||||
|
||||
virtual size_t size() const { return stat.size(); }
|
||||
|
||||
virtual bool binned() const { return stat.binned(); }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
@ -1658,6 +1688,7 @@ class ConstNode : public Node
|
|||
virtual result_t total() const { return data[0]; };
|
||||
|
||||
virtual size_t size() const { return 1; }
|
||||
virtual bool binned() const { return false; }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
@ -1676,6 +1707,7 @@ class FunctorNode : public Node
|
|||
virtual result_t total() const { return (result_t)functor(); };
|
||||
|
||||
virtual size_t size() const { return 1; }
|
||||
virtual bool binned() const { return false; }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
@ -1694,6 +1726,7 @@ class ScalarNode : public Node
|
|||
virtual result_t total() const { return (result_t)scalar; };
|
||||
|
||||
virtual size_t size() const { return 1; }
|
||||
virtual bool binned() const { return false; }
|
||||
};
|
||||
|
||||
template <class Op>
|
||||
|
@ -1726,6 +1759,7 @@ class UnaryNode : public Node
|
|||
}
|
||||
|
||||
virtual size_t size() const { return l->size(); }
|
||||
virtual bool binned() const { return l->binned(); }
|
||||
};
|
||||
|
||||
template <class Op>
|
||||
|
@ -1786,6 +1820,8 @@ class BinaryNode : public Node
|
|||
return ls;
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool binned() const { return (l->binned() || r->binned()); }
|
||||
};
|
||||
|
||||
template <class Op>
|
||||
|
@ -1827,6 +1863,7 @@ class SumNode : public Node
|
|||
}
|
||||
|
||||
virtual size_t size() const { return 1; }
|
||||
virtual bool binned() const { return l->binned(); }
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1953,7 +1990,9 @@ class BinBase
|
|||
|
||||
public:
|
||||
BinBase(size_t size);
|
||||
~BinBase();
|
||||
virtual ~BinBase();
|
||||
virtual void activate() = 0;
|
||||
void regBin(BinBase *bin, std::string name);
|
||||
};
|
||||
|
||||
} // namespace Detail
|
||||
|
@ -1961,6 +2000,12 @@ class BinBase
|
|||
template <class BinType>
|
||||
struct StatBin : public Detail::BinBase
|
||||
{
|
||||
private:
|
||||
std::string _name;
|
||||
|
||||
public:
|
||||
std::string name() const { return _name;}
|
||||
|
||||
static StatBin *&curBin() {
|
||||
static StatBin *current = NULL;
|
||||
return current;
|
||||
|
@ -1984,13 +2029,14 @@ struct StatBin : public Detail::BinBase
|
|||
return off;
|
||||
}
|
||||
|
||||
explicit StatBin(size_t size = 1024) : Detail::BinBase(size) {}
|
||||
explicit StatBin(std::string name, size_t size = 1024) : Detail::BinBase(size) { _name = name; this->regBin(this, name); }
|
||||
|
||||
char *memory(off_t off) {
|
||||
assert(offset() <= size());
|
||||
return Detail::BinBase::memory() + off;
|
||||
}
|
||||
|
||||
virtual void activate() { setCurBin(this); }
|
||||
static void activate(StatBin &bin) { setCurBin(&bin); }
|
||||
|
||||
class BinBase
|
||||
|
@ -2016,6 +2062,7 @@ struct StatBin : public Detail::BinBase
|
|||
typedef typename Storage::Params Params;
|
||||
|
||||
public:
|
||||
enum { binned = true };
|
||||
Bin() { allocate(sizeof(Storage)); }
|
||||
bool initialized() const { return true; }
|
||||
void init(const Params ¶ms) { }
|
||||
|
@ -2081,6 +2128,7 @@ struct NoBin
|
|||
{
|
||||
public:
|
||||
typedef typename Storage::Params Params;
|
||||
enum { binned = false };
|
||||
|
||||
private:
|
||||
char ptr[sizeof(Storage)];
|
||||
|
@ -2102,6 +2150,7 @@ struct NoBin
|
|||
{
|
||||
public:
|
||||
typedef typename Storage::Params Params;
|
||||
enum { binned = false };
|
||||
|
||||
private:
|
||||
char *ptr;
|
||||
|
@ -2454,6 +2503,8 @@ class Formula : public Detail::VectorStat
|
|||
else
|
||||
return root->size();
|
||||
}
|
||||
|
||||
virtual bool binned() const { return root->binned(); }
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue