cpu: Add branch predictor PMU probe points
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>
Thu, 16 Oct 2014 09:49:40 +0000 (05:49 -0400)
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>
Thu, 16 Oct 2014 09:49:40 +0000 (05:49 -0400)
This changeset adds probe points that can be used to implement PMU
counters for branch predictor stats. The following probes are
supported:

 * BPRedUnit::ppBranches / Branches
 * BPRedUnit::ppMisses / Misses

src/cpu/pred/bpred_unit.hh
src/cpu/pred/bpred_unit_impl.hh

index bca64cce0881c21350836b4d6c5e1320c97c3b7a..851cdbb78f40a5024a633c06ee27bc7db79a3066 100644 (file)
@@ -56,6 +56,7 @@
 #include "cpu/inst_seq.hh"
 #include "cpu/static_inst.hh"
 #include "params/BranchPredictor.hh"
+#include "sim/probe/pmu.hh"
 #include "sim/sim_object.hh"
 
 /**
@@ -76,6 +77,8 @@ class BPredUnit : public SimObject
      */
     void regStats();
 
+    void regProbePoints() M5_ATTR_OVERRIDE;
+
     /** Perform sanity checks after a drain. */
     void drainSanityCheck() const;
 
@@ -290,6 +293,34 @@ class BPredUnit : public SimObject
     Stats::Scalar usedRAS;
     /** Stat for number of times the RAS is incorrect. */
     Stats::Scalar RASIncorrect;
+
+  protected:
+    /**
+     * @{
+     * @name PMU Probe points.
+     */
+
+    /**
+     * Helper method to instantiate probe points belonging to this
+     * object.
+     *
+     * @param name Name of the probe point.
+     * @return A unique_ptr to the new probe point.
+     */
+    ProbePoints::PMUUPtr pmuProbePoint(const char *name);
+
+
+    /**
+     * Branches seen by the branch predictor
+     *
+     * @note This counter includes speculative branches.
+     */
+    ProbePoints::PMUUPtr ppBranches;
+
+    /** Miss-predicted branches */
+    ProbePoints::PMUUPtr ppMisses;
+
+    /** @} */
 };
 
 #endif // __CPU_PRED_BPRED_UNIT_HH__
index 53ec808b677f9db49c55090befdada92094d5b44..4d17bfd335ddcdb003216ec3528c0719c83e5795 100644 (file)
@@ -119,6 +119,22 @@ BPredUnit::regStats()
         ;
 }
 
+ProbePoints::PMUUPtr
+BPredUnit::pmuProbePoint(const char *name)
+{
+    ProbePoints::PMUUPtr ptr;
+    ptr.reset(new ProbePoints::PMU(getProbeManager(), name));
+
+    return ptr;
+}
+
+void
+BPredUnit::regProbePoints()
+{
+    ppBranches = pmuProbePoint("Branches");
+    ppMisses = pmuProbePoint("Misses");
+}
+
 void
 BPredUnit::drainSanityCheck() const
 {
@@ -141,6 +157,7 @@ BPredUnit::predict(const StaticInstPtr &inst, const InstSeqNum &seqNum,
     TheISA::PCState target = pc;
 
     ++lookups;
+    ppBranches->notify(1);
 
     void *bp_history = NULL;
 
@@ -259,6 +276,8 @@ BPredUnit::predictInOrder(const StaticInstPtr &inst, const InstSeqNum &seqNum,
     TheISA::PCState target;
 
     ++lookups;
+    ppBranches->notify(1);
+
     DPRINTF(Branch, "[tid:%i] [sn:%i] %s ... PC %s doing branch "
             "prediction\n", tid, seqNum,
             inst->disassemble(instPC.instAddr()), instPC);
@@ -438,6 +457,7 @@ BPredUnit::squash(const InstSeqNum &squashed_sn,
     History &pred_hist = predHist[tid];
 
     ++condIncorrect;
+    ppMisses->notify(1);
 
     DPRINTF(Branch, "[tid:%i]: Squashing from sequence number %i, "
             "setting target to %s.\n", tid, squashed_sn, corrTarget);