diff options
-rw-r--r-- | configs/common/Options.py | 2 | ||||
-rw-r--r-- | configs/common/Simulation.py | 4 | ||||
-rw-r--r-- | src/cpu/base.cc | 29 | ||||
-rw-r--r-- | src/cpu/base.hh | 10 | ||||
-rw-r--r-- | src/cpu/inorder/cpu.hh | 11 |
5 files changed, 42 insertions, 14 deletions
diff --git a/configs/common/Options.py b/configs/common/Options.py index e5d867cfa..0ddd2f06d 100644 --- a/configs/common/Options.py +++ b/configs/common/Options.py @@ -38,6 +38,8 @@ parser.add_option("--fastmem", action="store_true") # Run duration options parser.add_option("-m", "--maxtick", type="int") parser.add_option("--maxtime", type="float") +parser.add_option("--prog_intvl", type="int") + # Checkpointing options ###Note that performing checkpointing via python script files will override diff --git a/configs/common/Simulation.py b/configs/common/Simulation.py index 0004e4fe6..d7dde241c 100644 --- a/configs/common/Simulation.py +++ b/configs/common/Simulation.py @@ -91,6 +91,10 @@ def run(options, root, testsys, cpu_class): max_checkpoints = options.max_checkpoints switch_cpus = None + if options.prog_intvl: + for i in xrange(np): + testsys.cpu[i].progress_interval = options.prog_intvl + if cpu_class: switch_cpus = [cpu_class(defer_registration=True, cpu_id=(np+i)) for i in xrange(np)] diff --git a/src/cpu/base.cc b/src/cpu/base.cc index 0ef206d90..78ff4f998 100644 --- a/src/cpu/base.cc +++ b/src/cpu/base.cc @@ -61,11 +61,11 @@ vector<BaseCPU *> BaseCPU::cpuList; int maxThreadsPerCPU = 1; CPUProgressEvent::CPUProgressEvent(BaseCPU *_cpu, Tick ival) - : Event(Event::Progress_Event_Pri), interval(ival), lastNumInst(0), - cpu(_cpu) + : Event(Event::Progress_Event_Pri), _interval(ival), lastNumInst(0), + cpu(_cpu), _repeatEvent(true) { - if (interval) - cpu->schedule(this, curTick + interval); + if (_interval) + cpu->schedule(this, curTick + _interval); } void @@ -73,17 +73,21 @@ CPUProgressEvent::process() { Counter temp = cpu->totalInstructions(); #ifndef NDEBUG - double ipc = double(temp - lastNumInst) / (interval / cpu->ticks(1)); + double ipc = double(temp - lastNumInst) / (_interval / cpu->ticks(1)); - DPRINTFN("%s progress event, instructions committed: %lli, IPC: %0.8d\n", - cpu->name(), temp - lastNumInst, ipc); + DPRINTFN("%s progress event, total committed:%i, progress insts committed: " + "%lli, IPC: %0.8d\n", cpu->name(), temp, temp - lastNumInst, + ipc); ipc = 0.0; #else - cprintf("%lli: %s progress event, instructions committed: %lli\n", - curTick, cpu->name(), temp - lastNumInst); + cprintf("%lli: %s progress event, total committed:%i, progress insts " + "committed: %lli\n", curTick, cpu->name(), temp, + temp - lastNumInst); #endif lastNumInst = temp; - cpu->schedule(this, curTick + interval); + + if (_repeatEvent) + cpu->schedule(this, curTick + _interval); } const char * @@ -230,8 +234,9 @@ BaseCPU::startup() if (params()->progress_interval) { Tick num_ticks = ticks(params()->progress_interval); - Event *event = new CPUProgressEvent(this, num_ticks); - schedule(event, curTick + num_ticks); + + Event *event; + event = new CPUProgressEvent(this, num_ticks); } } diff --git a/src/cpu/base.hh b/src/cpu/base.hh index 8af3295eb..e63960cc1 100644 --- a/src/cpu/base.hh +++ b/src/cpu/base.hh @@ -61,15 +61,21 @@ namespace TheISA class CPUProgressEvent : public Event { protected: - Tick interval; + Tick _interval; Counter lastNumInst; BaseCPU *cpu; + bool _repeatEvent; public: - CPUProgressEvent(BaseCPU *_cpu, Tick ival); + CPUProgressEvent(BaseCPU *_cpu, Tick ival = 0); void process(); + void interval(Tick ival) { _interval = ival; } + Tick interval() { return _interval; } + + void repeatEvent(bool repeat) { _repeatEvent = repeat; } + virtual const char *description() const; }; diff --git a/src/cpu/inorder/cpu.hh b/src/cpu/inorder/cpu.hh index 0545f4bf8..744dd5cf9 100644 --- a/src/cpu/inorder/cpu.hh +++ b/src/cpu/inorder/cpu.hh @@ -589,6 +589,17 @@ class InOrderCPU : public BaseCPU return thread[tid]->getTC(); } + /** Count the Total Instructions Committed in the CPU. */ + virtual Counter totalInstructions() const + { + Counter total(0); + + for (int i=0; i < thread.size(); i++) + total += thread[i]->numInst; + + return total; + } + /** The global sequence number counter. */ InstSeqNum globalSeqNum[ThePipeline::MaxThreads]; |