changeset ab8b8601b6ff in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=ab8b8601b6ff
description:
        cpu: use probes infrastructure to do simpoint profiling

        Instead of having code embedded in cpu model to do simpoint profiling 
use
        the probes infrastructure to do it.

diffstat:

 configs/example/se.py             |    3 +-
 src/cpu/simple/AtomicSimpleCPU.py |    9 +-
 src/cpu/simple/atomic.cc          |   97 +++----------------------
 src/cpu/simple/atomic.hh          |   70 +-----------------
 src/cpu/simple/probes/SConscript  |   35 +++++++++
 src/cpu/simple/probes/SimPoint.py |   48 ++++++++++++
 src/cpu/simple/probes/simpoint.cc |  145 ++++++++++++++++++++++++++++++++++++++
 src/cpu/simple/probes/simpoint.hh |  119 +++++++++++++++++++++++++++++++
 8 files changed, 372 insertions(+), 154 deletions(-)

diffs (truncated from 640 to 300 lines):

diff -r ec1af95a2958 -r ab8b8601b6ff configs/example/se.py
--- a/configs/example/se.py     Sat Sep 20 17:17:42 2014 -0400
+++ b/configs/example/se.py     Sat Sep 20 17:17:43 2014 -0400
@@ -213,8 +213,7 @@
         system.cpu[i].fastmem = True
 
     if options.simpoint_profile:
-        system.cpu[i].simpoint_profile = True
-        system.cpu[i].simpoint_interval = options.simpoint_interval
+        system.cpu[i].addSimPointProbe(options.simpoint_interval)
 
     if options.checker:
         system.cpu[i].addCheckerCpu()
diff -r ec1af95a2958 -r ab8b8601b6ff src/cpu/simple/AtomicSimpleCPU.py
--- a/src/cpu/simple/AtomicSimpleCPU.py Sat Sep 20 17:17:42 2014 -0400
+++ b/src/cpu/simple/AtomicSimpleCPU.py Sat Sep 20 17:17:43 2014 -0400
@@ -40,6 +40,7 @@
 
 from m5.params import *
 from BaseSimpleCPU import BaseSimpleCPU
