ruby: added sequencer stats to track what requests are waiting on Calvin_Submission
authorDerek Hower <drh5@cs.wisc.edu>
Wed, 18 Nov 2009 17:55:30 +0000 (11:55 -0600)
committerDerek Hower <drh5@cs.wisc.edu>
Wed, 18 Nov 2009 17:55:30 +0000 (11:55 -0600)
src/mem/ruby/system/Sequencer.cc
src/mem/ruby/system/Sequencer.hh
src/mem/ruby/system/System.cc

index 3e099770850212d564a2057a5a00db31ffb2a16b..a8b4b075acfc56d627dac2eb109e700beb742deb 100644 (file)
@@ -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;
   }
 }
index 52c7860d0d0ed17b3aff4c63b51b616e07cf639e..231df01bbfdd919c6f96516c30d85a9ea8524e9e 100644 (file)
@@ -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
index ad67cdc8024a28727dc4d7656b65c6f096731855..4ce919618ed66412e075e0dbfa7ea981d38942c1 100644 (file)
@@ -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);