ruby: converts sparse memory stats to gem5 style
authorNilay Vaish <nilay@cs.wisc.edu>
Fri, 6 Sep 2013 21:21:28 +0000 (16:21 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Fri, 6 Sep 2013 21:21:28 +0000 (16:21 -0500)
src/mem/ruby/slicc_interface/AbstractController.hh
src/mem/ruby/system/DirectoryMemory.cc
src/mem/ruby/system/DirectoryMemory.hh
src/mem/ruby/system/SparseMemory.cc
src/mem/ruby/system/SparseMemory.hh
src/mem/ruby/system/System.cc
src/mem/slicc/symbols/StateMachine.py

index 88b82854cea47f4ac7fb8cc78a370cc0e274da5f..3ad1a0fba046f355b762c512d2ef020fe200066c 100644 (file)
@@ -71,7 +71,6 @@ class AbstractController : public ClockedObject, public Consumer
     virtual DataBlock& getDataBlock(const Address& addr) = 0;
 
     virtual void print(std::ostream & out) const = 0;
-    virtual void printStats(std::ostream & out) const = 0;
     virtual void wakeup() = 0;
     virtual void clearStats() = 0;
     virtual void regStats() = 0;
index b44f77435836522d84440d4db3f305a8aaf8e77a..1cf02091084288d0d4b129214e3a331d98a8931b 100644 (file)
@@ -192,10 +192,10 @@ DirectoryMemory::print(ostream& out) const
 }
 
 void
-DirectoryMemory::printStats(ostream& out) const
+DirectoryMemory::regStats()
 {
     if (m_use_map) {
-        m_sparseMemory->printStats(out);
+        m_sparseMemory->regStats(name());
     }
 }
 
index c47a73089a684213bc2d9080c09346d7ef941f40..8aa89ce129f127d30be6f902bc2e73a5853ddfe4 100644 (file)
@@ -63,7 +63,7 @@ class DirectoryMemory : public SimObject
     void invalidateBlock(PhysAddress address);
 
     void print(std::ostream& out) const;
-    void printStats(std::ostream& out) const;
+    void regStats();
 
     void recordRequestType(DirectoryRequestType requestType);
 
index db8d494f8b78a741627747a85b2e3f57be1b9301..a16e553a34dac4a4035cd2a07d5453e6df5f63fa 100644 (file)
@@ -57,15 +57,6 @@ SparseMemory::SparseMemory(int number_of_levels)
             m_number_of_bits_per_level[level] = even_level_bits;
     }
     m_map_head = new SparseMapType;
-
-    m_total_adds = 0;
-    m_total_removes = 0;
-    m_adds_per_level = new uint64_t[m_number_of_levels];
-    m_removes_per_level = new uint64_t[m_number_of_levels];
-    for (int level = 0; level < m_number_of_levels; level++) {
-        m_adds_per_level[level] = 0;
-        m_removes_per_level[level] = 0;
-    }
 }
 
 SparseMemory::~SparseMemory()
@@ -73,8 +64,6 @@ SparseMemory::~SparseMemory()
     recursivelyRemoveTables(m_map_head, 0);
     delete m_map_head;
     delete [] m_number_of_bits_per_level;
-    delete [] m_adds_per_level;
-    delete [] m_removes_per_level;
 }
 
 // Recursively search table hierarchy for the lowest level table.
@@ -409,21 +398,20 @@ SparseMemory::recordBlocks(int cntrl_id, CacheRecorder* tr) const
 }
 
 void
-SparseMemory::print(ostream& out) const
+SparseMemory::regStats(const string &name)
 {
-}
-
-void
-SparseMemory::printStats(ostream& out) const
-{
-    out << "total_adds: " << m_total_adds << " [";
-    for (int level = 0; level < m_number_of_levels; level++) {
-        out << m_adds_per_level[level] << " ";
-    }
-    out << "]" << endl;
-    out << "total_removes: " << m_total_removes << " [";
-    for (int level = 0; level < m_number_of_levels; level++) {
-        out << m_removes_per_level[level] << " ";
-    }
-    out << "]" << endl;
+    m_total_adds.name(name + ".total_adds");
+
+    m_adds_per_level
+        .init(m_number_of_levels)
+        .name(name + ".adds_per_level")
+        .flags(Stats::pdf | Stats::total)
+        ;
+
+    m_total_removes.name(name + ".total_removes");
+    m_removes_per_level
+        .init(m_number_of_levels)
+        .name(name + ".removes_per_level")
+        .flags(Stats::pdf | Stats::total)
+        ;
 }
