Eden Avivi has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/33875 )

Change subject: cpu: convert trace cpu to new style stats
......................................................................

cpu: convert trace cpu to new style stats

Change-Id: I9f97d4006a0edbd717fc34d0033b9548011d1631
---
M src/cpu/trace/trace_cpu.cc
M src/cpu/trace/trace_cpu.hh
2 files changed, 105 insertions(+), 170 deletions(-)



diff --git a/src/cpu/trace/trace_cpu.cc b/src/cpu/trace/trace_cpu.cc
index dd91257..035a89b 100644
--- a/src/cpu/trace/trace_cpu.cc
+++ b/src/cpu/trace/trace_cpu.cc
@@ -60,7 +60,7 @@
         execCompleteEvent(nullptr),
         enableEarlyExit(params->enableEarlyExit),
         progressMsgInterval(params->progressMsgInterval),
-        progressMsgThreshold(params->progressMsgInterval)
+        progressMsgThreshold(params->progressMsgInterval), traceStats(this)
 {
     // Increment static counter for number of Trace CPUs.
     ++TraceCPU::numTraceCPUs;
@@ -91,8 +91,9 @@
 void
 TraceCPU::updateNumOps(uint64_t rob_num)
 {
-    numOps = rob_num;
- if (progressMsgInterval != 0 && numOps.value() >= progressMsgThreshold) {
+    traceStats.numOps = rob_num;
+    if (progressMsgInterval != 0 &&
+         traceStats.numOps.value() >= progressMsgThreshold) {
         inform("%s: %i insts committed\n", name(), progressMsgThreshold);
         progressMsgThreshold += progressMsgInterval;
     }
@@ -161,7 +162,7 @@
         DPRINTF(TraceCPUInst, "Scheduling next icacheGen event "
                 "at %d.\n", curTick() + icacheGen.tickDelta());
         schedule(icacheNextEvent, curTick() + icacheGen.tickDelta());
-        ++numSchedIcacheEvent;
+        ++traceStats.numSchedIcacheEvent;
     } else {
// check if traceComplete. If not, do nothing because sending failed
         // and next event will be scheduled via RecvRetry()
@@ -208,93 +209,33 @@
         }
     }
 }
-
-void
-TraceCPU::regStats()
+ TraceCPU::TraceStats::TraceStats(TraceCPU *trace)
+    : Stats::Group(trace),
+    ADD_STAT(numSchedDcacheEvent,
+     "Number of events scheduled to trigger data request generator"),
+    ADD_STAT(numSchedIcacheEvent,
+ "Number of events scheduled to trigger instruction request generator"),
+    ADD_STAT(numOps, "Number of micro-ops simulated by the Trace CPU"),
+    ADD_STAT(cpi, "Cycles per micro-op used as a proxy for CPI",
+     trace->numCycles / numOps)
+    {
+        cpi
+            .precision(6);
+    }
+TraceCPU::ElasticDataGen::
+ElasticDataGenStatGroup::ElasticDataGenStatGroup(Stats::Group *parent)
+    : Stats::Group(parent),
+    ADD_STAT(maxDependents, "Max number of dependents observed on a node"),
+    ADD_STAT(maxReadyListSize, "Max size of the ready list observed"),
+ ADD_STAT(numSendAttempted, "Number of first attempts to send a request"),
+    ADD_STAT(numSendSucceeded, "Number of successful first attempts"),
+    ADD_STAT(numSendFailed, "Number of failed first attempts"),
+    ADD_STAT(numRetrySucceeded, "Number of successful retries"),
+    ADD_STAT(numSplitReqs, "Number of split requests"),
+    ADD_STAT(numSOLoads, "Number of strictly ordered loads"),
+    ADD_STAT(numSOStores, "Number of strictly ordered stores"),
+ ADD_STAT(dataLastTick, "Last tick simulated from the elastic data trace")
 {
-
-    BaseCPU::regStats();
-
-    numSchedDcacheEvent
-    .name(name() + ".numSchedDcacheEvent")
-    .desc("Number of events scheduled to trigger data request generator")
-    ;
-
-    numSchedIcacheEvent
-    .name(name() + ".numSchedIcacheEvent")
- .desc("Number of events scheduled to trigger instruction request generator")
-    ;
-
-    numOps
-    .name(name() + ".numOps")
-    .desc("Number of micro-ops simulated by the Trace CPU")
-    ;
-
-    cpi
-    .name(name() + ".cpi")
-    .desc("Cycles per micro-op used as a proxy for CPI")
-    .precision(6)
-    ;
-    cpi = numCycles/numOps;
-
-    icacheGen.regStats();
-    dcacheGen.regStats();
-}
-
-void
-TraceCPU::ElasticDataGen::regStats()
-{
-    using namespace Stats;
-
-    maxDependents
-    .name(name() + ".maxDependents")
-    .desc("Max number of dependents observed on a node")
-    ;
-
-    maxReadyListSize
-    .name(name() + ".maxReadyListSize")
-    .desc("Max size of the ready list observed")
-    ;
-
-    numSendAttempted
-    .name(name() + ".numSendAttempted")
-    .desc("Number of first attempts to send a request")
-    ;
-
-    numSendSucceeded
-    .name(name() + ".numSendSucceeded")
-    .desc("Number of successful first attempts")
-    ;
-
-    numSendFailed
-    .name(name() + ".numSendFailed")
-    .desc("Number of failed first attempts")
-    ;
-
-    numRetrySucceeded
-    .name(name() + ".numRetrySucceeded")
-    .desc("Number of successful retries")
-    ;
-
-    numSplitReqs
-    .name(name() + ".numSplitReqs")
-    .desc("Number of split requests")
-    ;
-
-    numSOLoads
-    .name(name() + ".numSOLoads")
-    .desc("Number of strictly ordered loads")
-    ;
-
-    numSOStores
-    .name(name() + ".numSOStores")
-    .desc("Number of strictly ordered stores")
-    ;
-
-    dataLastTick
-    .name(name() + ".dataLastTick")
-    .desc("Last tick simulated from the elastic data trace")
-    ;
 }

 Tick
