From eb19fc29761a99ff7d5a5e4588866b487a2082ee Mon Sep 17 00:00:00 2001 From: Radhika Jagtap Date: Mon, 7 Dec 2015 16:42:15 -0600 Subject: [PATCH] probe: Add probe in Fetch, IEW, Rename and Commit This patch adds probe points in Fetch, IEW, Rename and Commit stages as follows. A probe point is added in the Fetch stage for probing when a fetch request is sent. Notify is fired on the probe point when a request is sent succesfully in the first attempt as well as on a retry attempt. Probe points are added in the IEW stage when an instruction begins to execute and when execution is complete. This points can be used for monitoring the execution time of an instruction. Probe points are added in the Rename stage to probe renaming of source and destination registers and when there is squashing. These probe points can be used to track register dependencies and remove when there is squashing. A probe point for squashing is added in Commit to probe squashed instructions. --- src/cpu/o3/commit.hh | 2 ++ src/cpu/o3/commit_impl.hh | 3 +++ src/cpu/o3/cpu.cc | 1 + src/cpu/o3/fetch.hh | 2 ++ src/cpu/o3/fetch_impl.hh | 9 +++++++++ src/cpu/o3/iew.hh | 4 ++++ src/cpu/o3/iew_impl.hh | 19 +++++++++++++++++++ src/cpu/o3/rename.hh | 15 +++++++++++++++ src/cpu/o3/rename_impl.hh | 19 ++++++++++++++++++- 9 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/cpu/o3/commit.hh b/src/cpu/o3/commit.hh index 6688a70dc..48c169389 100644 --- a/src/cpu/o3/commit.hh +++ b/src/cpu/o3/commit.hh @@ -154,6 +154,8 @@ class DefaultCommit /** Probe Points. */ ProbePointArg *ppCommit; ProbePointArg *ppCommitStall; + /** To probe when an instruction is squashed */ + ProbePointArg *ppSquash; public: /** Construct a DefaultCommit with the given parameters. */ diff --git a/src/cpu/o3/commit_impl.hh b/src/cpu/o3/commit_impl.hh index 5323e1413..c6c6ea723 100644 --- a/src/cpu/o3/commit_impl.hh +++ b/src/cpu/o3/commit_impl.hh @@ -173,6 +173,7 @@ DefaultCommit::regProbePoints() { ppCommit = new ProbePointArg(cpu->getProbeManager(), "Commit"); ppCommitStall = new ProbePointArg(cpu->getProbeManager(), "CommitStall"); + ppSquash = new ProbePointArg(cpu->getProbeManager(), "Squash"); } template @@ -1010,6 +1011,8 @@ DefaultCommit::commitInsts() rob->retireHead(commit_thread); ++commitSquashedInsts; + // Notify potential listeners that this instruction is squashed + ppSquash->notify(head_inst); // Record that the number of ROB entries has changed. changedROBNumEntries[tid] = true; diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc index 665654f68..694762167 100644 --- a/src/cpu/o3/cpu.cc +++ b/src/cpu/o3/cpu.cc @@ -416,6 +416,7 @@ FullO3CPU::regProbePoints() ppDataAccessComplete = new ProbePointArg >(getProbeManager(), "DataAccessComplete"); fetch.regProbePoints(); + rename.regProbePoints(); iew.regProbePoints(); commit.regProbePoints(); } diff --git a/src/cpu/o3/fetch.hh b/src/cpu/o3/fetch.hh index 536568bc2..672fb499b 100644 --- a/src/cpu/o3/fetch.hh +++ b/src/cpu/o3/fetch.hh @@ -197,6 +197,8 @@ class DefaultFetch /** Probe points. */ ProbePointArg *ppFetch; + /** To probe when a fetch request is successfully sent. */ + ProbePointArg *ppFetchRequestSent; public: /** DefaultFetch constructor. */ diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh index cb123afd2..4b1479bcb 100644 --- a/src/cpu/o3/fetch_impl.hh +++ b/src/cpu/o3/fetch_impl.hh @@ -171,6 +171,9 @@ void DefaultFetch::regProbePoints() { ppFetch = new ProbePointArg(cpu->getProbeManager(), "Fetch"); + ppFetchRequestSent = new ProbePointArg(cpu->getProbeManager(), + "FetchRequest"); + } template @@ -695,6 +698,9 @@ DefaultFetch::finishTranslation(const Fault &fault, RequestPtr mem_req) "response.\n", tid); lastIcacheStall[tid] = curTick(); fetchStatus[tid] = IcacheWaitResponse; + // Notify Fetch Request probe when a packet containing a fetch + // request is successfully sent + ppFetchRequestSent->notify(mem_req); } } else { // Don't send an instruction to decode if we can't handle it. @@ -1422,6 +1428,9 @@ DefaultFetch::recvReqRetry() if (cpu->getInstPort().sendTimingReq(retryPkt)) { fetchStatus[retryTid] = IcacheWaitResponse; + // Notify Fetch Request probe when a retryPkt is successfully sent. + // Note that notify must be called before retryPkt is set to NULL. + ppFetchRequestSent->notify(retryPkt->req); retryPkt = NULL; retryTid = InvalidThreadID; cacheBlocked = false; diff --git a/src/cpu/o3/iew.hh b/src/cpu/o3/iew.hh index 957a085ae..de8834005 100644 --- a/src/cpu/o3/iew.hh +++ b/src/cpu/o3/iew.hh @@ -126,6 +126,10 @@ class DefaultIEW /** Probe points. */ ProbePointArg *ppMispredict; ProbePointArg *ppDispatch; + /** To probe when instruction execution begins. */ + ProbePointArg *ppExecute; + /** To probe when instruction execution is complete. */ + ProbePointArg *ppToCommit; public: /** Constructs a DefaultIEW with the given parameters. */ diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh index ae76aa9e1..e02429b14 100644 --- a/src/cpu/o3/iew_impl.hh +++ b/src/cpu/o3/iew_impl.hh @@ -125,6 +125,18 @@ DefaultIEW::regProbePoints() { ppDispatch = new ProbePointArg(cpu->getProbeManager(), "Dispatch"); ppMispredict = new ProbePointArg(cpu->getProbeManager(), "Mispredict"); + /** + * Probe point with dynamic instruction as the argument used to probe when + * an instruction starts to execute. + */ + ppExecute = new ProbePointArg(cpu->getProbeManager(), + "Execute"); + /** + * Probe point with dynamic instruction as the argument used to probe when + * an instruction execution completes and it is marked ready to commit. + */ + ppToCommit = new ProbePointArg(cpu->getProbeManager(), + "ToCommit"); } template @@ -1190,6 +1202,10 @@ DefaultIEW::executeInsts() DPRINTF(IEW, "Execute: Processing PC %s, [tid:%i] [sn:%i].\n", inst->pcState(), inst->threadNumber,inst->seqNum); + // Notify potential listeners that this instruction has started + // executing + ppExecute->notify(inst); + // Check if the instruction is squashed; if so then skip it if (inst->isSquashed()) { DPRINTF(IEW, "Execute: Instruction was squashed. PC: %s, [tid:%i]" @@ -1402,6 +1418,9 @@ DefaultIEW::writebackInsts() inst->seqNum, inst->pcState()); iewInstsToCommit[tid]++; + // Notify potential listeners that execution is complete for this + // instruction. + ppToCommit->notify(inst); // Some instructions will be sent to commit without having // executed because they need commit to handle them. diff --git a/src/cpu/o3/rename.hh b/src/cpu/o3/rename.hh index a543cefb8..f8becc114 100644 --- a/src/cpu/o3/rename.hh +++ b/src/cpu/o3/rename.hh @@ -45,10 +45,12 @@ #define __CPU_O3_RENAME_HH__ #include +#include #include "base/statistics.hh" #include "config/the_isa.hh" #include "cpu/timebuf.hh" +#include "sim/probe/probe.hh" struct DerivO3CPUParams; @@ -119,6 +121,16 @@ class DefaultRename /** Per-thread status. */ ThreadStatus renameStatus[Impl::MaxThreads]; + /** Probe points. */ + typedef typename std::pair SeqNumRegPair; + /** To probe when register renaming for an instruction is complete */ + ProbePointArg *ppRename; + /** + * To probe when an instruction is squashed and the register mapping + * for it needs to be undone + */ + ProbePointArg *ppSquashInRename; + public: /** DefaultRename constructor. */ DefaultRename(O3CPU *_cpu, DerivO3CPUParams *params); @@ -129,6 +141,9 @@ class DefaultRename /** Registers statistics. */ void regStats(); + /** Registers probes. */ + void regProbePoints(); + /** Sets the main backwards communication time buffer pointer. */ void setTimeBuffer(TimeBuffer *tb_ptr); diff --git a/src/cpu/o3/rename_impl.hh b/src/cpu/o3/rename_impl.hh index 43b7ba9aa..b19b3414c 100644 --- a/src/cpu/o3/rename_impl.hh +++ b/src/cpu/o3/rename_impl.hh @@ -184,6 +184,15 @@ DefaultRename::regStats() .prereq(fpRenameLookups); } +template +void +DefaultRename::regProbePoints() +{ + ppRename = new ProbePointArg(cpu->getProbeManager(), "Rename"); + ppSquashInRename = new ProbePointArg(cpu->getProbeManager(), + "SquashInRename"); +} + template void DefaultRename::setTimeBuffer(TimeBuffer *tb_ptr) @@ -697,7 +706,9 @@ DefaultRename::renameInsts(ThreadID tid) storesInProgress[tid]++; } ++renamed_insts; - + // Notify potential listeners that source and destination registers for + // this instruction have been renamed. + ppRename->notify(inst); // Put instruction in rename queue. toIEW->insts[toIEWIndex] = inst; @@ -929,6 +940,12 @@ DefaultRename::doSquash(const InstSeqNum &squashed_seq_num, ThreadID tid) freeList->addReg(hb_it->newPhysReg); } + // Notify potential listeners that the register mapping needs to be + // removed because the instruction it was mapped to got squashed. Note + // that this is done before hb_it is incremented. + ppSquashInRename->notify(std::make_pair(hb_it->instSeqNum, + hb_it->newPhysReg)); + historyBuffer[tid].erase(hb_it++); ++renameUndoneMaps;