Hoa Nguyen has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/36176 )

Change subject: cpu-o3,stats: Update stats style of inst_queue & inst_queue_impl
......................................................................

cpu-o3,stats: Update stats style of inst_queue & inst_queue_impl

Change-Id: I95c2e194e757437fb8c3b3f530bce363e24f9a8e
Signed-off-by: Hoa Nguyen <[email protected]>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/36176
Reviewed-by: Daniel Carvalho <[email protected]>
Maintainer: Jason Lowe-Power <[email protected]>
Tested-by: kokoro <[email protected]>
---
M src/cpu/o3/cpu.cc
M src/cpu/o3/iew.hh
M src/cpu/o3/iew_impl.hh
M src/cpu/o3/inst_queue.hh
M src/cpu/o3/inst_queue_impl.hh
5 files changed, 196 insertions(+), 221 deletions(-)

Approvals:
  Daniel Carvalho: Looks good to me, approved
  Jason Lowe-Power: Looks good to me, approved
  kokoro: Regressions pass



diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc
index 1ef8154..8461d06 100644
--- a/src/cpu/o3/cpu.cc
+++ b/src/cpu/o3/cpu.cc
@@ -447,8 +447,6 @@
         .precision(6);
     totalIpc =  sum(committedInsts) / numCycles;

-    this->iew.regStats();
-
     intRegfileReads
         .name(name() + ".int_regfile_reads")
         .desc("number of integer regfile reads")
diff --git a/src/cpu/o3/iew.hh b/src/cpu/o3/iew.hh
index 683902a..b624510 100644
--- a/src/cpu/o3/iew.hh
+++ b/src/cpu/o3/iew.hh
@@ -136,9 +136,6 @@
     /** Returns the name of the DefaultIEW stage. */
     std::string name() const;

-    /** Registers statistics. */
-    void regStats();
-
     /** Registers probes. */
     void regProbePoints();

diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh
index fc89a89..a50a94a 100644
--- a/src/cpu/o3/iew_impl.hh
+++ b/src/cpu/o3/iew_impl.hh
@@ -243,13 +243,6 @@
         .flags(Stats::total);
 }

-template <class Impl>
-void
-DefaultIEW<Impl>::regStats()
-{
-    instQueue.regStats();
-}
-
 template<class Impl>
 void
 DefaultIEW<Impl>::startupStage()
@@ -689,7 +682,7 @@
// If there are no ready instructions waiting to be scheduled by the IQ,
     // and there's no stores waiting to write back, and dispatch is not
     // unblocking, then there is no internal activity for the IEW stage.
