changeset fc10e1f9f124 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=fc10e1f9f124
description:
mem: per-thread cache occupancy and per-block ages
This patch enables tracking of cache occupancy per thread along with
ages (in buckets) per cache blocks. Cache occupancy stats are
recalculated on each stat dump.
diffstat:
src/arch/arm/table_walker.cc | 2 ++
src/arch/arm/tlb.cc | 3 +++
src/cpu/base_dyn_inst.hh | 4 ++++
src/cpu/o3/fetch_impl.hh | 2 ++
src/cpu/simple/atomic.cc | 3 +++
src/cpu/simple/timing.cc | 5 +++++
src/dev/dma_device.cc | 1 +
src/mem/cache/blk.hh | 12 ++++++++++--
src/mem/cache/cache_impl.hh | 6 ++++++
src/mem/cache/prefetch/base.cc | 1 +
src/mem/cache/tags/base.cc | 23 +++++++++++++++++++++++
src/mem/cache/tags/base.hh | 22 ++++++++++++++++++++++
src/mem/cache/tags/lru.cc | 40 ++++++++++++++++++++++++++++++++++++++++
src/mem/cache/tags/lru.hh | 5 +++++
src/mem/request.hh | 23 ++++++++++++++++++++++-
15 files changed, 149 insertions(+), 3 deletions(-)
diffs (truncated from 447 to 300 lines):
diff -r 91faf6649de0 -r fc10e1f9f124 src/arch/arm/table_walker.cc
--- a/src/arch/arm/table_walker.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/arch/arm/table_walker.cc Fri Jan 24 15:29:30 2014 -0600
@@ -308,6 +308,7 @@
f = currState->fault;
} else {
RequestPtr req = new Request(l1desc_addr, sizeof(uint32_t), flag,
masterId);
+ req->taskId(ContextSwitchTaskId::DMA);
PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
pkt->dataStatic((uint8_t*)&currState->l1Desc.data);
port.sendFunctional(pkt);
@@ -653,6 +654,7 @@
} else {
RequestPtr req = new Request(l2desc_addr, sizeof(uint32_t), 0,
masterId);
+ req->taskId(ContextSwitchTaskId::DMA);
PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
pkt->dataStatic((uint8_t*)&currState->l2Desc.data);
port.sendFunctional(pkt);
diff -r 91faf6649de0 -r fc10e1f9f124 src/arch/arm/tlb.cc
--- a/src/arch/arm/tlb.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/arch/arm/tlb.cc Fri Jan 24 15:29:30 2014 -0600
@@ -54,6 +54,7 @@
#include "base/inifile.hh"
#include "base/str.hh"
#include "base/trace.hh"
+#include "cpu/base.hh"
#include "cpu/thread_context.hh"
#include "debug/Checkpoint.hh"
#include "debug/TLB.hh"
@@ -477,6 +478,8 @@
if (is_priv)
req->setFlags(Request::PRIVILEGED);
+ req->taskId(tc->getCpuPtr()->taskId());
+
DPRINTF(TLBVerbose, "CPSR is priv:%d UserMode:%d\n",
isPriv, flags & UserMode);
// If this is a clrex instruction, provide a PA of 0 with no fault
diff -r 91faf6649de0 -r fc10e1f9f124 src/cpu/base_dyn_inst.hh
--- a/src/cpu/base_dyn_inst.hh Fri Jan 24 15:29:30 2014 -0600
+++ b/src/cpu/base_dyn_inst.hh Fri Jan 24 15:29:30 2014 -0600
@@ -890,6 +890,8 @@
req = new Request(asid, addr, size, flags, masterId(),
this->pc.instAddr(),
thread->contextId(), threadNumber);
+ req->taskId(cpu->taskId());
+
// Only split the request if the ISA supports unaligned accesses.
if (TheISA::HasUnalignedMemAcc) {
splitRequest(req, sreqLow, sreqHigh);
@@ -953,6 +955,8 @@
req = new Request(asid, addr, size, flags, masterId(),
this->pc.instAddr(),
thread->contextId(), threadNumber);
+ req->taskId(cpu->taskId());
+
// Only split the request if the ISA supports unaligned accesses.
if (TheISA::HasUnalignedMemAcc) {
splitRequest(req, sreqLow, sreqHigh);
diff -r 91faf6649de0 -r fc10e1f9f124 src/cpu/o3/fetch_impl.hh
--- a/src/cpu/o3/fetch_impl.hh Fri Jan 24 15:29:30 2014 -0600
+++ b/src/cpu/o3/fetch_impl.hh Fri Jan 24 15:29:30 2014 -0600
@@ -604,6 +604,8 @@
Request::INST_FETCH, cpu->instMasterId(), pc,
cpu->thread[tid]->contextId(), tid);
+ mem_req->taskId(cpu->taskId());
+
memReq[tid] = mem_req;
// Initiate translation of the icache block
diff -r 91faf6649de0 -r fc10e1f9f124 src/cpu/simple/atomic.cc
--- a/src/cpu/simple/atomic.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/cpu/simple/atomic.cc Fri Jan 24 15:29:30 2014 -0600
@@ -301,6 +301,7 @@
dcache_latency = 0;
+ req->taskId(taskId());
while (1) {
req->setVirt(0, addr, size, flags, dataMasterId(),
thread->pcState().instAddr());
@@ -387,6 +388,7 @@
dcache_latency = 0;
+ req->taskId(taskId());
while(1) {
req->setVirt(0, addr, size, flags, dataMasterId(),
thread->pcState().instAddr());
@@ -492,6 +494,7 @@
bool needToFetch = !isRomMicroPC(pcState.microPC()) &&
!curMacroStaticInst;
if (needToFetch) {
+ ifetch_req.taskId(taskId());
setupFetchRequest(&ifetch_req);
fault = thread->itb->translateAtomic(&ifetch_req, tc,
BaseTLB::Execute);
diff -r 91faf6649de0 -r fc10e1f9f124 src/cpu/simple/timing.cc
--- a/src/cpu/simple/timing.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/cpu/simple/timing.cc Fri Jan 24 15:29:30 2014 -0600
@@ -415,6 +415,8 @@
RequestPtr req = new Request(asid, addr, size,
flags, dataMasterId(), pc, _cpuId, tid);
+ req->taskId(taskId());
+
Addr split_addr = roundDown(addr + size - 1, block_size);
assert(split_addr <= addr || split_addr - addr < block_size);
@@ -484,6 +486,8 @@
RequestPtr req = new Request(asid, addr, size,
flags, dataMasterId(), pc, _cpuId, tid);
+ req->taskId(taskId());
+
Addr split_addr = roundDown(addr + size - 1, block_size);
assert(split_addr <= addr || split_addr - addr < block_size);
@@ -561,6 +565,7 @@
if (needToFetch) {
_status = BaseSimpleCPU::Running;
Request *ifetch_req = new Request();
+ ifetch_req->taskId(taskId());
ifetch_req->setThreadContext(_cpuId, /* thread ID */ 0);
setupFetchRequest(ifetch_req);
DPRINTF(SimpleCPU, "Translating address %#x\n",
ifetch_req->getVaddr());
diff -r 91faf6649de0 -r fc10e1f9f124 src/dev/dma_device.cc
--- a/src/dev/dma_device.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/dev/dma_device.cc Fri Jan 24 15:29:30 2014 -0600
@@ -166,6 +166,7 @@
for (ChunkGenerator gen(addr, size, sys->cacheLineSize());
!gen.done(); gen.next()) {
Request *req = new Request(gen.addr(), gen.size(), flag, masterId);
+ req->taskId(ContextSwitchTaskId::DMA);
PacketPtr pkt = new Packet(req, cmd);
// Increment the data pointer on a write
diff -r 91faf6649de0 -r fc10e1f9f124 src/mem/cache/blk.hh
--- a/src/mem/cache/blk.hh Fri Jan 24 15:29:30 2014 -0600
+++ b/src/mem/cache/blk.hh Fri Jan 24 15:29:30 2014 -0600
@@ -80,6 +80,9 @@
class CacheBlk
{
public:
+ /** Task Id associated with this block */
+ uint32_t task_id;
+
/** The address space ID of this block. */
int asid;
/** Data block tag value. */
@@ -119,6 +122,8 @@
/** holds the source requestor ID for this block. */
int srcMasterId;
+ Tick tickInserted;
+
protected:
/**
* Represents that the indicated thread context has a "lock" on
@@ -162,9 +167,11 @@
public:
CacheBlk()
- : asid(-1), tag(0), data(0) ,size(0), status(0), whenReady(0),
+ : task_id(ContextSwitchTaskId::Unknown),
+ asid(-1), tag(0), data(0) ,size(0), status(0), whenReady(0),
set(-1), isTouched(false), refCount(0),
- srcMasterId(Request::invldMasterId)
+ srcMasterId(Request::invldMasterId),
+ tickInserted(0)
{}
/**
@@ -182,6 +189,7 @@
whenReady = rhs.whenReady;
set = rhs.set;
refCount = rhs.refCount;
+ task_id = rhs.task_id;
return *this;
}
diff -r 91faf6649de0 -r fc10e1f9f124 src/mem/cache/cache_impl.hh
--- a/src/mem/cache/cache_impl.hh Fri Jan 24 15:29:30 2014 -0600
+++ b/src/mem/cache/cache_impl.hh Fri Jan 24 15:29:30 2014 -0600
@@ -1074,6 +1074,11 @@
Request *writebackReq =
new Request(tags->regenerateBlkAddr(blk->tag, blk->set), blkSize, 0,
Request::wbMasterId);
+
+ writebackReq->taskId(blk->task_id);
+ blk->task_id= ContextSwitchTaskId::Unknown;
+ blk->tickInserted = curTick();
+
PacketPtr writeback = new Packet(writebackReq, MemCmd::Writeback);
if (blk->isWritable()) {
writeback->setSupplyExclusive();
@@ -1120,6 +1125,7 @@
Request request(tags->regenerateBlkAddr(blk.tag, blk.set),
blkSize, 0, Request::funcMasterId);
+ request.taskId(blk.task_id);
Packet packet(&request, MemCmd::WriteReq);
packet.dataStatic(blk.data);
diff -r 91faf6649de0 -r fc10e1f9f124 src/mem/cache/prefetch/base.cc
--- a/src/mem/cache/prefetch/base.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/mem/cache/prefetch/base.cc Fri Jan 24 15:29:30 2014 -0600
@@ -247,6 +247,7 @@
// create a prefetch memreq
Request *prefetchReq = new Request(*addrIter, blkSize, 0,
masterId);
+ prefetchReq->taskId(ContextSwitchTaskId::Prefetcher);
PacketPtr prefetch =
new Packet(prefetchReq, MemCmd::HardPFReq);
prefetch->allocate();
diff -r 91faf6649de0 -r fc10e1f9f124 src/mem/cache/tags/base.cc
--- a/src/mem/cache/tags/base.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/mem/cache/tags/base.cc Fri Jan 24 15:29:30 2014 -0600
@@ -125,5 +125,28 @@
avgOccs = occupancies / Stats::constant(numBlocks);
+ occupanciesTaskId
+ .init(ContextSwitchTaskId::NumTaskId)
+ .name(name() + ".occ_task_id_blocks")
+ .desc("Occupied blocks per task id")
+ .flags(nozero | nonan)
+ ;
+
+ ageTaskId
+ .init(ContextSwitchTaskId::NumTaskId, 5)
+ .name(name() + ".age_task_id_blocks")
+ .desc("Occupied blocks per task id")
+ .flags(nozero | nonan)
+ ;
+
+ percentOccsTaskId
+ .name(name() + ".occ_task_id_percent")
+ .desc("Percentage of cache occupancy per task id")
+ .flags(nozero)
+ ;
+
+ percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks);
+
+ registerDumpCallback(new BaseTagsDumpCallback(this));
registerExitCallback(new BaseTagsCallback(this));
}
diff -r 91faf6649de0 -r fc10e1f9f124 src/mem/cache/tags/base.hh
--- a/src/mem/cache/tags/base.hh Fri Jan 24 15:29:30 2014 -0600
+++ b/src/mem/cache/tags/base.hh Fri Jan 24 15:29:30 2014 -0600
@@ -121,6 +121,15 @@
/** Average occ % of each requestor using the cache */
Stats::Formula avgOccs;
+ /** Occupancy of each context/cpu using the cache */
+ Stats::Vector occupanciesTaskId;
+
+ /** Occupancy of each context/cpu using the cache */
+ Stats::Vector2d ageTaskId;
+
+ /** Occ % of each context/cpu using the cache */
+ Stats::Formula percentOccsTaskId;
+
/**
* @}
*/
@@ -152,6 +161,11 @@
virtual void cleanupRefs() {}
/**
+ * Computes stats just prior to dump event
+ */
+ virtual void computeStats() {}
+
+ /**
*iterated through all blocks and clear all locks
*Needed to clear all lock tracking at once
*/
@@ -171,4 +185,12 @@
virtual void process() { tags->cleanupRefs(); };
};
+class BaseTagsDumpCallback : public Callback
+{
+ BaseTags *tags;
+ public:
+ BaseTagsDumpCallback(BaseTags *t) : tags(t) {}
+ virtual void process() { tags->computeStats(); };
+};
+
#endif //__BASE_TAGS_HH__
diff -r 91faf6649de0 -r fc10e1f9f124 src/mem/cache/tags/lru.cc
--- a/src/mem/cache/tags/lru.cc Fri Jan 24 15:29:30 2014 -0600
+++ b/src/mem/cache/tags/lru.cc Fri Jan 24 15:29:30 2014 -0600
@@ -176,6 +176,7 @@
{
Addr addr = pkt->getAddr();
MasterID master_id = pkt->req->masterId();
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev