changeset 9fc3475e8175 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=9fc3475e8175
description:
        MOESI_hammer: break down miss latency stalled cycles

        This patch tracks the number of cycles a transaction is delayed at 
different
        points of the request-forward-response loop.

diffstat:

 src/mem/protocol/MOESI_hammer-cache.sm |  47 +++++++++++++++-
 src/mem/protocol/MOESI_hammer-dir.sm   |   8 ++
 src/mem/protocol/MOESI_hammer-msg.sm   |   4 +
 src/mem/protocol/RubySlicc_Types.sm    |   2 +
 src/mem/ruby/profiler/Profiler.cc      |  99 ++++++++++++++++++++++++++++++++++
 src/mem/ruby/profiler/Profiler.hh      |  24 ++++++++
 src/mem/ruby/system/Sequencer.cc       |  49 +++++++++++++++-
 src/mem/ruby/system/Sequencer.hh       |  19 ++++++-
 8 files changed, 245 insertions(+), 7 deletions(-)

diffs (truncated from 515 to 300 lines):

diff -r 3559d47839a1 -r 9fc3475e8175 src/mem/protocol/MOESI_hammer-cache.sm
--- a/src/mem/protocol/MOESI_hammer-cache.sm    Fri Aug 20 11:46:14 2010 -0700
+++ b/src/mem/protocol/MOESI_hammer-cache.sm    Fri Aug 20 11:46:14 2010 -0700
@@ -136,6 +136,9 @@
     int NumPendingMsgs,      desc="Number of acks/data messages that this 
processor is waiting for";
     bool Sharers,            desc="On a GetS, did we find any other sharers in 
the system";
     MachineID LastResponder, desc="last machine to send a response for this 
request";
+    Time InitialRequestTime, default="0", desc="time the initial requests was 
sent from the L1Cache";
+    Time ForwardRequestTime, default="0", desc="time the dir forwarded the 
request";
+    Time FirstResponseTime, default="0", desc="the time the first response was 
received";
   }
 
   external_type(TBETable) {
@@ -424,6 +427,7 @@
       out_msg.Requestor := machineID;
       out_msg.Destination.add(map_Address_to_Directory(address));
       out_msg.MessageSize := MessageSizeType:Request_Control;
+      out_msg.InitialRequestTime := get_time();
       TBEs[address].NumPendingMsgs := machineCount(MachineType:L1Cache); // 
One from each other cache (n-1) plus the memory (+1)
     }
   }
@@ -435,6 +439,7 @@
       out_msg.Requestor := machineID;
       out_msg.Destination.add(map_Address_to_Directory(address));
       out_msg.MessageSize := MessageSizeType:Request_Control;
+      out_msg.InitialRequestTime := get_time();
       TBEs[address].NumPendingMsgs := machineCount(MachineType:L1Cache); // 
One from each other cache (n-1) plus the memory (+1)
     }
   }
@@ -454,6 +459,8 @@
           out_msg.Acks := 2;
         }
         out_msg.MessageSize := MessageSizeType:Response_Data;
+        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
       }
     }
   }
@@ -483,6 +490,8 @@
           out_msg.Acks := 2;
         }
         out_msg.MessageSize := MessageSizeType:Response_Data;
+        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
       }
     }
   }
@@ -503,6 +512,8 @@
           out_msg.Acks := 2;
         }
         out_msg.MessageSize := MessageSizeType:Response_Data;
+        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
       }
     }
   }
@@ -517,6 +528,8 @@
         out_msg.Acks := 1;
         assert(in_msg.DirectedProbe == false);
         out_msg.MessageSize := MessageSizeType:Response_Control;
+        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
       }
     }
   }
@@ -531,6 +544,8 @@
         out_msg.Acks := 1;
         assert(in_msg.DirectedProbe == false);
         out_msg.MessageSize := MessageSizeType:Response_Control;
+        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
       }
     }
   }