@@ -412,7 +353,8 @@
             // node.
             parent_itr->second->dependents.push_back(new_node);
             auto num_depts = parent_itr->second->dependents.size();
- maxDependents = std::max<double>(num_depts, maxDependents.value());
+            elasticStats.maxDependents =
+ std::max<double>(num_depts, elasticStats.maxDependents.value());
         } else {
             // The dependency is not found in the graph. So consider
             // the execution of the parent is complete, i.e. remove this
@@ -472,7 +414,7 @@
                       "the first node in the readyList.\n");
             }
             if (port.sendTimingReq(retryPkt)) {
-                ++numRetrySucceeded;
+                ++elasticStats.numRetrySucceeded;
                 retryPkt = nullptr;
             }
         } else if (node_ptr->isLoad() || node_ptr->isStore()) {
@@ -613,7 +555,7 @@
         !hwResource.awaitingResponse()) {
         DPRINTF(TraceCPUData, "\tExecution Complete!\n");
         execComplete = true;
-        dataLastTick = curTick();
+        elasticStats.dataLastTick = curTick();
     }
 }

@@ -629,7 +571,8 @@
// If the request is strictly ordered, do not send it. Just return nullptr
     // as if it was succesfully sent.
     if (node_ptr->isStrictlyOrdered()) {
-        node_ptr->isLoad() ? ++numSOLoads : ++numSOStores;
+        node_ptr->isLoad() ? ++elasticStats.numSOLoads :
+             ++elasticStats.numSOStores;
         DPRINTF(TraceCPUData, "Skipping strictly ordered request %lli.\n",
                 node_ptr->seqNum);
         return nullptr;
@@ -645,7 +588,7 @@
     Addr blk_offset = (node_ptr->physAddr & (Addr)(blk_size - 1));
     if (!(blk_offset + node_ptr->size <= blk_size)) {
         node_ptr->size = blk_size - blk_offset;
-        ++numSplitReqs;
+        ++elasticStats.numSplitReqs;
     }

     // Create a request and the packet containing request
@@ -675,17 +618,17 @@

     // Call MasterPort method to send a timing request for this packet
     bool success = port.sendTimingReq(pkt);
-    ++numSendAttempted;
+    ++elasticStats.numSendAttempted;

     if (!success) {
// If it fails, return the packet to retry when a retry is signalled by
         // the cache
-        ++numSendFailed;
+        ++elasticStats.numSendFailed;
         DPRINTF(TraceCPUData, "Send failed. Saving packet for retry.\n");
         return pkt;
     } else {
         // It is succeeds, return nullptr
-        ++numSendSucceeded;
+        ++elasticStats.numSendSucceeded;
         return nullptr;
     }
 }
@@ -812,8 +755,9 @@
     // and return
     if (itr == readyList.end()) {
         readyList.insert(itr, ready_node);
-        maxReadyListSize = std::max<double>(readyList.size(),
-                                              maxReadyListSize.value());
+        elasticStats.maxReadyListSize =
+         std::max<double>(readyList.size(),
+         elasticStats.maxReadyListSize.value());
         return;
     }