-    instQueue.intInstQueueReads++;
+    instQueue.iqIOStats.intInstQueueReads++;
     if (_status == Active && !instQueue.hasReadyInsts() &&
         !ldstQueue.willWB() && !any_unblocking) {
         DPRINTF(IEW, "IEW switching to idle\n");
diff --git a/src/cpu/o3/inst_queue.hh b/src/cpu/o3/inst_queue.hh
index 1aebfa0..0286a6e 100644
--- a/src/cpu/o3/inst_queue.hh
+++ b/src/cpu/o3/inst_queue.hh
@@ -130,9 +130,6 @@
     /** Returns the name of the IQ. */
     std::string name() const;

-    /** Registers statistics. */
-    void regStats();
-
     /** Resets all instruction queue state. */
     void resetState();

@@ -472,75 +469,87 @@
      */
     void dumpInsts();

-    /** Stat for number of instructions added. */
-    Stats::Scalar iqInstsAdded;
-    /** Stat for number of non-speculative instructions added. */
-    Stats::Scalar iqNonSpecInstsAdded;
+    struct IQStats : public Stats::Group
+    {
+        IQStats(O3CPU *cpu, const unsigned &total_width);
+        /** Stat for number of instructions added. */
+        Stats::Scalar instsAdded;
+        /** Stat for number of non-speculative instructions added. */
+        Stats::Scalar nonSpecInstsAdded;

-    Stats::Scalar iqInstsIssued;
-    /** Stat for number of integer instructions issued. */
-    Stats::Scalar iqIntInstsIssued;
-    /** Stat for number of floating point instructions issued. */
-    Stats::Scalar iqFloatInstsIssued;
-    /** Stat for number of branch instructions issued. */
-    Stats::Scalar iqBranchInstsIssued;
-    /** Stat for number of memory instructions issued. */
-    Stats::Scalar iqMemInstsIssued;
-    /** Stat for number of miscellaneous instructions issued. */
-    Stats::Scalar iqMiscInstsIssued;
- /** Stat for number of squashed instructions that were ready to issue. */
-    Stats::Scalar iqSquashedInstsIssued;
- /** Stat for number of squashed instructions examined when squashing. */
-    Stats::Scalar iqSquashedInstsExamined;
-    /** Stat for number of squashed instruction operands examined when
-     * squashing.
-     */
-    Stats::Scalar iqSquashedOperandsExamined;
- /** Stat for number of non-speculative instructions removed due to a squash.
-     */
-    Stats::Scalar iqSquashedNonSpecRemoved;
-    // Also include number of instructions rescheduled and replayed.
+        Stats::Scalar instsIssued;
+        /** Stat for number of integer instructions issued. */
+        Stats::Scalar intInstsIssued;
+        /** Stat for number of floating point instructions issued. */
+        Stats::Scalar floatInstsIssued;
+        /** Stat for number of branch instructions issued. */
+        Stats::Scalar branchInstsIssued;
+        /** Stat for number of memory instructions issued. */
+        Stats::Scalar memInstsIssued;
+        /** Stat for number of miscellaneous instructions issued. */
+        Stats::Scalar miscInstsIssued;
+        /** Stat for number of squashed instructions that were ready to
+         *  issue. */
+        Stats::Scalar squashedInstsIssued;
+        /** Stat for number of squashed instructions examined when
+         *  squashing. */
+        Stats::Scalar squashedInstsExamined;
+        /** Stat for number of squashed instruction operands examined when
+         * squashing.
+         */
+        Stats::Scalar squashedOperandsExamined;
+        /** Stat for number of non-speculative instructions removed due to
+         *  a squash.
+         */
+        Stats::Scalar squashedNonSpecRemoved;
+        // Also include number of instructions rescheduled and replayed.

-    /** Distribution of number of instructions in the queue.
-     * @todo: Need to create struct to track the entry time for each
-     * instruction. */
-//    Stats::VectorDistribution queueResDist;
-    /** Distribution of the number of instructions issued. */
-    Stats::Distribution numIssuedDist;
-    /** Distribution of the cycles it takes to issue an instruction.
-     * @todo: Need to create struct to track the ready time for each
-     * instruction. */
-//    Stats::VectorDistribution issueDelayDist;
+        /** Distribution of number of instructions in the queue.
+         * @todo: Need to create struct to track the entry time for each
+         * instruction. */
+        // Stats::VectorDistribution queueResDist;
+        /** Distribution of the number of instructions issued. */
+        Stats::Distribution numIssuedDist;
+        /** Distribution of the cycles it takes to issue an instruction.
+         * @todo: Need to create struct to track the ready time for each
+         * instruction. */
+        // Stats::VectorDistribution issueDelayDist;

-    /** Number of times an instruction could not be issued because a
-     * FU was busy.
-     */
-    Stats::Vector statFuBusy;
-//    Stats::Vector dist_unissued;
-    /** Stat for total number issued for each instruction type. */
-    Stats::Vector2d statIssuedInstType;
+        /** Number of times an instruction could not be issued because a
+         * FU was busy.
+         */
+        Stats::Vector statFuBusy;
+        // Stats::Vector dist_unissued;
+        /** Stat for total number issued for each instruction type. */
+        Stats::Vector2d statIssuedInstType;

-    /** Number of instructions issued per cycle. */
-    Stats::Formula issueRate;
+        /** Number of instructions issued per cycle. */
+        Stats::Formula issueRate;

-    /** Number of times the FU was busy. */
-    Stats::Vector fuBusy;
-    /** Number of times the FU was busy per instruction issued. */
-    Stats::Formula fuBusyRate;
+        /** Number of times the FU was busy. */
+        Stats::Vector fuBusy;
+        /** Number of times the FU was busy per instruction issued. */
+        Stats::Formula fuBusyRate;
+    } iqStats;
+
    public:
-    Stats::Scalar intInstQueueReads;
-    Stats::Scalar intInstQueueWrites;
-    Stats::Scalar intInstQueueWakeupAccesses;
-    Stats::Scalar fpInstQueueReads;
-    Stats::Scalar fpInstQueueWrites;
-    Stats::Scalar fpInstQueueWakeupAccesses;
-    Stats::Scalar vecInstQueueReads;
-    Stats::Scalar vecInstQueueWrites;
-    Stats::Scalar vecInstQueueWakeupAccesses;
+    struct IQIOStats : public Stats::Group
+    {
+        IQIOStats(Stats::Group *parent);
+        Stats::Scalar intInstQueueReads;
+        Stats::Scalar intInstQueueWrites;
+        Stats::Scalar intInstQueueWakeupAccesses;
+        Stats::Scalar fpInstQueueReads;
+        Stats::Scalar fpInstQueueWrites;
+        Stats::Scalar fpInstQueueWakeupAccesses;
+        Stats::Scalar vecInstQueueReads;
+        Stats::Scalar vecInstQueueWrites;
+        Stats::Scalar vecInstQueueWakeupAccesses;

-    Stats::Scalar intAluAccesses;
-    Stats::Scalar fpAluAccesses;
-    Stats::Scalar vecAluAccesses;
+        Stats::Scalar intAluAccesses;
+        Stats::Scalar fpAluAccesses;
+        Stats::Scalar vecAluAccesses;
+    } iqIOStats;
 };

 #endif //__CPU_O3_INST_QUEUE_HH__
