From f3090e5b704a2b7a02a736ec8601cd961fe3a865 Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Mon, 23 Feb 2009 12:22:19 -0800 Subject: stats: reorganize how parameters are stored and accessed. --- src/base/statistics.hh | 337 +++++++++++++++++++++++-------------------------- 1 file changed, 160 insertions(+), 177 deletions(-) (limited to 'src/base/statistics.hh') diff --git a/src/base/statistics.hh b/src/base/statistics.hh index d8145ddc4..15b6c032a 100644 --- a/src/base/statistics.hh +++ b/src/base/statistics.hh @@ -77,6 +77,10 @@ extern Tick curTick; /* A namespace for all of the Statistics */ namespace Stats { +struct StorageParams +{ + virtual ~StorageParams(); +}; ////////////////////////////////////////////////////////////////////// // @@ -100,8 +104,12 @@ class Info * A unique stat ID for each stat in the simulator. * Can be used externally for lookups as well as for debugging. */ + static int id_count; int id; + public: + const StorageParams *storageParams; + public: Info(); virtual ~Info(); @@ -247,10 +255,6 @@ struct DistData Counter squares; Counter samples; - Counter min; - Counter max; - Counter bucket_size; - size_type size; bool fancy; }; @@ -383,9 +387,13 @@ class InfoAccess /** Set up an info class for this statistic */ void setInfo(Info *info); /** Save Storage class parameters if any */ + void setParams(const StorageParams *params); + /** Save Storage class parameters if any */ void setInit(); + /** Grab the information class for this statistic */ Info *info(); + /** Grab the information class for this statistic */ const Info *info() const; }; @@ -591,55 +599,51 @@ class WrapVec2d : public WrapVec */ class StatStor { - public: - /** The paramaters for this storage type, none for a scalar. */ - struct Params { }; - private: /** The statistic value. */ Counter data; + public: + struct Params : public StorageParams {}; + public: /** * Builds this storage element and calls the base constructor of the * datatype. */ - StatStor(const Params &) : data(Counter()) {} + StatStor(Info *info) + : data(Counter()) + { } /** * The the stat to the given value. * @param val The new value. - * @param p The paramters of this storage type. */ - void set(Counter val, const Params &p) { data = val; } + void set(Counter val) { data = val; } /** * Increment the stat by the given value. * @param val The new value. - * @param p The paramters of this storage type. */ - void inc(Counter val, const Params &p) { data += val; } + void inc(Counter val) { data += val; } /** * Decrement the stat by the given value. * @param val The new value. - * @param p The paramters of this storage type. */ - void dec(Counter val, const Params &p) { data -= val; } + void dec(Counter val) { data -= val; } /** * Return the value of this stat as its base type. - * @param p The params of this storage type. * @return The value of this stat. */ - Counter value(const Params &p) const { return data; } + Counter value() const { return data; } /** * Return the value of this stat as a result type. - * @param p The parameters of this storage type. * @return The value of this stat. */ - Result result(const Params &p) const { return (Result)data; } + Result result() const { return (Result)data; } /** * Reset stat value to default */ - void reset() { data = Counter(); } + void reset(Info *info) { data = Counter(); } /** * @return true if zero value @@ -656,10 +660,6 @@ class StatStor */ class AvgStor { - public: - /** The paramaters for this storage type */ - struct Params { }; - private: /** The current count. */ Counter current; @@ -668,20 +668,24 @@ class AvgStor /** The tick that current last changed. */ mutable Tick last; + public: + struct Params : public StorageParams {}; + public: /** * Build and initializes this stat storage. */ - AvgStor(Params &p) : current(0), total(0), last(0) { } + AvgStor(Info *info) + : current(0), total(0), last(0) + { } /** * Set the current count to the one provided, update the total and last * set values. * @param val The new count. - * @param p The parameters for this storage. */ void - set(Counter val, Params &p) + set(Counter val) { total += current * (curTick - last); last = curTick; @@ -691,31 +695,27 @@ class AvgStor /** * Increment the current count by the provided value, calls set. * @param val The amount to increment. - * @param p The parameters for this storage. */ - void inc(Counter val, Params &p) { set(current + val, p); } + void inc(Counter val) { set(current + val); } /** * Deccrement the current count by the provided value, calls set. * @param val The amount to decrement. - * @param p The parameters for this storage. */ - void dec(Counter val, Params &p) { set(current - val, p); } + void dec(Counter val) { set(current - val); } /** * Return the current count. - * @param p The parameters for this storage. * @return The current count. */ - Counter value(const Params &p) const { return current; } + Counter value() const { return current; } /** * Return the current average. - * @param p The parameters for this storage. * @return The current average. */ Result - result(const Params &p) const + result() const { total += current * (curTick - last); last = curTick; @@ -726,7 +726,7 @@ class AvgStor * Reset stat value to default */ void - reset() + reset(Info *info) { total = 0; last = curTick; @@ -747,17 +747,12 @@ class ScalarBase : public InfoAccess { public: typedef Stor Storage; - - /** Define the params of the storage class. */ - typedef typename Storage::Params Params; + typedef typename Stor::Params Params; protected: /** The storage of this stat. */ char storage[sizeof(Storage)] __attribute__ ((aligned (8))); - /** The parameters for this stat. */ - Params params; - protected: /** * Retrieve the storage. @@ -785,7 +780,7 @@ class ScalarBase : public InfoAccess void doInit() { - new (storage) Storage(params); + new (storage) Storage(info()); setInit(); } @@ -794,14 +789,10 @@ class ScalarBase : public InfoAccess * Return the current value of this stat as its base type. * @return The current value. */ - Counter value() const { return data()->value(params); } + Counter value() const { return data()->value(); } public: - /** - * Create and initialize this stat, register it with the database. - */ - ScalarBase() - { } + ScalarBase() { } public: // Common operators for stats @@ -809,12 +800,12 @@ class ScalarBase : public InfoAccess * Increment the stat by 1. This calls the associated storage object inc * function. */ - void operator++() { data()->inc(1, params); } + void operator++() { data()->inc(1); } /** * Decrement the stat by 1. This calls the associated storage object dec * function. */ - void operator--() { data()->dec(1, params); } + void operator--() { data()->dec(1); } /** Increment the stat by 1. */ void operator++(int) { ++*this; } @@ -827,7 +818,7 @@ class ScalarBase : public InfoAccess * @param v The new value. */ template - void operator=(const U &v) { data()->set(v, params); } + void operator=(const U &v) { data()->set(v); } /** * Increment the stat by the given value. This calls the associated @@ -835,7 +826,7 @@ class ScalarBase : public InfoAccess * @param v The value to add. */ template - void operator+=(const U &v) { data()->inc(v, params); } + void operator+=(const U &v) { data()->inc(v); } /** * Decrement the stat by the given value. This calls the associated @@ -843,7 +834,7 @@ class ScalarBase : public InfoAccess * @param v The value to substract. */ template - void operator-=(const U &v) { data()->dec(v, params); } + void operator-=(const U &v) { data()->dec(v); } /** * Return the number of elements, always 1 for a scalar. @@ -856,11 +847,11 @@ class ScalarBase : public InfoAccess /** * Reset stat value to default */ - void reset() { data()->reset(); } + void reset() { data()->reset(info()); } - Counter value() { return data()->value(params); } + Counter value() { return data()->value(); } - Result result() { return data()->result(params); } + Result result() { return data()->result(); } Result total() { return result(); } @@ -966,18 +957,17 @@ class ScalarProxy * Return the current value of this stat as its base type. * @return The current value. */ - Counter value() const { return stat->data(index)->value(stat->params); } + Counter value() const { return stat->data(index)->value(); } /** * Return the current value of this statas a result type. * @return The current value. */ - Result result() const { return stat->data(index)->result(stat->params); } + Result result() const { return stat->data(index)->result(); } public: /** * Create and initialize this proxy, do not register it with the database. - * @param p The params to use. * @param i The index to access. */ ScalarProxy(Stat *s, off_type i) @@ -1013,12 +1003,12 @@ class ScalarProxy * Increment the stat by 1. This calls the associated storage object inc * function. */ - void operator++() { stat->data(index)->inc(1, stat->params); } + void operator++() { stat->data(index)->inc(1); } /** * Decrement the stat by 1. This calls the associated storage object dec * function. */ - void operator--() { stat->data(index)->dec(1, stat->params); } + void operator--() { stat->data(index)->dec(1); } /** Increment the stat by 1. */ void operator++(int) { ++*this; } @@ -1034,7 +1024,7 @@ class ScalarProxy void operator=(const U &v) { - stat->data(index)->set(v, stat->params); + stat->data(index)->set(v); } /** @@ -1046,7 +1036,7 @@ class ScalarProxy void operator+=(const U &v) { - stat->data(index)->inc(v, stat->params); + stat->data(index)->inc(v); } /** @@ -1058,7 +1048,7 @@ class ScalarProxy void operator-=(const U &v) { - stat->data(index)->dec(v, stat->params); + stat->data(index)->dec(v); } /** @@ -1089,9 +1079,7 @@ class VectorBase : public InfoAccess { public: typedef Stor Storage; - - /** Define the params of the storage class. */ - typedef typename Storage::Params Params; + typedef typename Stor::Params Params; /** Proxy type */ typedef ScalarProxy > Proxy; @@ -1103,9 +1091,6 @@ class VectorBase : public InfoAccess Storage *storage; size_type _size; - /** The parameters for this stat. */ - Params params; - protected: /** * Retrieve the storage. @@ -1132,7 +1117,7 @@ class VectorBase : public InfoAccess storage = reinterpret_cast(ptr); for (off_type i = 0; i < _size; ++i) - new (&storage[i]) Storage(params); + new (&storage[i]) Storage(info()); setInit(); } @@ -1143,7 +1128,7 @@ class VectorBase : public InfoAccess { vec.resize(size()); for (off_type i = 0; i < size(); ++i) - vec[i] = data(i)->value(params); + vec[i] = data(i)->value(); } /** @@ -1155,7 +1140,7 @@ class VectorBase : public InfoAccess { vec.resize(size()); for (off_type i = 0; i < size(); ++i) - vec[i] = data(i)->result(params); + vec[i] = data(i)->result(); } /** @@ -1167,7 +1152,7 @@ class VectorBase : public InfoAccess { Result total = 0.0; for (off_type i = 0; i < size(); ++i) - total += data(i)->result(params); + total += data(i)->result(); return total; } @@ -1195,7 +1180,7 @@ class VectorBase : public InfoAccess reset() { for (off_type i = 0; i < size(); ++i) - data(i)->reset(); + data(i)->reset(info()); } public: @@ -1260,7 +1245,7 @@ class VectorProxy vec.resize(size()); for (off_type i = 0; i < size(); ++i) - vec[i] = data(i)->result(stat->params); + vec[i] = data(i)->result(); return vec; } @@ -1270,7 +1255,7 @@ class VectorProxy { Result total = 0; for (off_type i = 0; i < size(); ++i) - total += data(i)->result(stat->params); + total += data(i)->result(); return total; } @@ -1314,7 +1299,7 @@ class Vector2dBase : public InfoAccess { public: typedef Stor Storage; - typedef typename Storage::Params Params; + typedef typename Stor::Params Params; typedef VectorProxy > Proxy; friend class ScalarProxy >; friend class VectorProxy >; @@ -1324,7 +1309,6 @@ class Vector2dBase : public InfoAccess size_type y; size_type _size; Storage *storage; - Params params; protected: Storage *data(off_type index) { return &storage[index]; } @@ -1348,7 +1332,7 @@ class Vector2dBase : public InfoAccess storage = reinterpret_cast(ptr); for (off_type i = 0; i < _size; ++i) - new (&storage[i]) Storage(params); + new (&storage[i]) Storage(info); setInit(); } @@ -1413,7 +1397,7 @@ class Vector2dBase : public InfoAccess reset() { for (off_type i = 0; i < size(); ++i) - data(i)->reset(); + data(i)->reset(info()); } bool @@ -1436,7 +1420,7 @@ class DistStor { public: /** The parameters for a distribution stat. */ - struct Params + struct Params : public StorageParams { /** The minimum value to track. */ Counter min; @@ -1445,11 +1429,20 @@ class DistStor /** The number of entries in each bucket. */ Counter bucket_size; /** The number of buckets. Equal to (max-min)/bucket_size. */ - size_type size; + size_type buckets; }; enum { fancy = false }; private: + /** The minimum value to track. */ + Counter min_track; + /** The maximum value to track. */ + Counter max_track; + /** The number of entries in each bucket. */ + Counter bucket_size; + /** The number of buckets. Equal to (max-min)/bucket_size. */ + size_type buckets; + /** The smallest value sampled. */ Counter min_val; /** The largest value sampled. */ @@ -1468,10 +1461,10 @@ class DistStor VCounter cvec; public: - DistStor(const Params ¶ms) - : cvec(params.size) + DistStor(Info *info) + : cvec(safe_cast(info->storageParams)->buckets) { - reset(); + reset(info); } /** @@ -1481,16 +1474,16 @@ class DistStor * @param params The paramters of the distribution. */ void - sample(Counter val, int number, const Params ¶ms) + sample(Counter val, int number) { - if (val < params.min) + if (val < min_track) underflow += number; - else if (val > params.max) + else if (val > max_track) overflow += number; else { size_type index = - (size_type)std::floor((val - params.min) / params.bucket_size); - assert(index < size(params)); + (size_type)std::floor((val - min_track) / bucket_size); + assert(index < size()); cvec[index] += number; } @@ -1509,48 +1502,50 @@ class DistStor /** * Return the number of buckets in this distribution. * @return the number of buckets. - * @todo Is it faster to return the size from the parameters? */ - size_type size(const Params &) const { return cvec.size(); } + size_type size() const { return cvec.size(); } /** * Returns true if any calls to sample have been made. - * @param params The paramters of the distribution. * @return True if any values have been sampled. */ bool - zero(const Params ¶ms) const + zero() const { return samples == Counter(); } void - update(DistData *data, const Params ¶ms) + update(Info *info, DistData &data) { - data->min = params.min; - data->max = params.max; - data->bucket_size = params.bucket_size; - data->size = params.size; + const Params *params = safe_cast(info->storageParams); - data->min_val = (min_val == CounterLimits::max()) ? 0 : min_val; - data->max_val = (max_val == CounterLimits::min()) ? 0 : max_val; - data->underflow = underflow; - data->overflow = overflow; - data->cvec.resize(params.size); - for (off_type i = 0; i < params.size; ++i) - data->cvec[i] = cvec[i]; + data.min_val = (min_val == CounterLimits::max()) ? 0 : min_val; + data.max_val = (max_val == CounterLimits::min()) ? 0 : max_val; + data.underflow = underflow; + data.overflow = overflow; - data->sum = sum; - data->squares = squares; - data->samples = samples; + int buckets = params->buckets; + data.cvec.resize(buckets); + for (off_type i = 0; i < buckets; ++i) + data.cvec[i] = cvec[i]; + + data.sum = sum; + data.squares = squares; + data.samples = samples; } /** * Reset stat value to default */ void - reset() + reset(Info *info) { + const Params *params = safe_cast(info->storageParams); + min_track = params->min; + max_track = params->max; + bucket_size = params->bucket_size; + min_val = CounterLimits::max(); max_val = CounterLimits::min(); underflow = 0; @@ -1573,10 +1568,9 @@ class DistStor class FancyStor { public: - /** - * No paramters for this storage. - */ - struct Params {}; + struct Params : public StorageParams {}; + + public: enum { fancy = true }; private: @@ -1591,7 +1585,7 @@ class FancyStor /** * Create and initialize this storage. */ - FancyStor(const Params &) + FancyStor(Info *info) : sum(Counter()), squares(Counter()), samples(Counter()) { } @@ -1604,7 +1598,7 @@ class FancyStor * @param p The parameters of this stat. */ void - sample(Counter val, int number, const Params &p) + sample(Counter val, int number) { Counter value = val * number; sum += value; @@ -1613,30 +1607,30 @@ class FancyStor } void - update(DistData *data, const Params ¶ms) + update(Info *info, DistData &data) { - data->sum = sum; - data->squares = squares; - data->samples = samples; + data.sum = sum; + data.squares = squares; + data.samples = samples; } /** * Return the number of entries in this stat, 1 * @return 1. */ - size_type size(const Params &) const { return 1; } + size_type size() const { return 1; } /** * Return true if no samples have been added. * @return True if no samples have been added. */ - bool zero(const Params &) const { return samples == Counter(); } + bool zero() const { return samples == Counter(); } /** * Reset stat value to default */ void - reset() + reset(Info *info) { sum = Counter(); squares = Counter(); @@ -1651,8 +1645,9 @@ class FancyStor class AvgFancy { public: - /** No parameters for this storage. */ - struct Params {}; + struct Params : public StorageParams {}; + + public: enum { fancy = true }; private: @@ -1665,17 +1660,18 @@ class AvgFancy /** * Create and initialize this storage. */ - AvgFancy(const Params &) : sum(Counter()), squares(Counter()) {} + AvgFancy(Info *info) + : sum(Counter()), squares(Counter()) + {} /** * Add a value to the distribution for the given number of times. * Update the running sum and sum of squares. * @param val The value to add. * @param number The number of times to add the value. - * @param p The paramters of the distribution. */ void - sample(Counter val, int number, const Params &p) + sample(Counter val, int number) { Counter value = val * number; sum += value; @@ -1683,30 +1679,30 @@ class AvgFancy } void - update(DistData *data, const Params ¶ms) + update(Info *info, DistData &data) { - data->sum = sum; - data->squares = squares; - data->samples = curTick; + data.sum = sum; + data.squares = squares; + data.samples = curTick; } /** * Return the number of entries, in this case 1. * @return 1. */ - size_type size(const Params ¶ms) const { return 1; } + size_type size() const { return 1; } /** * Return true if no samples have been added. * @return True if the sum is zero. */ - bool zero(const Params ¶ms) const { return sum == Counter(); } + bool zero() const { return sum == Counter(); } /** * Reset stat value to default */ void - reset() + reset(Info *info) { sum = Counter(); squares = Counter(); @@ -1722,16 +1718,12 @@ class DistBase : public InfoAccess { public: typedef Stor Storage; - /** Define the params of the storage class. */ - typedef typename Storage::Params Params; + typedef typename Stor::Params Params; protected: /** The storage for this stat. */ char storage[sizeof(Storage)] __attribute__ ((aligned (8))); - /** The parameters for this stat. */ - Params params; - protected: /** * Retrieve the storage. @@ -1756,7 +1748,7 @@ class DistBase : public InfoAccess void doInit() { - new (storage) Storage(params); + new (storage) Storage(info()); setInit(); } @@ -1770,24 +1762,24 @@ class DistBase : public InfoAccess * @param n The number of times to add it, defaults to 1. */ template - void sample(const U &v, int n = 1) { data()->sample(v, n, params); } + void sample(const U &v, int n = 1) { data()->sample(v, n); } /** * Return the number of entries in this stat. * @return The number of entries. */ - size_type size() const { return data()->size(params); } + size_type size() const { return data()->size(); } /** * Return true if no samples have been added. * @return True if there haven't been any samples. */ - bool zero() const { return data()->zero(params); } + bool zero() const { return data()->zero(); } void update(DistInfoBase *base) { base->data.fancy = Storage::fancy; - data()->update(&(base->data), params); + data()->update(info(), base->data); } /** @@ -1796,7 +1788,7 @@ class DistBase : public InfoAccess void reset() { - data()->reset(); + data()->reset(info()); } bool @@ -1814,14 +1806,13 @@ class VectorDistBase : public InfoAccess { public: typedef Stor Storage; - typedef typename Storage::Params Params; + typedef typename Stor::Params Params; typedef DistProxy > Proxy; friend class DistProxy >; protected: Storage *storage; size_type _size; - Params params; protected: Storage * @@ -1847,7 +1838,7 @@ class VectorDistBase : public InfoAccess storage = reinterpret_cast(ptr); for (off_type i = 0; i < _size; ++i) - new (&storage[i]) Storage(params); + new (&storage[i]) Storage(info()); setInit(); } @@ -1881,7 +1872,7 @@ class VectorDistBase : public InfoAccess return false; #if 0 for (off_type i = 0; i < size(); ++i) - if (!data(i)->zero(params)) + if (!data(i)->zero()) return false; return true; #endif @@ -1894,7 +1885,7 @@ class VectorDistBase : public InfoAccess reset() { for (off_type i = 0; i < size(); ++i) - data(i)->reset(); + data(i)->reset(info()); } bool @@ -1910,7 +1901,7 @@ class VectorDistBase : public InfoAccess base->data.resize(size); for (off_type i = 0; i < size; ++i) { base->data[i].fancy = Storage::fancy; - data(i)->update(&(base->data[i]), params); + data(i)->update(info(), base->data[i]); } } }; @@ -1948,7 +1939,7 @@ class DistProxy void sample(const U &v, int n = 1) { - data()->sample(v, n, stat->params); + data()->sample(v, n); } size_type @@ -1960,7 +1951,7 @@ class DistProxy bool zero() const { - return data()->zero(stat->params); + return data()->zero(); } /** @@ -1984,7 +1975,7 @@ VectorDistBase::total(off_type index) const { Result total = 0; for (off_type i = 0; i < x_size(); ++i) - total += data(i)->result(stat->params); + total += data(i)->result(); } #endif @@ -2528,8 +2519,6 @@ class Distribution public: /** Base implementation. */ typedef DistBase Base; - /** The Parameter type. */ - typedef DistStor::Params Params; public: /** @@ -2542,10 +2531,12 @@ class Distribution Distribution & init(Counter min, Counter max, Counter bkt) { - this->params.min = min; - this->params.max = max; - this->params.bucket_size = bkt; - this->params.size = (size_type)rint((max - min) / bkt + 1.0); + DistStor::Params *params = new DistStor::Params; + params->min = min; + params->max = max; + params->bucket_size = bkt; + params->buckets = (size_type)rint((max - min) / bkt + 1.0); + this->setParams(params); this->doInit(); return *this; } @@ -2562,8 +2553,6 @@ class StandardDeviation public: /** The base implementation */ typedef DistBase Base; - /** The parameter type. */ - typedef DistStor::Params Params; public: /** @@ -2586,8 +2575,6 @@ class AverageDeviation public: /** The base implementation */ typedef DistBase Base; - /** The parameter type. */ - typedef DistStor::Params Params; public: /** @@ -2612,8 +2599,6 @@ class VectorDistribution public: /** The base implementation */ typedef VectorDistBase Base; - /** The parameter type. */ - typedef DistStor::Params Params; public: /** @@ -2627,10 +2612,12 @@ class VectorDistribution VectorDistribution & init(size_type size, Counter min, Counter max, Counter bkt) { - this->params.min = min; - this->params.max = max; - this->params.bucket_size = bkt; - this->params.size = rint((max - min) / bkt + 1.0); + DistStor::Params *params = new DistStor::Params; + params->min = min; + params->max = max; + params->bucket_size = bkt; + params->buckets = rint((max - min) / bkt + 1.0); + this->setParams(params); this->doInit(size); return *this; } @@ -2649,8 +2636,6 @@ class VectorStandardDeviation public: /** The base implementation */ typedef VectorDistBase Base; - /** The parameter type. */ - typedef DistStor::Params Params; public: /** @@ -2679,8 +2664,6 @@ class VectorAverageDeviation public: /** The base implementation */ typedef VectorDistBase Base; - /** The parameter type. */ - typedef DistStor::Params Params; public: /** -- cgit v1.2.3