sim: Enable sampling of run-time for code-sections marked using pseudo insts.
authorPrakash Ramrakhyani <Prakash.Ramrakhyani@arm.com>
Tue, 10 Jan 2012 00:08:20 +0000 (18:08 -0600)
committerPrakash Ramrakhyani <Prakash.Ramrakhyani@arm.com>
Tue, 10 Jan 2012 00:08:20 +0000 (18:08 -0600)
This patch adds a mechanism to collect run time samples for specific portions
of a benchmark, using work_begin and work_end pseudo instructions.It also enhances
the histogram stat to report geometric mean.

src/base/statistics.hh
src/base/stats/info.hh
src/base/stats/text.cc
src/python/m5/main.py
src/sim/System.py
src/sim/pseudo_inst.cc
src/sim/system.cc
src/sim/system.hh

index d98c794149f7133e63fe14c33b2298d636260cb1..1f8a5932643a4a14435ff5160dfde4266df8d147 100644 (file)
@@ -1477,6 +1477,8 @@ class HistStor
 
     /** The current sum. */
     Counter sum;
+    /** The sum of logarithm of each sample, used to compute geometric mean. */
+    Counter logs;
     /** The sum of squares. */
     Counter squares;
     /** The number of samples. */
@@ -1528,6 +1530,7 @@ class HistStor
 
         sum += val * number;
         squares += val * val * number;
+        logs += log(val) * number;
         samples += number;
     }
 
@@ -1567,6 +1570,7 @@ class HistStor
             data.cvec[i] = cvec[i];
 
         data.sum = sum;
+        data.logs = logs;
         data.squares = squares;
         data.samples = samples;
     }
@@ -1589,6 +1593,7 @@ class HistStor
         sum = Counter();
         squares = Counter();
         samples = Counter();
+        logs = Counter();
     }
 };
 
index 2c5b44a38095f4b0500c53b39061d014e45874a1..98e811747f82ba156fdd39e331f3d74262209e37 100644 (file)
@@ -183,6 +183,7 @@ struct DistData
     VCounter cvec;
     Counter sum;
     Counter squares;
+    Counter logs;
     Counter samples;
 };
 
index 683ba7fe4d775d579db24b7f366e26cd73b16965..4cf98ca9e47db1b9a4bfe28f32b91d626019be75 100644 (file)
@@ -367,6 +367,12 @@ DistPrint::operator()(ostream &stream) const
     print.value = data.samples ? data.sum / data.samples : NAN;
     print(stream);
 