diff --git a/src/cpu/o3/inst_queue_impl.hh b/src/cpu/o3/inst_queue_impl.hh
index 119dcd2..5041ab4 100644
--- a/src/cpu/o3/inst_queue_impl.hh
+++ b/src/cpu/o3/inst_queue_impl.hh
@@ -88,14 +88,15 @@
       iewStage(iew_ptr),
       fuPool(params.fuPool),
       iqPolicy(params.smtIQPolicy),
+      numThreads(params.numThreads),
       numEntries(params.numIQEntries),
       totalWidth(params.issueWidth),
-      commitToIEWDelay(params.commitToIEWDelay)
+      commitToIEWDelay(params.commitToIEWDelay),
+      iqStats(cpu, totalWidth),
+      iqIOStats(cpu)
 {
     assert(fuPool);

-    numThreads = params.numThreads;
-
     // Set the number of total physical registers
// As the vector registers have two addressing modes, they are added twice
     numPhysRegs = params.numPhysIntRegs + params.numPhysFloatRegs +
@@ -173,71 +174,70 @@
 }

 template <class Impl>
-void
-InstructionQueue<Impl>::regStats()
+InstructionQueue<Impl>::
+IQStats::IQStats(O3CPU *cpu, const unsigned &total_width)
+    : Stats::Group(cpu),
+    ADD_STAT(instsAdded,
+             "Number of instructions added to the IQ (excludes non-spec)"),
+    ADD_STAT(nonSpecInstsAdded,
+             "Number of non-speculative instructions added to the IQ"),
+    ADD_STAT(instsIssued, "Number of instructions issued"),
+    ADD_STAT(intInstsIssued, "Number of integer instructions issued"),
+    ADD_STAT(floatInstsIssued, "Number of float instructions issued"),
+    ADD_STAT(branchInstsIssued, "Number of branch instructions issued"),
+    ADD_STAT(memInstsIssued, "Number of memory instructions issued"),
+ ADD_STAT(miscInstsIssued, "Number of miscellaneous instructions issued"), + ADD_STAT(squashedInstsIssued, "Number of squashed instructions issued"),
+    ADD_STAT(squashedInstsExamined,
+ "Number of squashed instructions iterated over during squash; "
+             "mainly for profiling"),
+    ADD_STAT(squashedOperandsExamined,
+             "Number of squashed operands that are examined and possibly "
+             "removed from graph"),
+    ADD_STAT(squashedNonSpecRemoved,
+             "Number of squashed non-spec instructions that were removed"),
+    ADD_STAT(numIssuedDist, "Number of insts issued each cycle"),
+    ADD_STAT(statFuBusy, "attempts to use FU when none available"),
+    ADD_STAT(statIssuedInstType, "Type of FU issued"),
+    ADD_STAT(issueRate, "Inst issue rate", instsIssued / cpu->numCycles),
+    ADD_STAT(fuBusy, "FU busy when requested"),
+    ADD_STAT(fuBusyRate, "FU busy rate (busy events/executed inst)")
 {
-    using namespace Stats;
-    iqInstsAdded
-        .name(name() + ".iqInstsAdded")
-        .desc("Number of instructions added to the IQ (excludes non-spec)")
-        .prereq(iqInstsAdded);
+    instsAdded
+        .prereq(instsAdded);

-    iqNonSpecInstsAdded
-        .name(name() + ".iqNonSpecInstsAdded")
-        .desc("Number of non-speculative instructions added to the IQ")
-        .prereq(iqNonSpecInstsAdded);
+    nonSpecInstsAdded
+        .prereq(nonSpecInstsAdded);

-    iqInstsIssued
-        .name(name() + ".iqInstsIssued")
-        .desc("Number of instructions issued")
-        .prereq(iqInstsIssued);
+    instsIssued
+        .prereq(instsIssued);

-    iqIntInstsIssued
-        .name(name() + ".iqIntInstsIssued")
-        .desc("Number of integer instructions issued")
-        .prereq(iqIntInstsIssued);
+    intInstsIssued
+        .prereq(intInstsIssued);

-    iqFloatInstsIssued
-        .name(name() + ".iqFloatInstsIssued")
-        .desc("Number of float instructions issued")
-        .prereq(iqFloatInstsIssued);
+    floatInstsIssued
+        .prereq(floatInstsIssued);

-    iqBranchInstsIssued
-        .name(name() + ".iqBranchInstsIssued")
-        .desc("Number of branch instructions issued")
-        .prereq(iqBranchInstsIssued);
+    branchInstsIssued
+        .prereq(branchInstsIssued);

-    iqMemInstsIssued
-        .name(name() + ".iqMemInstsIssued")
-        .desc("Number of memory instructions issued")
-        .prereq(iqMemInstsIssued);
+    memInstsIssued
+        .prereq(memInstsIssued);

-    iqMiscInstsIssued
-        .name(name() + ".iqMiscInstsIssued")
-        .desc("Number of miscellaneous instructions issued")
-        .prereq(iqMiscInstsIssued);
+    miscInstsIssued
+        .prereq(miscInstsIssued);

-    iqSquashedInstsIssued
-        .name(name() + ".iqSquashedInstsIssued")
-        .desc("Number of squashed instructions issued")
-        .prereq(iqSquashedInstsIssued);
+    squashedInstsIssued
+        .prereq(squashedInstsIssued);

-    iqSquashedInstsExamined
-        .name(name() + ".iqSquashedInstsExamined")
- .desc("Number of squashed instructions iterated over during squash;"
-              " mainly for profiling")
-        .prereq(iqSquashedInstsExamined);
+    squashedInstsExamined
+        .prereq(squashedInstsExamined);

-    iqSquashedOperandsExamined
-        .name(name() + ".iqSquashedOperandsExamined")
-        .desc("Number of squashed operands that are examined and possibly "
-              "removed from graph")
-        .prereq(iqSquashedOperandsExamined);
+    squashedOperandsExamined
+        .prereq(squashedOperandsExamined);

-    iqSquashedNonSpecRemoved
-        .name(name() + ".iqSquashedNonSpecRemoved")
-        .desc("Number of squashed non-spec instructions that were removed")
-        .prereq(iqSquashedNonSpecRemoved);
+    squashedNonSpecRemoved
+        .prereq(squashedNonSpecRemoved);
 /*
     queueResDist
         .init(Num_OpClasses, 0, 99, 2)
@@ -250,10 +250,8 @@
     }
 */
     numIssuedDist
-        .init(0,totalWidth,1)
-        .name(name() + ".issued_per_cycle")
-        .desc("Number of insts issued each cycle")
-        .flags(pdf)
+        .init(0,total_width,1)
+        .flags(Stats::pdf)
         ;
 /*
     dist_unissued
@@ -267,10 +265,8 @@
     }
 */
     statIssuedInstType
-        .init(numThreads,Enums::Num_OpClass)
-        .name(name() + ".FU_type")
-        .desc("Type of FU issued")
-        .flags(total | pdf | dist)
+        .init(cpu->numThreads,Enums::Num_OpClass)
+        .flags(Stats::total | Stats::pdf | Stats::dist)
         ;
     statIssuedInstType.ysubnames(Enums::OpClassStrings);

@@ -284,7 +280,6 @@
         .desc("cycles from operands ready to issue")
         .flags(pdf | cdf)
         ;
-
     for (int i=0; i<Num_OpClasses; ++i) {
         std::stringstream subname;
         subname << opClassStrings[i] << "_delay";
@@ -292,101 +287,84 @@
     }
 */
     issueRate
-        .name(name() + ".rate")
-        .desc("Inst issue rate")
-        .flags(total)
+        .flags(Stats::total)
         ;
-    issueRate = iqInstsIssued / cpu->numCycles;

     statFuBusy
         .init(Num_OpClasses)
-        .name(name() + ".fu_full")
-        .desc("attempts to use FU when none available")
-        .flags(pdf | dist)
+        .flags(Stats::pdf | Stats::dist)
         ;
     for (int i=0; i < Num_OpClasses; ++i) {
         statFuBusy.subname(i, Enums::OpClassStrings[i]);
     }

     fuBusy
-        .init(numThreads)
-        .name(name() + ".fu_busy_cnt")
-        .desc("FU busy when requested")
-        .flags(total)
+        .init(cpu->numThreads)
+        .flags(Stats::total)
         ;

     fuBusyRate
-        .name(name() + ".fu_busy_rate")
-        .desc("FU busy rate (busy events/executed inst)")
-        .flags(total)
+        .flags(Stats::total)
         ;
-    fuBusyRate = fuBusy / iqInstsIssued;
+    fuBusyRate = fuBusy / instsIssued;
+}

