changeset beaf1afe2f83 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=beaf1afe2f83
description:
        mem: Add callback to compute stats prior to dump event

        The per rank statistics are periodically updated based on
        state transition and refresh events.

        Add a method to update these when a dump event occurs to
        ensure they reflect accurate values.
        Specifically, need to ensure that the low-power state
        durations, power, and energy are logged correctly.

        Change-Id: Ib642a6668340de8f494a608bb34982e58ba7f1eb
        Reviewed-by: Radhika Jagtap <radhika.jag...@arm.com>

diffstat:

 src/mem/dram_ctrl.cc |  20 ++++++++++++++++++++
 src/mem/dram_ctrl.hh |  18 ++++++++++++++++++
 2 files changed, 38 insertions(+), 0 deletions(-)

diffs (79 lines):

diff -r 8a882e297eb2 -r beaf1afe2f83 src/mem/dram_ctrl.cc
--- a/src/mem/dram_ctrl.cc      Thu Oct 13 19:22:11 2016 +0100
+++ b/src/mem/dram_ctrl.cc      Thu Oct 13 19:22:11 2016 +0100
@@ -1857,6 +1857,24 @@
 }
 
 void
+DRAMCtrl::Rank::computeStats()
+{
+    DPRINTF(DRAM,"Computing final stats\n");
+
+    // Force DRAM power to update counters based on time spent in
+    // current state up to curTick()
+    cmdList.push_back(Command(MemCommand::NOP, 0, curTick()));
+
+    // Update the stats
+    updatePowerStats();
+
+    // final update of power state times
+    pwrStateTime[pwrState] += (curTick() - pwrStateTick);
+    pwrStateTick = curTick();
+
+}
+
+void
 DRAMCtrl::Rank::regStats()
 {
     using namespace Stats;
@@ -1906,6 +1924,8 @@
     averagePower
         .name(name() + ".averagePower")
         .desc("Core power per rank (mW)");
+
+    registerDumpCallback(new RankDumpCallback(this));
 }
 void
 DRAMCtrl::regStats()
diff -r 8a882e297eb2 -r beaf1afe2f83 src/mem/dram_ctrl.hh
--- a/src/mem/dram_ctrl.hh      Thu Oct 13 19:22:11 2016 +0100
+++ b/src/mem/dram_ctrl.hh      Thu Oct 13 19:22:11 2016 +0100
@@ -56,6 +56,7 @@
 #include <string>
 #include <unordered_set>
 
+#include "base/callback.hh"
 #include "base/statistics.hh"
 #include "enums/AddrMap.hh"
 #include "enums/MemSched.hh"
@@ -409,6 +410,11 @@
          */
         void regStats();
 
+        /**
+         * Computes stats just prior to dump event
+         */
+        void computeStats();
+
         void processActivateEvent();
         EventWrapper<Rank, &Rank::processActivateEvent>
         activateEvent;
@@ -427,6 +433,18 @@
 
     };
 
+    // define the process to compute stats on simulation exit
+    // defined per rank as the per rank stats are based on state
+    // transition and periodically updated, requiring re-sync at
+    // exit.
+    class RankDumpCallback : public Callback
+    {
+        Rank *ranks;
+      public:
+        RankDumpCallback(Rank *r) : ranks(r) {}
+        virtual void process() { ranks->computeStats(); };
+    };
+
     /**
      * A burst helper helps organize and manage a packet that is larger than
      * the DRAM burst size. A system packet that is larger than the burst size
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to