ruby: converts sparse memory stats to gem5 style

This commit is contained in:
Nilay Vaish 2013-09-06 16:21:28 -05:00
parent 53cf77cf18
commit c0a8ad0a35
7 changed files with 24 additions and 66 deletions

View file

@ -71,7 +71,6 @@ class AbstractController : public ClockedObject, public Consumer
virtual DataBlock& getDataBlock(const Address& addr) = 0; virtual DataBlock& getDataBlock(const Address& addr) = 0;
virtual void print(std::ostream & out) const = 0; virtual void print(std::ostream & out) const = 0;
virtual void printStats(std::ostream & out) const = 0;
virtual void wakeup() = 0; virtual void wakeup() = 0;
virtual void clearStats() = 0; virtual void clearStats() = 0;
virtual void regStats() = 0; virtual void regStats() = 0;

View file

@ -192,10 +192,10 @@ DirectoryMemory::print(ostream& out) const
} }
void void
DirectoryMemory::printStats(ostream& out) const DirectoryMemory::regStats()
{ {
if (m_use_map) { if (m_use_map) {
m_sparseMemory->printStats(out); m_sparseMemory->regStats(name());
} }
} }

View file

@ -63,7 +63,7 @@ class DirectoryMemory : public SimObject
void invalidateBlock(PhysAddress address); void invalidateBlock(PhysAddress address);
void print(std::ostream& out) const; void print(std::ostream& out) const;
void printStats(std::ostream& out) const; void regStats();
void recordRequestType(DirectoryRequestType requestType); void recordRequestType(DirectoryRequestType requestType);

View file

@ -57,15 +57,6 @@ SparseMemory::SparseMemory(int number_of_levels)
m_number_of_bits_per_level[level] = even_level_bits; m_number_of_bits_per_level[level] = even_level_bits;
} }
m_map_head = new SparseMapType; 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() SparseMemory::~SparseMemory()
@ -73,8 +64,6 @@ SparseMemory::~SparseMemory()
recursivelyRemoveTables(m_map_head, 0); recursivelyRemoveTables(m_map_head, 0);
delete m_map_head; delete m_map_head;
delete [] m_number_of_bits_per_level; 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. // Recursively search table hierarchy for the lowest level table.
@ -409,21 +398,20 @@ SparseMemory::recordBlocks(int cntrl_id, CacheRecorder* tr) const
} }
void void
SparseMemory::print(ostream& out) const SparseMemory::regStats(const string &name)
{ {
} m_total_adds.name(name + ".total_adds");
void m_adds_per_level
SparseMemory::printStats(ostream& out) const .init(m_number_of_levels)
{ .name(name + ".adds_per_level")
out << "total_adds: " << m_total_adds << " ["; .flags(Stats::pdf | Stats::total)
for (int level = 0; level < m_number_of_levels; level++) { ;
out << m_adds_per_level[level] << " ";
} m_total_removes.name(name + ".total_removes");
out << "]" << endl; m_removes_per_level
out << "total_removes: " << m_total_removes << " ["; .init(m_number_of_levels)
for (int level = 0; level < m_number_of_levels; level++) { .name(name + ".removes_per_level")
out << m_removes_per_level[level] << " "; .flags(Stats::pdf | Stats::total)
} ;
out << "]" << endl;
} }

View file

@ -31,8 +31,10 @@
#define __MEM_RUBY_SYSTEM_SPARSEMEMORY_HH__ #define __MEM_RUBY_SYSTEM_SPARSEMEMORY_HH__
#include <iostream> #include <iostream>
#include <string>
#include "base/hashmap.hh" #include "base/hashmap.hh"
#include "base/statistics.hh"
#include "mem/ruby/common/Address.hh" #include "mem/ruby/common/Address.hh"
#include "mem/ruby/recorder/CacheRecorder.hh" #include "mem/ruby/recorder/CacheRecorder.hh"
#include "mem/ruby/slicc_interface/AbstractEntry.hh" #include "mem/ruby/slicc_interface/AbstractEntry.hh"
@ -67,14 +69,9 @@ class SparseMemory
void recordBlocks(int cntrl_id, CacheRecorder *) const; void recordBlocks(int cntrl_id, CacheRecorder *) const;
AbstractEntry* lookup(const Address& address); AbstractEntry* lookup(const Address& address);
void regStats(const std::string &name);
// Print cache contents
void print(std::ostream& out) const;
void printStats(std::ostream& out) const;
private: private:
// Private Methods
// Private copy constructor and assignment operator // Private copy constructor and assignment operator
SparseMemory(const SparseMemory& obj); SparseMemory(const SparseMemory& obj);
SparseMemory& operator=(const SparseMemory& obj); SparseMemory& operator=(const SparseMemory& obj);
@ -92,10 +89,10 @@ class SparseMemory
int m_number_of_levels; int m_number_of_levels;
int* m_number_of_bits_per_level; int* m_number_of_bits_per_level;
uint64_t m_total_adds; Stats::Scalar m_total_adds;
uint64_t m_total_removes; Stats::Vector m_adds_per_level;
uint64_t* m_adds_per_level; Stats::Scalar m_total_removes;
uint64_t* m_removes_per_level; Stats::Vector m_removes_per_level;
}; };
#endif // __MEM_RUBY_SYSTEM_SPARSEMEMORY_HH__ #endif // __MEM_RUBY_SYSTEM_SPARSEMEMORY_HH__

View file

@ -145,15 +145,6 @@ RubySystem::printStats(ostream& out)
m_profiler_ptr->printStats(out); m_profiler_ptr->printStats(out);
m_network_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 void

View file

@ -257,7 +257,6 @@ class $c_ident : public AbstractController
void print(std::ostream& out) const; void print(std::ostream& out) const;
void wakeup(); void wakeup();
void printStats(std::ostream& out) const;
void clearStats(); void clearStats();
void regStats(); void regStats();
void collateStats(); void collateStats();
@ -847,22 +846,6 @@ $c_ident::print(ostream& out) const
out << "[$c_ident " << m_version << "]"; 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() void $c_ident::clearStats()
{ {
for (int state = 0; state < ${ident}_State_NUM; state++) { for (int state = 0; state < ${ident}_State_NUM; state++) {