-    for (ThreadID tid = 0; tid < numThreads; tid++) {
-        // Tell mem dependence unit to reg stats as well.
-        memDepUnit[tid].regStats();
-    }
-
+template <class Impl>
+InstructionQueue<Impl>::
+IQIOStats::IQIOStats(Stats::Group *parent)
+    : Stats::Group(parent),
+ ADD_STAT(intInstQueueReads, "Number of integer instruction queue reads"), + ADD_STAT(intInstQueueWrites, "Number of integer instruction queue writes"), + ADD_STAT(intInstQueueWakeupAccesses, "Number of integer instruction queue "
+                                         "wakeup accesses"),
+ ADD_STAT(fpInstQueueReads, "Number of floating instruction queue reads"), + ADD_STAT(fpInstQueueWrites, "Number of floating instruction queue writes"), + ADD_STAT(fpInstQueueWakeupAccesses, "Number of floating instruction queue "
+                                        "wakeup accesses"),
+ ADD_STAT(vecInstQueueReads, "Number of vector instruction queue reads"), + ADD_STAT(vecInstQueueWrites, "Number of vector instruction queue writes"), + ADD_STAT(vecInstQueueWakeupAccesses, "Number of vector instruction queue "
+                                         "wakeup accesses"),
+    ADD_STAT(intAluAccesses, "Number of integer alu accesses"),
+    ADD_STAT(fpAluAccesses, "Number of floating point alu accesses"),
+    ADD_STAT(vecAluAccesses, "Number of vector alu accesses")
+{
+    using namespace Stats;
     intInstQueueReads
-        .name(name() + ".int_inst_queue_reads")
-        .desc("Number of integer instruction queue reads")
         .flags(total);

     intInstQueueWrites
-        .name(name() + ".int_inst_queue_writes")
-        .desc("Number of integer instruction queue writes")
         .flags(total);

     intInstQueueWakeupAccesses
-        .name(name() + ".int_inst_queue_wakeup_accesses")
-        .desc("Number of integer instruction queue wakeup accesses")
         .flags(total);

     fpInstQueueReads
-        .name(name() + ".fp_inst_queue_reads")
-        .desc("Number of floating instruction queue reads")
         .flags(total);

     fpInstQueueWrites
-        .name(name() + ".fp_inst_queue_writes")
-        .desc("Number of floating instruction queue writes")
         .flags(total);

     fpInstQueueWakeupAccesses
-        .name(name() + ".fp_inst_queue_wakeup_accesses")
-        .desc("Number of floating instruction queue wakeup accesses")
         .flags(total);

     vecInstQueueReads
-        .name(name() + ".vec_inst_queue_reads")
-        .desc("Number of vector instruction queue reads")
         .flags(total);

     vecInstQueueWrites
-        .name(name() + ".vec_inst_queue_writes")
-        .desc("Number of vector instruction queue writes")
         .flags(total);

     vecInstQueueWakeupAccesses
-        .name(name() + ".vec_inst_queue_wakeup_accesses")
-        .desc("Number of vector instruction queue wakeup accesses")
         .flags(total);

     intAluAccesses
-        .name(name() + ".int_alu_accesses")
-        .desc("Number of integer alu accesses")
         .flags(total);

     fpAluAccesses
-        .name(name() + ".fp_alu_accesses")
-        .desc("Number of floating point alu accesses")
         .flags(total);

     vecAluAccesses
-        .name(name() + ".vec_alu_accesses")
-        .desc("Number of vector alu accesses")
         .flags(total);
-
 }

 template <class Impl>
