summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Hower <drh5@cs.wisc.edu>2009-11-18 11:55:30 -0600
committerDerek Hower <drh5@cs.wisc.edu>2009-11-18 11:55:30 -0600
commit9ef5e72917c8417c81ce863160cded94d7deb1de (patch)
tree460c2b4dcdde237afed5b25d827624a3acf0af1e
parentd11dd6ed2cd1b4e124000beb2317008031a732a2 (diff)
downloadgem5-9ef5e72917c8417c81ce863160cded94d7deb1de.tar.xz
ruby: added sequencer stats to track what requests are waiting on
-rw-r--r--src/mem/ruby/system/Sequencer.cc40
-rw-r--r--src/mem/ruby/system/Sequencer.hh6
-rw-r--r--src/mem/ruby/system/System.cc4
3 files changed, 44 insertions, 6 deletions
diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc
index 3e0997708..a8b4b075a 100644
--- a/src/mem/ruby/system/Sequencer.cc
+++ b/src/mem/ruby/system/Sequencer.cc
@@ -49,6 +49,10 @@ long int already = 0;
Sequencer::Sequencer(const string & name)
:RubyPort(name)
{
+ m_store_waiting_on_load_cycles = 0;
+ m_store_waiting_on_store_cycles = 0;
+ m_load_waiting_on_store_cycles = 0;
+ m_load_waiting_on_load_cycles = 0;
}
void Sequencer::init(const vector<string> & argv)
@@ -143,6 +147,14 @@ void Sequencer::wakeup() {
}
}
+void Sequencer::printStats(ostream & out) const {
+ out << "Sequencer: " << m_name << endl;
+ out << " store_waiting_on_load_cycles: " << m_store_waiting_on_load_cycles << endl;
+ out << " store_waiting_on_store_cycles: " << m_store_waiting_on_store_cycles << endl;
+ out << " load_waiting_on_load_cycles: " << m_load_waiting_on_load_cycles << endl;
+ out << " load_waiting_on_store_cycles: " << m_load_waiting_on_store_cycles << endl;
+}
+
void Sequencer::printProgress(ostream& out) const{
/*
int total_demand = 0;
@@ -354,8 +366,24 @@ void Sequencer::hitCallback(SequencerRequest* srequest, DataBlock& data) {
// Returns true if the sequencer already has a load or store outstanding
int Sequencer::isReady(const RubyRequest& request) {
- if( m_writeRequestTable.exist(line_address(Address(request.paddr))) ||
- m_readRequestTable.exist(line_address(Address(request.paddr))) ){
+ bool is_outstanding_store = m_writeRequestTable.exist(line_address(Address(request.paddr)));
+ bool is_outstanding_load = m_readRequestTable.exist(line_address(Address(request.paddr)));
+ if ( is_outstanding_store ) {
+ if ((request.type == RubyRequestType_LD) ||
+ (request.type == RubyRequestType_IFETCH) ||
+ (request.type == RubyRequestType_RMW_Read)) {
+ m_store_waiting_on_load_cycles++;
+ } else {
+ m_store_waiting_on_store_cycles++;
+ }
+ return LIBRUBY_ALIASED_REQUEST;
+ } else if ( is_outstanding_load ) {
+ if ((request.type == RubyRequestType_ST) ||
+ (request.type == RubyRequestType_RMW_Write) ) {
+ m_load_waiting_on_store_cycles++;
+ } else {
+ m_load_waiting_on_load_cycles++;
+ }
return LIBRUBY_ALIASED_REQUEST;
}
@@ -392,14 +420,14 @@ int64_t Sequencer::makeRequest(const RubyRequest & request)
}
issueRequest(request);
- // TODO: issue hardware prefetches here
- return id;
+ // TODO: issue hardware prefetches here
+ return id;
}
else {
assert(0);
+ return 0;
}
- }
- else {
+ } else {
return ready;
}
}
diff --git a/src/mem/ruby/system/Sequencer.hh b/src/mem/ruby/system/Sequencer.hh
index 52c7860d0..231df01bb 100644
--- a/src/mem/ruby/system/Sequencer.hh
+++ b/src/mem/ruby/system/Sequencer.hh
@@ -88,6 +88,7 @@ public:
bool empty() const;
void print(ostream& out) const;
+ void printStats(ostream & out) const;
void checkCoherence(const Address& address);
// bool getRubyMemoryValue(const Address& addr, char* value, unsigned int size_in_bytes);
@@ -127,6 +128,11 @@ private:
bool m_deadlock_check_scheduled;
int m_atomic_reads;
int m_atomic_writes;
+
+ int m_store_waiting_on_load_cycles;
+ int m_store_waiting_on_store_cycles;
+ int m_load_waiting_on_store_cycles;
+ int m_load_waiting_on_load_cycles;
};
// Output operator declaration
diff --git a/src/mem/ruby/system/System.cc b/src/mem/ruby/system/System.cc
index ad67cdc80..4ce919618 100644
--- a/src/mem/ruby/system/System.cc
+++ b/src/mem/ruby/system/System.cc
@@ -335,6 +335,10 @@ void RubySystem::printStats(ostream& out)
m_profiler_ptr->printStats(out);
m_network_ptr->printStats(out);
+ for (map<string, Sequencer*>::const_iterator it = m_sequencers.begin();
+ it != m_sequencers.end(); it++) {
+ (*it).second->printStats(out);
+ }
for (map<string, CacheMemory*>::const_iterator it = m_caches.begin();
it != m_caches.end(); it++) {
(*it).second->printStats(out);