index 143ed5c1ed398d8b6f9cdbdc94ff943ec302f374..65e0ae8ad273740bc032b3e103cf0e3acfbeb620 100644 (file)
 #define __MEM_RUBY_SYSTEM_SPARSEMEMORY_HH__
 
 #include <iostream>
+#include <string>
 
 #include "base/hashmap.hh"
+#include "base/statistics.hh"
 #include "mem/ruby/common/Address.hh"
 #include "mem/ruby/recorder/CacheRecorder.hh"
 #include "mem/ruby/slicc_interface/AbstractEntry.hh"
@@ -67,14 +69,9 @@ class SparseMemory
     void recordBlocks(int cntrl_id, CacheRecorder *) const;
 
     AbstractEntry* lookup(const Address& address);
-
-    // Print cache contents
-    void print(std::ostream& out) const;
-    void printStats(std::ostream& out) const;
+    void regStats(const std::string &name);
 
   private:
-    // Private Methods
-
     // Private copy constructor and assignment operator
     SparseMemory(const SparseMemory& obj);
     SparseMemory& operator=(const SparseMemory& obj);
@@ -92,10 +89,10 @@ class SparseMemory
     int m_number_of_levels;
     int* m_number_of_bits_per_level;
 
-    uint64_t m_total_adds;
-    uint64_t m_total_removes;
-    uint64_t* m_adds_per_level;
-    uint64_t* m_removes_per_level;
+    Stats::Scalar m_total_adds;
+    Stats::Vector m_adds_per_level;
+    Stats::Scalar m_total_removes;
+    Stats::Vector m_removes_per_level;
 };
 
 #endif // __MEM_RUBY_SYSTEM_SPARSEMEMORY_HH__
index 357511127f69ea3441e1be26170592b6317200e8..4fb6bbde151697f87adc1b7c0afc228b428c504d 100644 (file)
@@ -145,15 +145,6 @@ RubySystem::printStats(ostream& out)
 
     m_profiler_ptr->printStats(out);
     m_network_ptr->printStats(out);
-
-    for (uint32_t i = 0;i < g_abs_controls.size(); ++i) {
-        for (map<uint32_t, AbstractController *>::iterator it =
-                g_abs_controls[i].begin();
-             it != g_abs_controls[i].end(); ++it) {
-
-            ((*it).second)->printStats(out);
-        }
-    }
 }
 
 void
index 6d67f27ba0a47a48e26ef3cd50ebc6451bfd3f79..c96af4a9062e6feb0c97605d81b4829aa65b646a 100644 (file)
@@ -257,7 +257,6 @@ class $c_ident : public AbstractController
 
     void print(std::ostream& out) const;
     void wakeup();
-    void printStats(std::ostream& out) const;
     void clearStats();
     void regStats();
     void collateStats();
@@ -847,22 +846,6 @@ $c_ident::print(ostream& out) const
     out << "[$c_ident " << m_version << "]";
 }
 
-void
-$c_ident::printStats(ostream& out) const
-{
-''')
-        #
-        # Cache and Memory Controllers have specific profilers associated with
-        # them.  Print out these stats before dumping state transition stats.
-        #
-        for param in self.config_parameters:
-            if param.type_ast.type.ident == "DirectoryMemory":
-                assert(param.pointer)
-                code('    m_${{param.ident}}_ptr->printStats(out);')
-
-        code('''
-}
-
 void $c_ident::clearStats()
 {
     for (int state = 0; state < ${ident}_State_NUM; state++) {