cpu: Additional TrafficGen stats
authorTiago Muck <tiago.muck@arm.com>
Tue, 29 Jan 2019 20:25:22 +0000 (14:25 -0600)
committerTiago Mück <tiago.muck@arm.com>
Tue, 11 Jun 2019 18:43:23 +0000 (18:43 +0000)
Additional stats to keep track of read/write latencies and throughput.

Change-Id: I7684cd33cf68fffdef4ca9c3a6db360a0f531c18
Signed-off-by: Tiago Muck <tiago.muck@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18418
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/cpu/testers/traffic_gen/base.cc
src/cpu/testers/traffic_gen/base.hh

index f2385a49cf05acf198eeeccd071fa48b249cc293..154b1bded6661ee2ee05e33da62d35553d99fa31 100644 (file)
@@ -354,6 +354,51 @@ BaseTrafficGen::regStats()
     retryTicks
         .name(name() + ".retryTicks")
         .desc("Time spent waiting due to back-pressure (ticks)");
+
+    bytesRead
+        .name(name() + ".bytesRead")
+        .desc("Number of bytes read");
+
+    bytesWritten
+        .name(name() + ".bytesWritten")
+        .desc("Number of bytes written");
+
+    totalReadLatency
+        .name(name() + ".totalReadLatency")
+        .desc("Total latency of read requests");
+
+    totalWriteLatency
+        .name(name() + ".totalWriteLatency")
+        .desc("Total latency of write requests");
+
+    totalReads
+        .name(name() + ".totalReads")
+        .desc("Total num of reads");
+
+    totalWrites
+        .name(name() + ".totalWrites")
+        .desc("Total num of writes");
+
+    avgReadLatency
+        .name(name() + ".avgReadLatency")
+        .desc("Avg latency of read requests");
+    avgReadLatency = totalReadLatency / totalReads;
+
+    avgWriteLatency
+        .name(name() + ".avgWriteLatency")
+        .desc("Avg latency of write requests");
+    avgWriteLatency = totalWriteLatency / totalWrites;
+
+    readBW
+        .name(name() + ".readBW")
+        .desc("Read bandwidth in bytes/s");
+    readBW = bytesRead / simSeconds;
+
+    writeBW
+        .name(name() + ".writeBW")
+        .desc("Write bandwidth in bytes/s");
+    writeBW = bytesWritten / simSeconds;
+
 }
 
 std::shared_ptr<BaseGen>
@@ -470,6 +515,16 @@ BaseTrafficGen::recvTimingResp(PacketPtr pkt)
 
     assert(iter->second <= curTick());
 
+    if (pkt->isWrite()) {
+        ++totalWrites;
+        bytesWritten += pkt->req->getSize();
+        totalWriteLatency += curTick() - iter->second;
+    } else {
+        ++totalReads;
+        bytesRead += pkt->req->getSize();
+        totalReadLatency += curTick() - iter->second;
+    }
+
     waitingResp.erase(iter);
 
     delete pkt;
index 5ffe508a7395b0d9422a4655d11c0e68d0dc8478..985ab5d4ca4c23673dc7f9b1269a456960639535 100644 (file)
@@ -206,6 +206,36 @@ class BaseTrafficGen : public ClockedObject
     /** Reqs waiting for response **/
     std::unordered_map<RequestPtr,Tick> waitingResp;
 
+    /** Count the number of bytes read. */
+    Stats::Scalar bytesRead;
+
+    /** Count the number of bytes written. */
+    Stats::Scalar bytesWritten;
+
+    /** Total num of ticks read reqs took to complete  */
+    Stats::Scalar totalReadLatency;
+
+    /** Total num of ticks write reqs took to complete  */
+    Stats::Scalar totalWriteLatency;
+
+    /** Count the number reads. */
+    Stats::Scalar totalReads;
+
+    /** Count the number writes. */
+    Stats::Scalar totalWrites;
+
+    /** Avg num of ticks each read req took to complete  */
+    Stats::Formula avgReadLatency;
+
+    /** Avg num of ticks each write reqs took to complete  */
+    Stats::Formula avgWriteLatency;
+
+    /** Read bandwidth in bytes/s  */
+    Stats::Formula readBW;
+
+    /** Write bandwidth in bytes/s  */
+    Stats::Formula writeBW;
+
   public:
     BaseTrafficGen(const BaseTrafficGenParams* p);