+    if (data.type == Hist) {
+        print.name = base + "gmean";
+        print.value = data.samples ? exp(data.logs / data.samples) : NAN;
+        print(stream);
+    }
+
     Result stdev = NAN;
     if (data.samples)
         stdev = sqrt((data.samples * data.squares - data.sum * data.sum) /
index 17e0c2f91ee57a1db59382db79fd59cac0a18a2e..910cb6ce650c96d4c7089fe86c3e88534bac78e7 100644 (file)
@@ -123,7 +123,6 @@ def parse_options():
         execfile(options_file, scope)
 
     arguments = options.parse_args()
-
     return options,arguments
 
 def interact(scope):
index d9836211fea68c29e2123a6a319d3f5bc018de6e..3caa907d7521a0ac4c58222723bf1ce8354d5427 100644 (file)
@@ -54,8 +54,8 @@ class System(SimObject):
     physmem = Param.PhysicalMemory("Physical Memory")
     mem_mode = Param.MemoryMode('atomic', "The mode the memory system is in")
     memories = VectorParam.PhysicalMemory(Self.all, "All memories is the system")
-
     work_item_id = Param.Int(-1, "specific work item id")
+    num_work_ids = Param.Int(16, "Number of distinct work item types")
     work_begin_cpu_id_exit = Param.Int(-1,
         "work started on specific id, now exit simulation")
     work_begin_ckpt_count = Param.Counter(0,
index 2062dfb8ce48540a3a02a3250efe2c396eb121bd..647420ca13d61229addb8a82a85768ac9739da17 100644 (file)
@@ -383,6 +383,7 @@ workbegin(ThreadContext *tc, uint64_t workid, uint64_t threadid)
     tc->getCpuPtr()->workItemBegin();
     System *sys = tc->getSystemPtr();
     const System::Params *params = sys->params();
+    sys->workItemBegin(threadid, workid);
 
     DPRINTF(WorkItems, "Work Begin workid: %d, threadid %d\n", workid, 
             threadid);
@@ -439,6 +440,7 @@ workend(ThreadContext *tc, uint64_t workid, uint64_t threadid)
     tc->getCpuPtr()->workItemEnd();
     System *sys = tc->getSystemPtr();
     const System::Params *params = sys->params();
+    sys->workItemEnd(threadid, workid);
 
     DPRINTF(WorkItems, "Work End workid: %d, threadid %d\n", workid, threadid);
 
index c58830c10970082d101b2cf8ec3f725747314efa..556a919d5c5807ae91fa3a321af02b8e01a2631b 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2011 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2003-2006 The Regents of The University of Michigan
  * Copyright (c) 2011 Regents of the University of California
  * All rights reserved.
@@ -43,6 +55,7 @@
 #include "config/the_isa.hh"
 #include "cpu/thread_context.hh"
 #include "debug/Loader.hh"
+#include "debug/WorkItems.hh"
 #include "mem/mem_object.hh"
 #include "mem/physical.hh"
 #include "sim/byteswap.hh"
@@ -76,8 +89,9 @@ System::System(Params *p)
       memoryMode(p->mem_mode),
       workItemsBegin(0),
       workItemsEnd(0),
+      numWorkIds(p->num_work_ids),
       _params(p),
-      totalNumInsts(0), 
+      totalNumInsts(0),
       instEventQueue("system instruction-based event queue")
 {
     // add self to global system list
@@ -171,6 +185,9 @@ System::~System()
     panic("System::fixFuncEventAddr needs to be rewritten "
           "to work with syscall emulation");
 #endif // FULL_SYSTEM}
+
+    for (uint32_t j = 0; j < numWorkIds; j++)
+        delete workItemStats[j];
 }
 
 void
@@ -339,6 +356,37 @@ System::unserialize(Checkpoint *cp, const string &section)
 #endif
 }
 
+void
+System::regStats()
+{
+    for (uint32_t j = 0; j < numWorkIds ; j++) {
+        workItemStats[j] = new Stats::Histogram();
+        stringstream namestr;
+        ccprintf(namestr, "work_item_type%d", j);
+        workItemStats[j]->init(20)
+                         .name(name() + "." + namestr.str())
+                         .desc("Run time stat for" + namestr.str())
+                         .prereq(*workItemStats[j]);
+    }
+}
+
+void
+System::workItemEnd(uint32_t tid, uint32_t workid)
+{
+    std::pair<uint32_t,uint32_t> p(tid, workid);
+    if (!lastWorkItemStarted.count(p))
+        return;
+
+    Tick samp = curTick() - lastWorkItemStarted[p];
+    DPRINTF(WorkItems, "Work item end: %d\t%d\t%lld\n", tid, workid, samp);
+
+    if (workid >= numWorkIds)
+        fatal("Got workid greater than specified in system configuration\n");
+
+    workItemStats[workid]->sample(samp);
+    lastWorkItemStarted.erase(p);
+}
+
 void
 System::printSystems()
 {
index ed5193dfd4b0fea5c78395ebb6552b4455eb68e8..44383c399342e6f0f2b6fdf40004e7c742515415 100644 (file)
@@ -171,14 +171,16 @@ class System : public SimObject
     Enums::MemoryMode memoryMode;
     uint64_t workItemsBegin;
     uint64_t workItemsEnd;
+    uint32_t numWorkIds;
     std::vector<bool> activeCpus;
 
   public:
+    virtual void regStats();
     /**
      * Called by pseudo_inst to track the number of work items started by this
      * system.
      */
-    uint64_t 
+    uint64_t
     incWorkItemsBegin()
     {
         return ++workItemsBegin;
@@ -212,6 +214,14 @@ class System : public SimObject
         return count;
     }
 
+    inline void workItemBegin(uint32_t tid, uint32_t workid)
+    {
+        std::pair<uint32_t,uint32_t> p(tid, workid);
+        lastWorkItemStarted[p] = curTick();
+    }
+
+    void workItemEnd(uint32_t tid, uint32_t workid);
+
 #if FULL_SYSTEM
     /**
      * Fix up an address used to match PCs for hooking simulator
@@ -303,6 +313,8 @@ class System : public SimObject
   public:
     Counter totalNumInsts;
     EventQueue instEventQueue;
+    std::map<std::pair<uint32_t,uint32_t>, Tick>  lastWorkItemStarted;
+    std::map<uint32_t, Stats::Histogram*> workItemStats;
 
     ////////////////////////////////////////////
     //