ruby: added ruby stats print
authorBrad Beckmann <Brad.Beckmann@amd.com>
Sat, 30 Jan 2010 04:29:21 +0000 (20:29 -0800)
committerBrad Beckmann <Brad.Beckmann@amd.com>
Sat, 30 Jan 2010 04:29:21 +0000 (20:29 -0800)
Moved the previous rubymem stats print feature to ruby System so that ruby
stats are printed on simulation exit.

src/mem/ruby/network/simple/SimpleNetwork.cc
src/mem/ruby/network/simple/Topology.cc
src/mem/ruby/network/simple/Topology.hh
src/mem/ruby/system/RubySystem.py
src/mem/ruby/system/System.cc
src/mem/ruby/system/System.hh

index ecd38de1ae95a85d33f71d04d264a0d46932c9d6..2de8d07e5ebd02024423ab0f0d2f33fa842e4a5e 100644 (file)
@@ -225,6 +225,7 @@ void SimpleNetwork::printStats(ostream& out) const
   for(int i=0; i<m_switch_ptr_vector.size(); i++) {
     m_switch_ptr_vector[i]->printStats(out);
   }
+  m_topology_ptr->printStats(out);
 }
 
 void SimpleNetwork::clearStats()
@@ -232,6 +233,7 @@ void SimpleNetwork::clearStats()
   for(int i=0; i<m_switch_ptr_vector.size(); i++) {
     m_switch_ptr_vector[i]->clearStats();
   }
+  m_topology_ptr->clearStats();
 }
 
 void SimpleNetwork::printConfig(ostream& out) const
index 15c94d97d53a136d6370fafd2423b4d4dc40486b..e7fbe1ce33e02a4824924197bc2ba4bb5003dccc 100644 (file)
@@ -238,6 +238,20 @@ void Topology::makeLink(Network *net, SwitchID src, SwitchID dest, const NetDest
   }
 }
 
+void Topology::printStats(ostream& out) const
+{
+    for (int cntrl = 0; cntrl < m_controller_vector.size(); cntrl++) {
+      m_controller_vector[cntrl]->printStats(out);
+    }
+}
+
+void Topology::clearStats()
+{
+    for (int cntrl = 0; cntrl < m_controller_vector.size(); cntrl++) {
+        m_controller_vector[cntrl]->clearStats();
+    }
+}
+
 void Topology::printConfig(ostream& out) const
 {
   if (m_print_config == false) return;
index fb010090f5495cb7110aaa7cf41c8e551b8e9b0f..c274ed3303427d0bca2f7af6147eacb81a7e7b77 100644 (file)
@@ -102,8 +102,8 @@ public:
   void initNetworkPtr(Network* net_ptr);
 
   const string getName() { return m_name; }
-  void printStats(ostream& out) const {}
-  void clearStats() {}
+  void printStats(ostream& out) const;
+  void clearStats();
   void printConfig(ostream& out) const;
   void print(ostream& out) const { out << "[Topology]"; }
 
index 668a19544ec3238d53d96275f0dadf2b6aedac46..d53271e4538c07c70c4df0cedff979aca114eda3 100644 (file)
@@ -14,4 +14,5 @@ class RubySystem(SimObject):
     debug = Param.RubyDebug("the default debug object")
     profiler = Param.RubyProfiler("");
     tracer = Param.RubyTracer("");
-    
+    stats_filename = Param.String("ruby.stats",
+        "file to which ruby dumps its stats")
index 4dcca2f83e124a6208770d01b086a9135955a0fd..3159a28884bff8da5724703edb1ed9042c8b2127 100644 (file)
@@ -56,6 +56,7 @@
 //#include "mem/ruby/network/garnet-flexible-pipeline/GarnetNetwork.hh"
 //#include "mem/ruby/network/garnet-fixed-pipeline/GarnetNetwork_d.hh"
 #include "mem/ruby/system/MemoryControl.hh"
+#include "base/output.hh"
 
 int RubySystem::m_random_seed;
 bool RubySystem::m_randomization;
@@ -109,6 +110,12 @@ RubySystem::RubySystem(const Params *p)
     g_system_ptr = this;
     m_mem_vec_ptr = new MemoryVector;
     m_mem_vec_ptr->setSize(m_memory_size_bytes);
+
+    //
+    // Print ruby configuration and stats at exit
+    //
+    RubyExitCallback* rubyExitCB = new RubyExitCallback(p->stats_filename);
+    registerExitCallback(rubyExitCB);
 }
 
 
@@ -263,9 +270,20 @@ void RubySystem::checkGlobalCoherenceInvariant(const Address& addr  )  {
 }
 #endif
 
-
 RubySystem *
 RubySystemParams::create()
 {
     return new RubySystem(this);
 }
+
+/**
+ * virtual process function that is invoked when the callback
+ * queue is executed.
+ */
+void RubyExitCallback::process()
+{
+    std::ostream *os = simout.create(stats_filename);
+    RubySystem::printConfig(*os);
+    *os << endl;
+    RubySystem::printStats(*os);
+}
index 1aebad748e1607d6457547c3c621d5a5ae5cc054..bc5cd3f3dbc6fcca56a295f21f900e71b2587bd6 100644 (file)
@@ -48,6 +48,7 @@
 #include <map>
 #include "sim/sim_object.hh"
 #include "params/RubySystem.hh"
+#include "base/callback.hh"
 
 class Profiler;
 class Network;
@@ -201,6 +202,27 @@ ostream& operator<<(ostream& out, const RubySystem& obj)
   return out;
 }
 
+class RubyExitCallback : public Callback
+{
+  private:
+    string stats_filename;
+
+  public:
+    /**
+     * virtualize the destructor to make sure that the correct one
+     * gets called.
+     */
+
+    virtual ~RubyExitCallback() {}
+
+    RubyExitCallback(const string& _stats_filename)
+    {
+      stats_filename = _stats_filename;
+    }
+
+    virtual void process();
+};
+
 #endif //SYSTEM_H