@@ -577,11 +555,11 @@
 InstructionQueue<Impl>::insert(const DynInstPtr &new_inst)
 {
     if (new_inst->isFloating()) {
-        fpInstQueueWrites++;
+        iqIOStats.fpInstQueueWrites++;
     } else if (new_inst->isVector()) {
-        vecInstQueueWrites++;
+        iqIOStats.vecInstQueueWrites++;
     } else {
-        intInstQueueWrites++;
+        iqIOStats.intInstQueueWrites++;
     }
     // Make sure the instruction is valid
     assert(new_inst);
@@ -611,7 +589,7 @@
         addIfReady(new_inst);
     }

-    ++iqInstsAdded;
+    ++iqStats.instsAdded;

     count[new_inst->threadNumber]++;

@@ -625,11 +603,11 @@
     // @todo: Clean up this code; can do it by setting inst as unable
     // to issue, then calling normal insert on the inst.
     if (new_inst->isFloating()) {
-        fpInstQueueWrites++;
+        iqIOStats.fpInstQueueWrites++;
     } else if (new_inst->isVector()) {
-        vecInstQueueWrites++;
+        iqIOStats.vecInstQueueWrites++;
     } else {
-        intInstQueueWrites++;
+        iqIOStats.intInstQueueWrites++;
     }

     assert(new_inst);
