Can you give me an exact command line? Nate
On Wed, Jul 28, 2010 at 12:10 PM, Ali Saidi <[email protected]> wrote: > 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-dev > _______________________________________________ > 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-dev
