Actually, it only appeared to fix the problem. It's still using some bad
pointer/freed memory, it just didn't die with an assert. If you apply this
patch to the simple cpu and run valgrind on M5 you can see that the stat is
accessing freed memory.
Ali
On Thu, 22 Jul 2010 12:47:53 -0400, Ali Saidi <[email protected]> wrote:
> This fixed my problem... Thanks Nate!
>
> Ali
>
>
> On Wed, 21 Jul 2010 21:54:56 -0400, Nathan Binkert
>
> <[email protected]>
> wrote:
>> changeset 7772a8bf76ee in /z/repo/m5
>> details: http://repo.m5sim.org/m5?cmd=changeset;node=7772a8bf76ee
>> description:
>> stats: unify the two stats distribution type better
>>
>> diffstat:
>>
>> src/base/statistics.hh | 34 ++++++++++++++++++++++++++++++++++
>> src/base/stats/info.hh | 31 ++++++++-----------------------
>> src/base/stats/mysql.cc | 14 ++++++++------
>> src/base/stats/text.cc | 36 ++++++++----------------------------
>> 4 files changed, 58 insertions(+), 57 deletions(-)
>>
>> diffs (257 lines):
>>
>> diff -r ad631c296c9b -r 7772a8bf76ee src/base/statistics.hh
>> --- a/src/base/statistics.hh Wed Jul 21 15:53:53 2010 -0700
>> +++ b/src/base/statistics.hh Wed Jul 21 18:54:53 2010 -0700
>> @@ -160,6 +160,11 @@
>> Vector2dInfoProxy(Stat &stat) : InfoProxy<Stat,
Vector2dInfo>(stat)
> {}
>> };
>>
>> +struct StorageParams
>> +{
>> + virtual ~StorageParams();
>> +};
>> +
>> class InfoAccess
>> {
>> protected:
>> @@ -1269,6 +1274,12 @@
>> // Non formula statistics
>> //
>> //////////////////////////////////////////////////////////////////////
>> +/** The parameters for a distribution stat. */
>> +struct DistParams : public StorageParams
>> +{
>> + const DistType type;
>> + DistParams(DistType t) : type(t) {}
>> +};
>>
>> /**
>> * Templatized storage and interface for a distrbution stat.
>> @@ -1279,6 +1290,15 @@
>> /** The parameters for a distribution stat. */
>> struct Params : public DistParams
>> {
>> + /** The minimum value to track. */
>> + Counter min;
>> + /** The maximum value to track. */
>> + Counter max;
>> + /** The number of entries in each bucket. */
>> + Counter bucket_size;
>> + /** The number of buckets. Equal to (max-min)/bucket_size. */
>> + size_type buckets;
>> +
>> Params() : DistParams(Dist) {}
>> };
>>
>> @@ -1368,6 +1388,12 @@
>> {
>> const Params *params = safe_cast<const Params
>> *>(info->storageParams);
>>
>> + assert(params->type == Dist);
>> + data.type = params->type;
>> + data.min = params->min;
>> + data.max = params->max;
>> + data.bucket_size = params->bucket_size;
>> +
>> data.min_val = (min_val == CounterLimits::max()) ? 0 :
min_val;
>> data.max_val = (max_val == CounterLimits::min()) ? 0 :
max_val;
>> data.underflow = underflow;
>> @@ -1468,6 +1494,10 @@
>> void
>> prepare(Info *info, DistData &data)
>> {
>> + const Params *params = safe_cast<const Params
>> *>(info->storageParams);
>> +
>> + assert(params->type == Deviation);
>> + data.type = params->type;
>> data.sum = sum;
>> data.squares = squares;
>> data.samples = samples;
>> @@ -1540,6 +1570,10 @@
>> void
>> prepare(Info *info, DistData &data)
>> {
>> + const Params *params = safe_cast<const Params
>> *>(info->storageParams);
>> +
>> + assert(params->type == Deviation);
>> + data.type = params->type;
>> data.sum = sum;
>> data.squares = squares;
>> data.samples = curTick;
>> diff -r ad631c296c9b -r 7772a8bf76ee src/base/stats/info.hh
>> --- a/src/base/stats/info.hh Wed Jul 21 15:53:53 2010 -0700
>> +++ b/src/base/stats/info.hh Wed Jul 21 18:54:53 2010 -0700
>> @@ -61,11 +61,7 @@
>> /** Mask of flags that can't be set directly */
>> const FlagsType __reserved = init | display;
>>
>> -struct StorageParams
>> -{
>> - virtual ~StorageParams();
>> -};
>> -
>> +struct StorageParams;
>> struct Visit;
>>
>> class Info
>> @@ -168,8 +164,15 @@
>> virtual Result total() const = 0;
>> };
>>
>> +enum DistType { Deviation, Dist };
>> +
>> struct DistData
>> {
>> + DistType type;
>> + Counter min;
>> + Counter max;
>> + Counter bucket_size;
>> +
>> Counter min_val;
>> Counter max_val;
>> Counter underflow;
>> @@ -180,24 +183,6 @@
>> Counter samples;
>> };
>>
>> -enum DistType { Deviation, Dist };
>> -
>> -struct DistParams : public StorageParams
>> -{
>> - const DistType type;
>> -
>> - /** The minimum value to track. */
>> - Counter min;
>> - /** The maximum value to track. */
>> - Counter max;
>> - /** The number of entries in each bucket. */
>> - Counter bucket_size;
>> - /** The number of buckets. Equal to (max-min)/bucket_size. */
>> - size_type buckets;
>> -
>> - explicit DistParams(DistType t) : type(t) {}
>> -};
>> -
>> class DistInfo : public Info
>> {
>> public:
>> diff -r ad631c296c9b -r 7772a8bf76ee src/base/stats/mysql.cc
>> --- a/src/base/stats/mysql.cc Wed Jul 21 15:53:53 2010 -0700
>> +++ b/src/base/stats/mysql.cc Wed Jul 21 18:54:53 2010 -0700
>> @@ -481,9 +481,10 @@
>> if (!configure(info, "DIST"))
>> return;
>>
>> - const DistParams *params =
>> - safe_cast<const DistParams *>(info.storageParams);
>> - if (params->type == Dist) {
>> + const DistStor::Params *params =
>> + dynamic_cast<const DistStor::Params *>(info.storageParams);
>> + if (params) {
>> + assert(params->type == Dist);
>> stat.size = params->buckets;
>> stat.min = params->min;
>> stat.max = params->max;
>> @@ -498,9 +499,10 @@
>> if (!configure(info, "VECTORDIST"))
>> return;
>>
>> - const DistParams *params =
>> - safe_cast<const DistParams *>(info.storageParams);
>> - if (params->type == Dist) {
>> + const DistStor::Params *params =
>> + dynamic_cast<const DistStor::Params *>(info.storageParams);
>> + if (params) {
>> + assert(params->type == Dist);
>> stat.size = params->buckets;
>> stat.min = params->min;
>> stat.max = params->max;
>> diff -r ad631c296c9b -r 7772a8bf76ee src/base/stats/text.cc
>> --- a/src/base/stats/text.cc Wed Jul 21 15:53:53 2010 -0700
>> +++ b/src/base/stats/text.cc Wed Jul 21 18:54:53 2010 -0700
>> @@ -306,30 +306,24 @@
>> bool descriptions;
>> int precision;
>>
>> - Counter min;
>> - Counter max;
>> - Counter bucket_size;
>> - size_type size;
>> - DistType type;
>> -
>> const DistData &data;
>>
>> DistPrint(const Text *text, const DistInfo &info);
>> DistPrint(const Text *text, const VectorDistInfo &info, int i);
>> - void init(const Text *text, const Info &info, const DistParams
>> *params);
>> + void init(const Text *text, const Info &info);
>> void operator()(ostream &stream) const;
>> };
>>
>> DistPrint::DistPrint(const Text *text, const DistInfo &info)
>> : data(info.data)
>> {
>> - init(text, info, safe_cast<const DistParams
> *>(info.storageParams));
>> + init(text, info);
>> }
>>
>> DistPrint::DistPrint(const Text *text, const VectorDistInfo &info, int
> i)
>> : data(info.data[i])
>> {
>> - init(text, info, safe_cast<const DistParams
> *>(info.storageParams));
>> + init(text, info);
>>
>> name = info.name + "_" +
>> (info.subnames[i].empty() ? (to_string(i)) :
info.subnames[i]);
>> @@ -339,27 +333,13 @@
>> }
>>
>> void
>> -DistPrint::init(const Text *text, const Info &info, const DistParams
>> *params)
>> +DistPrint::init(const Text *text, const Info &info)
>> {
>> name = info.name;
>> desc = info.desc;
>> flags = info.flags;
>> precision = info.precision;
>> descriptions = text->descriptions;
>> -
>> - type = params->type;
>> - switch (type) {
>> - case Dist:
>> - min = params->min;
>> - max = params->max;
>> - bucket_size = params->bucket_size;
>> - size = params->buckets;
>> - break;
>> - case Deviation:
>> - break;
>> - default:
>> - panic("unknown distribution type");
>> - }
>> }
>>
>> void
>> @@ -391,10 +371,10 @@
>> print.value = stdev;
>> print(stream);
>>
>> - if (type == Deviation)
>> + if (data.type == Deviation)
>> return;
>>
>> - assert(size == data.cvec.size());
>> + size_t size = data.cvec.size();
>>
>> Result total = 0.0;
>> if (data.underflow != NAN)
>> @@ -419,8 +399,8 @@
>> stringstream namestr;
>> namestr << base;
>>
>> - Counter low = i * bucket_size + min;
>> - Counter high = ::min(low + bucket_size - 1.0, max);
>> + Counter low = i * data.bucket_size + data.min;
>> + Counter high = ::min(low + data.bucket_size - 1.0, data.max);
>> namestr << low;
>> if (low < high)
>> namestr << "-" << high;
>> _______________________________________________
>> m5-dev mailing list
>> [email protected]
>> http://m5sim.org/mailman/listinfo/m5-dev
> _______________________________________________
> m5-dev mailing list
> [email protected]
> http://m5sim.org/mailman/listinfo/m5-devdiff -r b28e7286990c src/cpu/simple/base.cc
--- a/src/cpu/simple/base.cc Tue Jul 27 20:00:38 2010 -0700
+++ b/src/cpu/simple/base.cc Tue Jul 27 23:34:45 2010 -0500
@@ -137,6 +137,11 @@
BaseCPU::regStats();
+ testStat
+ .name(name() + ".foo")
+ .desc("foo")
+ ;
+
numInsts
.name(name() + ".num_insts")
.desc("Number of instructions executed")
diff -r b28e7286990c src/cpu/simple/base.hh
--- a/src/cpu/simple/base.hh Tue Jul 27 20:00:38 2010 -0700
+++ b/src/cpu/simple/base.hh Tue Jul 27 23:34:45 2010 -0500
@@ -220,6 +220,9 @@
Stats::Scalar dcacheRetryCycles;
Counter lastDcacheRetry;
+ Stats::StandardDeviation testStat;
+
+
virtual void serialize(std::ostream &os);
virtual void unserialize(Checkpoint *cp, const std::string §ion);
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev