mem: Add callback to compute stats prior to dump event
authorWendy Elsasser <wendy.elsasser@arm.com>
Thu, 13 Oct 2016 18:22:11 +0000 (19:22 +0100)
committerWendy Elsasser <wendy.elsasser@arm.com>
Thu, 13 Oct 2016 18:22:11 +0000 (19:22 +0100)
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.jagtap@arm.com>
src/mem/dram_ctrl.cc
src/mem/dram_ctrl.hh

index e13c2af02aecfce0b3802f1a200be82c1bce44c4..2866925c348b448f3e5e4270b27bfa2c395a8f97 100644 (file)
@@ -1856,6 +1856,24 @@ DRAMCtrl::Rank::updatePowerStats()
     averagePower = rank_power.average_power * memory.devicesPerRank;
 }
 
+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()
 {
@@ -1906,6 +1924,8 @@ DRAMCtrl::Rank::regStats()
     averagePower
         .name(name() + ".averagePower")
         .desc("Core power per rank (mW)");
+
+    registerDumpCallback(new RankDumpCallback(this));
 }
 void
 DRAMCtrl::regStats()
index 79a68af4b004e9aa4323a20013fe40db5d84f828..b59ed3d2c1c2436fc21206f7867ee2125e4a61b1 100644 (file)
@@ -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 @@ class DRAMCtrl : public AbstractMemory
          */
         void regStats();
 
+        /**
+         * Computes stats just prior to dump event
+         */
+        void computeStats();
+
         void processActivateEvent();
         EventWrapper<Rank, &Rank::processActivateEvent>
         activateEvent;
@@ -427,6 +433,18 @@ class DRAMCtrl : public AbstractMemory
 
     };
 
+    // 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