+from SimPoint import SimPoint
 
 class AtomicSimpleCPU(BaseSimpleCPU):
     """Simple CPU model executing a configurable number of
@@ -61,6 +62,8 @@
     simulate_data_stalls = Param.Bool(False, "Simulate dcache stall cycles")
     simulate_inst_stalls = Param.Bool(False, "Simulate icache stall cycles")
     fastmem = Param.Bool(False, "Access memory directly")
-    simpoint_profile = Param.Bool(False, "Generate SimPoint BBVs")
-    simpoint_interval = Param.UInt64(100000000, "SimPoint Interval Size 
(insts)")
-    simpoint_profile_file = Param.String("simpoint.bb.gz", "SimPoint BBV file")
+
+    def addSimPointProbe(self, interval):
+        simpoint = SimPoint()
+        simpoint.interval = interval
+        self.probeListener = simpoint
diff -r ec1af95a2958 -r ab8b8601b6ff src/cpu/simple/atomic.cc
--- a/src/cpu/simple/atomic.cc  Sat Sep 20 17:17:42 2014 -0400
+++ b/src/cpu/simple/atomic.cc  Sat Sep 20 17:17:43 2014 -0400
@@ -110,20 +110,9 @@
       drain_manager(NULL),
       icachePort(name() + ".icache_port", this),
       dcachePort(name() + ".dcache_port", this),
-      fastmem(p->fastmem),
-      simpoint(p->simpoint_profile),
-      intervalSize(p->simpoint_interval),
-      intervalCount(0),
-      intervalDrift(0),
-      simpointStream(NULL),
-      currentBBV(0, 0),
-      currentBBVInstCount(0)
+      fastmem(p->fastmem)
 {
     _status = Idle;
-
-    if (simpoint) {
-        simpointStream = simout.create(p->simpoint_profile_file, false);
-    }
 }
 
 
@@ -132,9 +121,6 @@
     if (tickEvent.scheduled()) {
         deschedule(tickEvent);
     }
-    if (simpointStream) {
-        simout.close(simpointStream);
-    }
 }
 
 unsigned int
@@ -574,8 +560,13 @@
                 fault = curStaticInst->execute(this, traceData);
 
                 // keep an instruction count
-                if (fault == NoFault)
+                if (fault == NoFault) {
                     countInst();
+                    if (!curStaticInst->isMicroop() ||
+                         curStaticInst->isLastMicroop()) {
+                        ppCommit->notify(std::make_pair(thread, 
curStaticInst));
+                    }
+                }
                 else if (traceData && !DTRACE(ExecFaulting)) {
                     delete traceData;
                     traceData = NULL;
@@ -589,13 +580,6 @@
                         curStaticInst->isFirstMicroop()))
                 instCnt++;
 
-            // profile for SimPoints if enabled and macro inst is finished
-            if (simpoint && curStaticInst && (fault == NoFault) &&
-                    (!curStaticInst->isMicroop() ||
-                     curStaticInst->isLastMicroop())) {
-                profileSimPoint();
-            }
-
             Tick stall_ticks = 0;
             if (simulate_inst_stalls && icache_access)
                 stall_ticks += icache_latency;
@@ -627,6 +611,12 @@
         schedule(tickEvent, curTick() + latency);
 }
 
+void
+AtomicSimpleCPU::regProbePoints()
+{
+    ppCommit = new ProbePointArg<pair<SimpleThread*, const StaticInstPtr>>
+                                (getProbeManager(), "Commit");
+}
 
 void
 AtomicSimpleCPU::printAddr(Addr a)
@@ -634,67 +624,6 @@
     dcachePort.printAddr(a);
 }
 
-void
-AtomicSimpleCPU::profileSimPoint()
-{
-    if (!currentBBVInstCount)
-        currentBBV.first = thread->pcState().instAddr();
-
-    ++intervalCount;
-    ++currentBBVInstCount;
-
-    // If inst is control inst, assume end of basic block.
-    if (curStaticInst->isControl()) {
-        currentBBV.second = thread->pcState().instAddr();
-
-        auto map_itr = bbMap.find(currentBBV);
-        if (map_itr == bbMap.end()){
-            // If a new (previously unseen) basic block is found,
-            // add a new unique id, record num of insts and insert into bbMap.
-            BBInfo info;
-            info.id = bbMap.size() + 1;
-            info.insts = currentBBVInstCount;
-            info.count = currentBBVInstCount;
-            bbMap.insert(std::make_pair(currentBBV, info));
-        } else {
-            // If basic block is seen before, just increment the count by the
-            // number of insts in basic block.
-            BBInfo& info = map_itr->second;
-            info.count += currentBBVInstCount;
-        }
-        currentBBVInstCount = 0;
-
-        // Reached end of interval if the sum of the current inst count
-        // (intervalCount) and the excessive inst count from the previous
-        // interval (intervalDrift) is greater than/equal to the interval size.
-        if (intervalCount + intervalDrift >= intervalSize) {
-            // summarize interval and display BBV info
-            std::vector<pair<uint64_t, uint64_t> > counts;
-            for (auto map_itr = bbMap.begin(); map_itr != bbMap.end();
-                    ++map_itr) {
-                BBInfo& info = map_itr->second;
-                if (info.count != 0) {
-                    counts.push_back(std::make_pair(info.id, info.count));
-                    info.count = 0;
-                }
-            }
-            std::sort(counts.begin(), counts.end());
-
-            // Print output BBV info
-            *simpointStream << "T";
-            for (auto cnt_itr = counts.begin(); cnt_itr != counts.end();
-                    ++cnt_itr) {
-                *simpointStream << ":" << cnt_itr->first
-                                << ":" << cnt_itr->second << " ";
-            }
-            *simpointStream << "\n";
-
-            intervalDrift = (intervalCount + intervalDrift) - intervalSize;
-            intervalCount = 0;
-        }
-    }
-}
-
 ////////////////////////////////////////////////////////////////////////
 //
 //  AtomicSimpleCPU Simulation Object
diff -r ec1af95a2958 -r ab8b8601b6ff src/cpu/simple/atomic.hh
--- a/src/cpu/simple/atomic.hh  Sat Sep 20 17:17:42 2014 -0400
+++ b/src/cpu/simple/atomic.hh  Sat Sep 20 17:17:43 2014 -0400
@@ -43,30 +43,9 @@
 #ifndef __CPU_SIMPLE_ATOMIC_HH__
 #define __CPU_SIMPLE_ATOMIC_HH__
 
-#include "base/hashmap.hh"
 #include "cpu/simple/base.hh"
 #include "params/AtomicSimpleCPU.hh"
-
-/**
- *  Start and end address of basic block for SimPoint profiling.
- *  This structure is used to look up the hash table of BBVs.
- *  - first: PC of first inst in basic block
- *  - second: PC of last inst in basic block
- */
-typedef std::pair<Addr, Addr> BasicBlockRange;
-
-/** Overload hash function for BasicBlockRange type */
-__hash_namespace_begin
-template <>
-struct hash<BasicBlockRange>
-{
-  public:
-    size_t operator()(const BasicBlockRange &bb) const {
-        return hash<Addr>()(bb.first + bb.second);
-    }
-};
-__hash_namespace_end
-
+#include "sim/probe/probe.hh"
 
 class AtomicSimpleCPU : public BaseSimpleCPU
 {
@@ -200,49 +179,8 @@
     bool dcache_access;
     Tick dcache_latency;
 
-    /**
-     * Profile basic blocks for SimPoints.
-     * Called at every macro inst to increment basic block inst counts and
-     * to profile block if end of block.
-     */
-    void profileSimPoint();
-
-    /** Data structures for SimPoints BBV generation
-     *  @{
-     */
-
-    /** Whether SimPoint BBV profiling is enabled */
-    const bool simpoint;
-    /** SimPoint profiling interval size in instructions */
-    const uint64_t intervalSize;
-
-    /** Inst count in current basic block */
-    uint64_t intervalCount;
-    /** Excess inst count from previous interval*/
-    uint64_t intervalDrift;
-    /** Pointer to SimPoint BBV output stream */
-    std::ostream *simpointStream;
-
-    /** Basic Block information */
-    struct BBInfo {
-        /** Unique ID */
-        uint64_t id;
-        /** Num of static insts in BB */
-        uint64_t insts;
-        /** Accumulated dynamic inst count executed by BB */
-        uint64_t count;
-    };
-
-    /** Hash table containing all previously seen basic blocks */
-    m5::hash_map<BasicBlockRange, BBInfo> bbMap;
-    /** Currently executing basic block */
-    BasicBlockRange currentBBV;
-    /** inst count in current basic block */
-    uint64_t currentBBVInstCount;
-
-    /** @}
-     *  End of data structures for SimPoints BBV generation
-     */
+    /** Probe Points. */
+    ProbePointArg<std::pair<SimpleThread*, const StaticInstPtr>> *ppCommit;
 
   protected:
 
@@ -270,6 +208,8 @@
     Fault writeMem(uint8_t *data, unsigned size,
                    Addr addr, unsigned flags, uint64_t *res);
 
+    virtual void regProbePoints();
+
     /**
      * Print state of address in memory system via PrintReq (for
      * debugging).
diff -r ec1af95a2958 -r ab8b8601b6ff src/cpu/simple/probes/SConscript
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cpu/simple/probes/SConscript  Sat Sep 20 17:17:43 2014 -0400
@@ -0,0 +1,35 @@
+# -*- mode:python -*-
+
+# Copyright (c) 2014 ARM Limited
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to