cpu: Convert traffic gen to use new stats

Change-Id: Ife690a137c2dcfb6bcc8b22df996c84f0d231618
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/19370
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Andreas Sandberg
2019-06-26 18:59:06 +01:00
parent c8f06b862c
commit 7e5bdd07e4
2 changed files with 71 additions and 115 deletions

View File

@@ -80,6 +80,7 @@ BaseTrafficGen::BaseTrafficGen(const BaseTrafficGenParams* p)
retryPkt(NULL),
retryPktTick(0), blockedWaitingResp(false),
updateEvent([this]{ update(); }, name()),
stats(this),
masterID(system->getMasterId(this)),
streamGenerator(StreamGen::create(p))
{
@@ -195,7 +196,7 @@ BaseTrafficGen::update()
// suppress packets that are not destined for a memory, such as
// device accesses that could be part of a trace
if (pkt && system->isMemAddr(pkt->getAddr())) {
numPackets++;
stats.numPackets++;
// Only attempts to send if not blocked by pending responses
blockedWaitingResp = allocateWaitingRespSlot(pkt);
if (blockedWaitingResp || !port.sendTimingReq(pkt)) {
@@ -206,10 +207,10 @@ BaseTrafficGen::update()
DPRINTF(TrafficGen, "Suppressed packet %s 0x%x\n",
pkt->cmdString(), pkt->getAddr());
++numSuppressed;
if (!(static_cast<int>(numSuppressed.value()) % 10000))
++stats.numSuppressed;
if (!(static_cast<int>(stats.numSuppressed.value()) % 10000))
warn("%s suppressed %d packets with non-memory addresses\n",
name(), numSuppressed.value());
name(), stats.numSuppressed.value());
delete pkt;
pkt = nullptr;
@@ -288,7 +289,7 @@ void
BaseTrafficGen::recvReqRetry()
{
DPRINTF(TrafficGen, "Received retry\n");
numRetries++;
stats.numRetries++;
retryReq();
}
@@ -308,7 +309,7 @@ BaseTrafficGen::retryReq()
// the tick for the next packet
Tick delay = curTick() - retryPktTick;
retryPktTick = 0;
retryTicks += delay;
stats.retryTicks += delay;
if (drainState() != DrainState::Draining) {
// packet is sent, so find out when the next one is due
@@ -331,74 +332,28 @@ BaseTrafficGen::noProgress()
name(), progressCheck);
}
void
BaseTrafficGen::regStats()
BaseTrafficGen::StatGroup::StatGroup(Stats::Group *parent)
: Stats::Group(parent),
ADD_STAT(numSuppressed,
"Number of suppressed packets to non-memory space"),
ADD_STAT(numPackets, "Number of packets generated"),
ADD_STAT(numRetries, "Number of retries"),
ADD_STAT(retryTicks, "Time spent waiting due to back-pressure (ticks)"),
ADD_STAT(bytesRead, "Number of bytes read"),
ADD_STAT(bytesWritten, "Number of bytes written"),
ADD_STAT(totalReadLatency, "Total latency of read requests"),
ADD_STAT(totalWriteLatency, "Total latency of write requests"),
ADD_STAT(totalReads, "Total num of reads"),
ADD_STAT(totalWrites, "Total num of writes"),
ADD_STAT(avgReadLatency, "Avg latency of read requests",
totalReadLatency / totalReads),
ADD_STAT(avgWriteLatency, "Avg latency of write requests",
totalWriteLatency / totalWrites),
ADD_STAT(readBW, "Read bandwidth in bytes/s",
bytesRead / simSeconds),
ADD_STAT(writeBW, "Write bandwidth in bytes/s",
bytesWritten / simSeconds)
{
ClockedObject::regStats();
// Initialise all the stats
using namespace Stats;
numPackets
.name(name() + ".numPackets")
.desc("Number of packets generated");
numSuppressed
.name(name() + ".numSuppressed")
.desc("Number of suppressed packets to non-memory space");
numRetries
.name(name() + ".numRetries")
.desc("Number of retries");
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>
@@ -516,13 +471,13 @@ BaseTrafficGen::recvTimingResp(PacketPtr pkt)
assert(iter->second <= curTick());
if (pkt->isWrite()) {
++totalWrites;
bytesWritten += pkt->req->getSize();
totalWriteLatency += curTick() - iter->second;
++stats.totalWrites;
stats.bytesWritten += pkt->req->getSize();
stats.totalWriteLatency += curTick() - iter->second;
} else {
++totalReads;
bytesRead += pkt->req->getSize();
totalReadLatency += curTick() - iter->second;
++stats.totalReads;
stats.bytesRead += pkt->req->getSize();
stats.totalReadLatency += curTick() - iter->second;
}
waitingResp.erase(iter);

View File

@@ -190,51 +190,55 @@ class BaseTrafficGen : public ClockedObject
/** Event for scheduling updates */
EventFunctionWrapper updateEvent;
/** Count the number of dropped requests. */
Stats::Scalar numSuppressed;
private: // Stats
/** Count the number of generated packets. */
Stats::Scalar numPackets;
/** Count the number of retries. */
Stats::Scalar numRetries;
/** Count the time incurred from back-pressure. */
Stats::Scalar retryTicks;
protected: // Stats
/** Reqs waiting for response **/
std::unordered_map<RequestPtr,Tick> waitingResp;
/** Count the number of bytes read. */
Stats::Scalar bytesRead;
struct StatGroup : public Stats::Group {
StatGroup(Stats::Group *parent);
/** Count the number of bytes written. */
Stats::Scalar bytesWritten;
/** Count the number of dropped requests. */
Stats::Scalar numSuppressed;
/** Total num of ticks read reqs took to complete */
Stats::Scalar totalReadLatency;
/** Count the number of generated packets. */
Stats::Scalar numPackets;
/** Total num of ticks write reqs took to complete */
Stats::Scalar totalWriteLatency;
/** Count the number of retries. */
Stats::Scalar numRetries;
/** Count the number reads. */
Stats::Scalar totalReads;
/** Count the time incurred from back-pressure. */
Stats::Scalar retryTicks;
/** Count the number writes. */
Stats::Scalar totalWrites;
/** Count the number of bytes read. */
Stats::Scalar bytesRead;
/** Avg num of ticks each read req took to complete */
Stats::Formula avgReadLatency;
/** Count the number of bytes written. */
Stats::Scalar bytesWritten;
/** Avg num of ticks each write reqs took to complete */
Stats::Formula avgWriteLatency;
/** Total num of ticks read reqs took to complete */
Stats::Scalar totalReadLatency;
/** Read bandwidth in bytes/s */
Stats::Formula readBW;
/** Total num of ticks write reqs took to complete */
Stats::Scalar totalWriteLatency;
/** Write bandwidth in bytes/s */
Stats::Formula writeBW;
/** 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;
} stats;
public:
BaseTrafficGen(const BaseTrafficGenParams* p);
@@ -251,9 +255,6 @@ class BaseTrafficGen : public ClockedObject
void serialize(CheckpointOut &cp) const override;
void unserialize(CheckpointIn &cp) override;
/** Register statistics */
void regStats() override;
public: // Generator factory methods
std::shared_ptr<BaseGen> createIdle(Tick duration);
std::shared_ptr<BaseGen> createExit(Tick duration);