@@ -580,7 +595,10 @@
 
       sequencer.readCallback(address, 
                              getNondirectHitMachType(in_msg.Address, 
in_msg.Sender),
-                             getCacheEntry(address).DataBlk);
+                             getCacheEntry(address).DataBlk,
+                             TBEs[address].InitialRequestTime,
+                             TBEs[address].ForwardRequestTime,
+                             TBEs[address].FirstResponseTime);
 
     }
   }
@@ -605,7 +623,10 @@
 
       sequencer.writeCallback(address, 
                               getNondirectHitMachType(address, in_msg.Sender),
-                              getCacheEntry(address).DataBlk);
+                              getCacheEntry(address).DataBlk,
+                              TBEs[address].InitialRequestTime,
+                              TBEs[address].ForwardRequestTime,
+                              TBEs[address].FirstResponseTime);
 
     }
     getCacheEntry(address).Dirty := true;
@@ -617,7 +638,10 @@
     sequencer.writeCallback(address, 
                             getNondirectHitMachType(address, 
                                                     
TBEs[address].LastResponder),
-                            getCacheEntry(address).DataBlk);
+                            getCacheEntry(address).DataBlk,
+                            TBEs[address].InitialRequestTime,
+                            TBEs[address].ForwardRequestTime,
+                            TBEs[address].FirstResponseTime);
 
     getCacheEntry(address).Dirty := true;
   }
@@ -649,6 +673,21 @@
       TBEs[address].NumPendingMsgs := TBEs[address].NumPendingMsgs - 
in_msg.Acks;
       DEBUG_EXPR(TBEs[address].NumPendingMsgs);
       TBEs[address].LastResponder := in_msg.Sender;
+      if (TBEs[address].InitialRequestTime != zero_time() && 
in_msg.InitialRequestTime != zero_time()) {
+        assert(TBEs[address].InitialRequestTime == in_msg.InitialRequestTime);
+      }
+      if (in_msg.InitialRequestTime != zero_time()) {
+        TBEs[address].InitialRequestTime := in_msg.InitialRequestTime;
+      }
+      if (TBEs[address].ForwardRequestTime != zero_time() && 
in_msg.ForwardRequestTime != zero_time()) {
+        assert(TBEs[address].ForwardRequestTime == in_msg.ForwardRequestTime);
+      }
+      if (in_msg.ForwardRequestTime != zero_time()) {
+        TBEs[address].ForwardRequestTime := in_msg.ForwardRequestTime;
+      }
+      if (TBEs[address].FirstResponseTime == zero_time()) {
+        TBEs[address].FirstResponseTime := get_time();
+      }
     }
   }
 
@@ -700,6 +739,8 @@
           out_msg.Acks := 2;
         }
         out_msg.MessageSize := MessageSizeType:Response_Data;
+        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
       }
     }
   }
diff -r 3559d47839a1 -r 9fc3475e8175 src/mem/protocol/MOESI_hammer-dir.sm
--- a/src/mem/protocol/MOESI_hammer-dir.sm      Fri Aug 20 11:46:14 2010 -0700
+++ b/src/mem/protocol/MOESI_hammer-dir.sm      Fri Aug 20 11:46:14 2010 -0700
@@ -645,6 +645,8 @@
           out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all 
L1 caches
           out_msg.Destination.remove(in_msg.Requestor); // Don't include the 
original requestor
           out_msg.MessageSize := MessageSizeType:Broadcast_Control;
+          out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+          out_msg.ForwardRequestTime := get_time();
         }
       }
     }
@@ -685,6 +687,8 @@
           out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all 
L1 caches
           out_msg.Destination.remove(in_msg.Requestor); // Don't include the 
original requestor
           out_msg.MessageSize := MessageSizeType:Broadcast_Control;
+          out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+          out_msg.ForwardRequestTime := get_time();
         }
       }
     }
@@ -701,6 +705,8 @@
           out_msg.Destination.add(getPfEntry(address).Owner);
           out_msg.MessageSize := MessageSizeType:Request_Control;
           out_msg.DirectedProbe := true;
+          out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+          out_msg.ForwardRequestTime := get_time();
         }
       }      
     } else {
@@ -712,6 +718,8 @@
           out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all 
L1 caches
           out_msg.Destination.remove(in_msg.Requestor); // Don't include the 
original requestor
           out_msg.MessageSize := MessageSizeType:Broadcast_Control;
+          out_msg.InitialRequestTime := in_msg.InitialRequestTime;
+          out_msg.ForwardRequestTime := get_time();
         }
       }
     }
diff -r 3559d47839a1 -r 9fc3475e8175 src/mem/protocol/MOESI_hammer-msg.sm
--- a/src/mem/protocol/MOESI_hammer-msg.sm      Fri Aug 20 11:46:14 2010 -0700
+++ b/src/mem/protocol/MOESI_hammer-msg.sm      Fri Aug 20 11:46:14 2010 -0700
@@ -78,6 +78,8 @@
   NetDest Destination,             desc="Multicast destination mask";
   MessageSizeType MessageSize, desc="size category of the message";
   bool DirectedProbe, default="false", desc="probe filter directed probe";
+  Time InitialRequestTime, default="0", desc="time the initial requests was 
sent from the L1Cache";
+  Time ForwardRequestTime, default="0", desc="time the dir forwarded the 
request";
 }
 
 // ResponseMsg (and also unblock requests)
@@ -90,6 +92,8 @@
   bool Dirty,                  desc="Is the data dirty (different than 
memory)?";
   int Acks,                    desc="How many messages this counts as";
   MessageSizeType MessageSize, desc="size category of the message";
+  Time InitialRequestTime, default="0", desc="time the initial requests was 
sent from the L1Cache";
+  Time ForwardRequestTime, default="0", desc="time the dir forwarded the 
request";
 }
 
 enumeration(DMARequestType, desc="...", default="DMARequestType_NULL") {
diff -r 3559d47839a1 -r 9fc3475e8175 src/mem/protocol/RubySlicc_Types.sm
--- a/src/mem/protocol/RubySlicc_Types.sm       Fri Aug 20 11:46:14 2010 -0700
+++ b/src/mem/protocol/RubySlicc_Types.sm       Fri Aug 20 11:46:14 2010 -0700
@@ -101,8 +101,10 @@
 external_type(Sequencer) {
   void readCallback(Address, DataBlock);
   void readCallback(Address, GenericMachineType, DataBlock);
+  void readCallback(Address, GenericMachineType, DataBlock, Time, Time, Time);
   void writeCallback(Address, DataBlock);
   void writeCallback(Address, GenericMachineType, DataBlock);
+  void writeCallback(Address, GenericMachineType, DataBlock, Time, Time, Time);
   void checkCoherence(Address);
   void profileNack(Address, int, int, uint64);
 }
diff -r 3559d47839a1 -r 9fc3475e8175 src/mem/ruby/profiler/Profiler.cc
--- a/src/mem/ruby/profiler/Profiler.cc Fri Aug 20 11:46:14 2010 -0700
+++ b/src/mem/ruby/profiler/Profiler.cc Fri Aug 20 11:46:14 2010 -0700
@@ -286,6 +286,35 @@
             }
         }
 