@@ -850,8 +794,9 @@
     }
     readyList.insert(itr, ready_node);
     // Update the stat for max size reached of the readyList
-    maxReadyListSize = std::max<double>(readyList.size(),
-                                          maxReadyListSize.value());
+    elasticStats.maxReadyListSize =
+     std::max<double>(readyList.size(),
+     elasticStats.maxReadyListSize.value());
 }

 void
@@ -1007,36 +952,16 @@
             numInFlightLoads, sizeLoadBuffer,
             numInFlightStores, sizeStoreBuffer);
 }
-
-void
-TraceCPU::FixedRetryGen::regStats()
+TraceCPU::FixedRetryGen::
+FixedRetryGenStatGroup::FixedRetryGenStatGroup(Stats::Group *parent)
+    : Stats::Group(parent),
+ ADD_STAT(numSendAttempted, "Number of first attempts to send a request"),
+    ADD_STAT(numSendSucceeded, "Number of successful first attempts"),
+    ADD_STAT(numSendFailed, "Number of failed first attempts"),
+    ADD_STAT(numRetrySucceeded, "Number of successful retries"),
+    ADD_STAT(instLastTick, "Last tick simulated from the fixed inst trace")
 {
-    using namespace Stats;

-    numSendAttempted
-    .name(name() + ".numSendAttempted")
-    .desc("Number of first attempts to send a request")
-    ;
-
-    numSendSucceeded
-    .name(name() + ".numSendSucceeded")
-    .desc("Number of successful first attempts")
-    ;
-
-    numSendFailed
-    .name(name() + ".numSendFailed")
-    .desc("Number of failed first attempts")
-    ;
-
-    numRetrySucceeded
-    .name(name() + ".numRetrySucceeded")
-    .desc("Number of successful retries")
-    ;
-
-    instLastTick
-    .name(name() + ".instLastTick")
-    .desc("Last tick simulated from the fixed inst trace")
-    ;
 }

 Tick
@@ -1067,7 +992,7 @@
             DPRINTF(TraceCPUInst, "Retry packet sending failed.\n");
             return false;
         }
-        ++numRetrySucceeded;
+        ++fixedStats.numRetrySucceeded;
     } else {

         DPRINTF(TraceCPUInst, "Trying to send packet for currElement.\n");
@@ -1075,16 +1000,16 @@
         // try sending current element
         assert(currElement.isValid());

-        ++numSendAttempted;
+        ++fixedStats.numSendAttempted;

         if (!send(currElement.addr, currElement.blocksize,
                     currElement.cmd, currElement.flags, currElement.pc)) {
             DPRINTF(TraceCPUInst, "currElement sending failed.\n");
-            ++numSendFailed;
+            ++fixedStats.numSendFailed;
             // return false to indicate not to schedule next event
             return false;
         } else {
-            ++numSendSucceeded;
+            ++fixedStats.numSendSucceeded;
         }
     }
// If packet was sent successfully, either retryPkt or currElement, return
@@ -1126,7 +1051,7 @@
// to returning false. If successful then next message is in currElement.
     if (!trace.read(&currElement)) {
         traceComplete = true;
-        instLastTick = curTick();
+        fixedStats.instLastTick = curTick();
         return false;
     }

@@ -1199,7 +1124,7 @@
         DPRINTF(TraceCPUData, "Scheduling next DcacheGen event at %lli.\n",
                 when);
         schedule(dcacheNextEvent, when);
-        ++numSchedDcacheEvent;
+        ++traceStats.numSchedDcacheEvent;
     } else if (when < dcacheNextEvent.when()) {
         DPRINTF(TraceCPUData, "Re-scheduling next dcache event from %lli"
                 " to %lli.\n", dcacheNextEvent.when(), when);
diff --git a/src/cpu/trace/trace_cpu.hh b/src/cpu/trace/trace_cpu.hh
index cd292fb..dd25eb2 100644
--- a/src/cpu/trace/trace_cpu.hh
+++ b/src/cpu/trace/trace_cpu.hh
@@ -166,7 +166,7 @@
      */
     Counter totalOps() const
     {
-        return numOps.value();
+        return traceStats.numOps.value();
     }

     /*
@@ -432,7 +432,7 @@
               genName(owner.name() + ".fixedretry" + _name),
               retryPkt(nullptr),
               delta(0),
-              traceComplete(false)
+              traceComplete(false), fixedStats(&_owner)
         {
         }

@@ -493,7 +493,6 @@

         int64_t tickDelta() { return delta; }

-        void regStats();

       private:

@@ -529,14 +528,18 @@

/** Store an element read from the trace to send as the next packet. */
         TraceElement currElement;
-
-        /** Stats for instruction accesses replayed. */
-        Stats::Scalar numSendAttempted;
-        Stats::Scalar numSendSucceeded;
-        Stats::Scalar numSendFailed;
-        Stats::Scalar numRetrySucceeded;
-        /** Last simulated tick by the FixedRetryGen */
-        Stats::Scalar instLastTick;
+        protected:
+        struct FixedRetryGenStatGroup : public Stats::Group
+        {
+            FixedRetryGenStatGroup(Stats::Group *parent);
+            /** Stats for instruction accesses replayed. */
+            Stats::Scalar numSendAttempted;
+            Stats::Scalar numSendSucceeded;
+            Stats::Scalar numSendFailed;
+            Stats::Scalar numRetrySucceeded;
+            /** Last simulated tick by the FixedRetryGen */
+            Stats::Scalar instLastTick;
+        } fixedStats;

     };