@@ -658,7 +636,7 @@
         memDepUnit[new_inst->threadNumber].insertNonSpec(new_inst);
     }

-    ++iqNonSpecInstsAdded;
+    ++iqStats.nonSpecInstsAdded;

     count[new_inst->threadNumber]++;

@@ -682,11 +660,11 @@
     DynInstPtr inst = std::move(instsToExecute.front());
     instsToExecute.pop_front();
     if (inst->isFloating()) {
-        fpInstQueueReads++;
+        iqIOStats.fpInstQueueReads++;
     } else if (inst->isVector()) {
-        vecInstQueueReads++;
+        iqIOStats.vecInstQueueReads++;
     } else {
-        intInstQueueReads++;
+        iqIOStats.intInstQueueReads++;
     }
     return inst;
 }
@@ -807,11 +785,11 @@
         DynInstPtr issuing_inst = readyInsts[op_class].top();

         if (issuing_inst->isFloating()) {
-            fpInstQueueReads++;
+            iqIOStats.fpInstQueueReads++;
         } else if (issuing_inst->isVector()) {
-            vecInstQueueReads++;
+            iqIOStats.vecInstQueueReads++;
         } else {
-            intInstQueueReads++;
+            iqIOStats.intInstQueueReads++;
         }

         assert(issuing_inst->seqNum == (*order_it).oldestInst);
@@ -828,7 +806,7 @@

             listOrder.erase(order_it++);