+        out << "miss_latency_wCC_issue_to_initial_request: " 
+            << m_wCCIssueToInitialRequestHistogram << endl;
+        out << "miss_latency_wCC_initial_forward_request: " 
+            << m_wCCInitialRequestToForwardRequestHistogram << endl;
+        out << "miss_latency_wCC_forward_to_first_response: " 
+            << m_wCCForwardRequestToFirstResponseHistogram << endl;
+        out << "miss_latency_wCC_first_response_to_completion: " 
+            << m_wCCFirstResponseToCompleteHistogram << endl;
+        out << "imcomplete_wCC_Times: " << m_wCCIncompleteTimes << endl;
+        out << "miss_latency_dir_issue_to_initial_request: " 
+            << m_dirIssueToInitialRequestHistogram << endl;
+        out << "miss_latency_dir_initial_forward_request: " 
+            << m_dirInitialRequestToForwardRequestHistogram << endl;
+        out << "miss_latency_dir_forward_to_first_response: " 
+            << m_dirForwardRequestToFirstResponseHistogram << endl;
+        out << "miss_latency_dir_first_response_to_completion: " 
+            << m_dirFirstResponseToCompleteHistogram << endl;
+        out << "imcomplete_dir_Times: " << m_dirIncompleteTimes << endl;
+
+        for (int i = 0; i < m_missMachLatencyHistograms.size(); i++) {
+            for (int j = 0; j < m_missMachLatencyHistograms[i].size(); j++) {
+                if (m_missMachLatencyHistograms[i][j].size() > 0) {
+                    out << "miss_latency_" << RubyRequestType(i) 
+                        << "_" << GenericMachineType(j) << ": "
+                        << m_missMachLatencyHistograms[i][j] << endl;
+                }
+            }
+        }
+
         out << endl;
 
         out << "All Non-Zero Cycle SW Prefetch Requests" << endl;
@@ -454,7 +483,24 @@
     for (int i = 0; i < m_machLatencyHistograms.size(); i++) {
         m_machLatencyHistograms[i].clear(200);
     }
+    m_missMachLatencyHistograms.resize(RubyRequestType_NUM);
+    for (int i = 0; i < m_missLatencyHistograms.size(); i++) {
+        m_missMachLatencyHistograms[i].resize(GenericMachineType_NUM+1);
+        for (int j = 0; j < m_missMachLatencyHistograms[i].size(); j++) {
+            m_missMachLatencyHistograms[i][j].clear(200);
+        }
+    }
     m_allMissLatencyHistogram.clear(200);
+    m_wCCIssueToInitialRequestHistogram.clear(200);
+    m_wCCInitialRequestToForwardRequestHistogram.clear(200);
+    m_wCCForwardRequestToFirstResponseHistogram.clear(200);
+    m_wCCFirstResponseToCompleteHistogram.clear(200);
+    m_wCCIncompleteTimes = 0;
+    m_dirIssueToInitialRequestHistogram.clear(200);
+    m_dirInitialRequestToForwardRequestHistogram.clear(200);
+    m_dirForwardRequestToFirstResponseHistogram.clear(200);
+    m_dirFirstResponseToCompleteHistogram.clear(200);
+    m_dirIncompleteTimes = 0;
 
     m_SWPrefetchLatencyHistograms.resize(CacheRequestType_NUM);
     for (int i = 0; i < m_SWPrefetchLatencyHistograms.size(); i++) {
@@ -581,6 +627,59 @@
     m_allMissLatencyHistogram.add(cycles);
     m_missLatencyHistograms[type].add(cycles);
     m_machLatencyHistograms[respondingMach].add(cycles);
+    m_missMachLatencyHistograms[type][respondingMach].add(cycles);
+}
+
+void
+Profiler::missLatencyWcc(Time issuedTime,
+                         Time initialRequestTime,
+                         Time forwardRequestTime,
+                         Time firstResponseTime,
+                         Time completionTime)
+{
+    if ((issuedTime <= initialRequestTime) &&
+        (initialRequestTime <= forwardRequestTime) &&
+        (forwardRequestTime <= firstResponseTime) &&
+        (firstResponseTime <= completionTime)) {
+        m_wCCIssueToInitialRequestHistogram.add(initialRequestTime - 
issuedTime);
+        
+        m_wCCInitialRequestToForwardRequestHistogram.add(forwardRequestTime - 
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to