diff options
-rw-r--r-- | base/statistics.cc | 34 | ||||
-rw-r--r-- | cpu/simple_cpu/simple_cpu.cc | 9 | ||||
-rw-r--r-- | cpu/simple_cpu/simple_cpu.hh | 8 | ||||
-rw-r--r-- | sim/main.cc | 20 | ||||
-rw-r--r-- | sim/sim_time.cc | 14 | ||||
-rw-r--r-- | sim/sim_time.hh | 4 |
6 files changed, 58 insertions, 31 deletions
diff --git a/base/statistics.cc b/base/statistics.cc index 5f21e4de7..1ffbeb690 100644 --- a/base/statistics.cc +++ b/base/statistics.cc @@ -265,19 +265,27 @@ Database::check() void Database::reset() { - list<GenBin *>::iterator bi = bins.begin(); - list<GenBin *>::iterator be = bins.end(); list_t::iterator i = allStats.begin(); list_t::iterator end = allStats.end(); - - while (bi != be) { - (*bi)->activate(); - - while (i != end) { - (*i)->reset(); + while (i != end) { + Stat *stat = *i; + stat->reset(); ++i; - } - ++bi; + } + + list<GenBin *>::iterator bi = bins.begin(); + list<GenBin *>::iterator be = bins.end(); + while (bi != be) { + GenBin *bin = *bi; + bin->activate(); + + i = allStats.begin(); + while (i != end) { + Stat *stat = *i; + stat->reset(); + ++i; + } + ++bi; } } @@ -736,7 +744,7 @@ VectorDisplay(std::ostream &stream, _pdf = vec[i] / _total; _cdf += _pdf; } else { - _pdf = _cdf = 0.0; + _pdf = _cdf = NAN; } if (!(myflags & cdf)) { PrintOne(stream, vec[i], subname, subdesc, myprecision, @@ -768,10 +776,8 @@ VectorDisplay(std::ostream &stream, _pdf = vec[i] / _total; _cdf += _pdf; } else { - _pdf = _cdf = 0.0; + _pdf = _cdf = NAN; } - _pdf = vec[i] / _total; - _cdf += _pdf; PrintOne(stream, vec[i], name, mydesc, myprecision, myflags, _pdf, _cdf); } diff --git a/cpu/simple_cpu/simple_cpu.cc b/cpu/simple_cpu/simple_cpu.cc index 814902390..550b6c64f 100644 --- a/cpu/simple_cpu/simple_cpu.cc +++ b/cpu/simple_cpu/simple_cpu.cc @@ -160,7 +160,6 @@ SimpleCPU::SimpleCPU(const string &_name, Process *_process, numInst = 0; numLoad = 0; - last_idle = 0; lastIcacheStall = 0; lastDcacheStall = 0; @@ -171,7 +170,6 @@ SimpleCPU::~SimpleCPU() { } - void SimpleCPU::switchOut() { @@ -229,11 +227,6 @@ SimpleCPU::regStats() .desc("Number of memory references") ; - idleCycles - .name(name() + ".idle_cycles") - .desc("Number of idle cycles") - ; - idleFraction .name(name() + ".idle_fraction") .desc("Percentage of idle cycles") @@ -251,8 +244,6 @@ SimpleCPU::regStats() .prereq(dcacheStallCycles) ; - idleFraction = idleCycles / simTicks; - numInsts = Statistics::scalar(numInst); simInsts += numInsts; } diff --git a/cpu/simple_cpu/simple_cpu.hh b/cpu/simple_cpu/simple_cpu.hh index 6ad831218..d69d4e8de 100644 --- a/cpu/simple_cpu/simple_cpu.hh +++ b/cpu/simple_cpu/simple_cpu.hh @@ -207,7 +207,7 @@ class SimpleCPU : public BaseCPU case Idle: assert(old_status == Running); - last_idle = curTick; + idleFraction++; if (tickEvent.scheduled()) tickEvent.squash(); break; @@ -217,7 +217,7 @@ class SimpleCPU : public BaseCPU old_status == DcacheMissStall || old_status == IcacheMissComplete); if (old_status == Idle && curTick != 0) - idleCycles += curTick - last_idle; + idleFraction--; if (tickEvent.squashed()) tickEvent.reschedule(curTick + 1); @@ -244,9 +244,7 @@ class SimpleCPU : public BaseCPU Counter numLoad; // number of idle cycles - Statistics::Scalar<> idleCycles; - Statistics::Formula idleFraction; - Counter last_idle; + Statistics::Average<> idleFraction; // number of cycles stalled for I-cache misses Statistics::Scalar<> icacheStallCycles; diff --git a/sim/main.cc b/sim/main.cc index addedbc85..4fb075a2a 100644 --- a/sim/main.cc +++ b/sim/main.cc @@ -59,6 +59,7 @@ using namespace std; // See async.h. volatile bool async_event = false; volatile bool async_dump = false; +volatile bool async_dumpreset = false; volatile bool async_exit = false; volatile bool async_io = false; volatile bool async_alarm = false; @@ -71,6 +72,13 @@ dumpStatsHandler(int sigtype) async_dump = true; } +void +dumprstStatsHandler(int sigtype) +{ + async_event = true; + async_dumpreset = true; +} + /// Exit signal handler. void exitNowHandler(int sigtype) @@ -219,8 +227,9 @@ main(int argc, char **argv) signal(SIGFPE, SIG_IGN); // may occur on misspeculated paths signal(SIGPIPE, SIG_IGN); signal(SIGTRAP, SIG_IGN); - signal(SIGUSR1, dumpStatsHandler); // dump intermediate stats - signal(SIGINT, exitNowHandler); // dump final stats and exit + signal(SIGUSR1, dumpStatsHandler); // dump intermediate stats + signal(SIGUSR2, dumprstStatsHandler); // dump and reset stats + signal(SIGINT, exitNowHandler); // dump final stats and exit sayHello(cerr); @@ -405,6 +414,13 @@ main(int argc, char **argv) SetupEvent(Dump, curTick); } + if (async_dumpreset) { + async_dumpreset = false; + + using namespace Statistics; + SetupEvent(Dump | Reset, curTick); + } + if (async_exit) { async_exit = false; new SimExitEvent("User requested STOP"); diff --git a/sim/sim_time.cc b/sim/sim_time.cc index 70483d9a2..09c5a66de 100644 --- a/sim/sim_time.cc +++ b/sim/sim_time.cc @@ -65,6 +65,12 @@ namespace Time return start->tv; } + void + Start::reset() + { + ::gettimeofday(&start->tv, NULL); + } + double Start::operator()() const { @@ -115,10 +121,16 @@ namespace Time if (!elapsed) elapsed = new _timeval; - timersub(&now.get(), &start.get(), &elapsed->tv); + timersub(&_now.get(), &_start.get(), &elapsed->tv); return elapsed->tv; } + void + Elapsed::reset() + { + _start.reset(); + } + double Elapsed::operator()() const { diff --git a/sim/sim_time.hh b/sim/sim_time.hh index af69c3321..02ca5534f 100644 --- a/sim/sim_time.hh +++ b/sim/sim_time.hh @@ -45,6 +45,7 @@ namespace Time { ~Start(); const timeval &get() const; + void reset(); double operator()() const; }; @@ -65,12 +66,15 @@ namespace Time { { private: mutable _timeval *elapsed; + Start _start; + Now _now; public: Elapsed(); ~Elapsed(); const timeval &get() const; + void reset(); double operator()() const; }; |