-            ++iqSquashedInstsIssued;
+            ++iqStats.squashedInstsIssued;

             continue;
         }
@@ -840,11 +818,11 @@
         if (op_class != No_OpClass) {
             idx = fuPool->getUnit(op_class);
             if (issuing_inst->isFloating()) {
-                fpAluAccesses++;
+                iqIOStats.fpAluAccesses++;
             } else if (issuing_inst->isVector()) {
-                vecAluAccesses++;
+                iqIOStats.vecAluAccesses++;
             } else {
-                intAluAccesses++;
+                iqIOStats.intAluAccesses++;
             }
             if (idx > FUPool::NoFreeFU) {
                 op_latency = fuPool->getOpLatency(op_class);
@@ -914,16 +892,16 @@
             }

             listOrder.erase(order_it++);
-            statIssuedInstType[tid][op_class]++;
+            iqStats.statIssuedInstType[tid][op_class]++;
         } else {
-            statFuBusy[op_class]++;
-            fuBusy[tid]++;
+            iqStats.statFuBusy[op_class]++;
+            iqStats.fuBusy[tid]++;
             ++order_it;
         }
     }

-    numIssuedDist.sample(total_issued);
-    iqInstsIssued+= total_issued;
+    iqStats.numIssuedDist.sample(total_issued);
+    iqStats.instsIssued+= total_issued;

     // If we issued any instructions, tell the CPU we had activity.
     // @todo If the way deferred memory instructions are handeled due to
@@ -990,11 +968,11 @@

     // The instruction queue here takes care of both floating and int ops
     if (completed_inst->isFloating()) {
-        fpInstQueueWakeupAccesses++;
+        iqIOStats.fpInstQueueWakeupAccesses++;
     } else if (completed_inst->isVector()) {
-        vecInstQueueWakeupAccesses++;
+        iqIOStats.vecInstQueueWakeupAccesses++;
     } else {
-        intInstQueueWakeupAccesses++;
+        iqIOStats.intInstQueueWakeupAccesses++;
     }

     DPRINTF(IQ, "Waking dependents of completed instruction.\n");
@@ -1184,7 +1162,7 @@
 InstructionQueue<Impl>::violation(const DynInstPtr &store,
                                   const DynInstPtr &faulting_load)
 {
-    intInstQueueWrites++;
+    iqIOStats.intInstQueueWrites++;
     memDepUnit[store->threadNumber].violation(store, faulting_load);
 }

@@ -1223,11 +1201,11 @@

         DynInstPtr squashed_inst = (*squash_it);
         if (squashed_inst->isFloating()) {
-            fpInstQueueWrites++;
+            iqIOStats.fpInstQueueWrites++;
         } else if (squashed_inst->isVector()) {
-            vecInstQueueWrites++;
+            iqIOStats.vecInstQueueWrites++;
         } else {
-            intInstQueueWrites++;
+            iqIOStats.intInstQueueWrites++;
         }

         // Only handle the instruction if it actually is in the IQ and
@@ -1280,7 +1258,7 @@
                                            squashed_inst);
                     }

-                    ++iqSquashedOperandsExamined;
+                    ++iqStats.squashedOperandsExamined;
                 }

             } else if (!squashed_inst->isStoreConditional() ||
@@ -1303,7 +1281,7 @@

                     nonSpecInsts.erase(ns_inst_it);

-                    ++iqSquashedNonSpecRemoved;
+                    ++iqStats.squashedNonSpecRemoved;
                 }
             }

@@ -1344,7 +1322,7 @@
             dependGraph.clearInst(dest_reg->flatIndex());
         }
         instList[tid].erase(squash_it--);
-        ++iqSquashedInstsExamined;
+        ++iqStats.squashedInstsExamined;
     }
 }


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/36176
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: I95c2e194e757437fb8c3b3f530bce363e24f9a8e
Gerrit-Change-Number: 36176
Gerrit-PatchSet: 19
Gerrit-Owner: Hoa Nguyen <[email protected]>
Gerrit-Reviewer: Daniel Carvalho <[email protected]>
Gerrit-Reviewer: Hoa Nguyen <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-Reviewer: kokoro <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
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