@@ -860,7 +863,7 @@
               execComplete(false),
               windowSize(trace.getWindowSize()),
               hwResource(params->sizeROB, params->sizeStoreBuffer,
-                         params->sizeLoadBuffer)
+                         params->sizeLoadBuffer), elasticStats(&_owner)
         {
             DPRINTF(TraceCPUData, "Window size in the trace is %d.\n",
                     windowSize);
@@ -976,7 +979,6 @@
         /** Get number of micro-ops modelled in the TraceCPU replay */
uint64_t getMicroOpCount() const { return trace.getMicroOpCount(); }

-        void regStats();

       private:

@@ -1038,19 +1040,24 @@

         /** List of nodes that are ready to execute */
         std::list<ReadyNode> readyList;
-
-        /** Stats for data memory accesses replayed. */
-        Stats::Scalar maxDependents;
-        Stats::Scalar maxReadyListSize;
-        Stats::Scalar numSendAttempted;
-        Stats::Scalar numSendSucceeded;
-        Stats::Scalar numSendFailed;
-        Stats::Scalar numRetrySucceeded;
-        Stats::Scalar numSplitReqs;
-        Stats::Scalar numSOLoads;
-        Stats::Scalar numSOStores;
-        /** Tick when ElasticDataGen completes execution */
-        Stats::Scalar dataLastTick;
+        protected:
+        // Defining the a stat group
+        struct ElasticDataGenStatGroup : public Stats::Group
+        {
+            ElasticDataGenStatGroup(Stats::Group *parent);
+            /** Stats for data memory accesses replayed. */
+            Stats::Scalar maxDependents;
+            Stats::Scalar maxReadyListSize;
+            Stats::Scalar numSendAttempted;
+            Stats::Scalar numSendSucceeded;
+            Stats::Scalar numSendFailed;
+            Stats::Scalar numRetrySucceeded;
+            Stats::Scalar numSplitReqs;
+            Stats::Scalar numSOLoads;
+            Stats::Scalar numSOStores;
+            /** Tick when ElasticDataGen completes execution */
+            Stats::Scalar dataLastTick;
+        } elasticStats;
     };

     /** Instance of FixedRetryGen to replay instruction read requests. */
@@ -1127,14 +1134,18 @@
      * message is printed.
      */
     uint64_t progressMsgThreshold;
+    struct TraceStats : public Stats::Group
+    {
+        TraceStats(TraceCPU *trace);
+        Stats::Scalar numSchedDcacheEvent;
+        Stats::Scalar numSchedIcacheEvent;

-    Stats::Scalar numSchedDcacheEvent;
-    Stats::Scalar numSchedIcacheEvent;
-
-    /** Stat for number of simulated micro-ops. */
-    Stats::Scalar numOps;
- /** Stat for the CPI. This is really cycles per micro-op and not inst. */
-    Stats::Formula cpi;
+        /** Stat for number of simulated micro-ops. */
+        Stats::Scalar numOps;
+        /** Stat for the CPI. This is really cycles per
+         *  micro-op and not inst. */
+        Stats::Formula cpi;
+    } traceStats;

   public:

@@ -1144,6 +1155,5 @@
     /** Used to get a reference to the dcache port. */
     Port &getDataPort() { return dcachePort; }

-    void regStats();
 };
 #endif // __CPU_TRACE_TRACE_CPU_HH__

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/33875
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I9f97d4006a0edbd717fc34d0033b9548011d1631
Gerrit-Change-Number: 33875
Gerrit-PatchSet: 1
Gerrit-Owner: Eden Avivi <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to