mem-cache: Use block iteration in BaseSetAssoc
Use block iteration instead of numSets and assoc in print(), cleanupRefs() and computeStats(). This makes these functions rely solely on what they are used for: printing and calculating stats of blocks. With the addition of Sectors an extra indirection level is added, and thus these functions would be skipping blocks. Change-Id: I0006f82736cce02ba3e501ffafe9236f748daf32 Reviewed-on: https://gem5-review.googlesource.com/10143 Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
This commit is contained in:
committed by
Daniel Carvalho
parent
ee2ffdc0fd
commit
685cf2d1f8
32
src/mem/cache/tags/base_set_assoc.cc
vendored
32
src/mem/cache/tags/base_set_assoc.cc
vendored
@@ -124,14 +124,10 @@ BaseSetAssoc::findBlockBySetAndWay(int set, int way) const
|
||||
std::string
|
||||
BaseSetAssoc::print() const {
|
||||
std::string cache_state;
|
||||
for (unsigned i = 0; i < numSets; ++i) {
|
||||
// link in the data blocks
|
||||
for (unsigned j = 0; j < assoc; ++j) {
|
||||
BlkType *blk = sets[i].blks[j];
|
||||
if (blk->isValid())
|
||||
cache_state += csprintf("\tset: %d block: %d %s\n", i, j,
|
||||
blk->print());
|
||||
}
|
||||
for (const CacheBlk& blk : blks) {
|
||||
if (blk.isValid())
|
||||
cache_state += csprintf("\tset: %d way: %d %s\n", blk.set,
|
||||
blk.way, blk.print());
|
||||
}
|
||||
if (cache_state.empty())
|
||||
cache_state = "no valid tags\n";
|
||||
@@ -141,9 +137,9 @@ BaseSetAssoc::print() const {
|
||||
void
|
||||
BaseSetAssoc::cleanupRefs()
|
||||
{
|
||||
for (unsigned i = 0; i < numSets*assoc; ++i) {
|
||||
if (blks[i].isValid()) {
|
||||
totalRefs += blks[i].refCount;
|
||||
for (const CacheBlk& blk : blks) {
|
||||
if (blk.isValid()) {
|
||||
totalRefs += blk.refCount;
|
||||
++sampledRefs;
|
||||
}
|
||||
}
|
||||
@@ -159,12 +155,12 @@ BaseSetAssoc::computeStats()
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < numSets * assoc; ++i) {
|
||||
if (blks[i].isValid()) {
|
||||
assert(blks[i].task_id < ContextSwitchTaskId::NumTaskId);
|
||||
occupanciesTaskId[blks[i].task_id]++;
|
||||
assert(blks[i].tickInserted <= curTick());
|
||||
Tick age = curTick() - blks[i].tickInserted;
|
||||
for (const CacheBlk& blk : blks) {
|
||||
if (blk.isValid()) {
|
||||
assert(blk.task_id < ContextSwitchTaskId::NumTaskId);
|
||||
occupanciesTaskId[blk.task_id]++;
|
||||
assert(blk.tickInserted <= curTick());
|
||||
Tick age = curTick() - blk.tickInserted;
|
||||
|
||||
int age_index;
|
||||
if (age / SimClock::Int::us < 10) { // <10us
|
||||
@@ -178,7 +174,7 @@ BaseSetAssoc::computeStats()
|
||||
} else
|
||||
age_index = 4; // >10ms
|
||||
|
||||
ageTaskId[blks[i].task_id][age_index]++;
|
||||
ageTaskId[blk.task_id][age_index]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
4
src/mem/cache/tags/base_set_assoc.hh
vendored
4
src/mem/cache/tags/base_set_assoc.hh
vendored
@@ -304,8 +304,8 @@ class BaseSetAssoc : public BaseTags
|
||||
* \param visitor Visitor to call on each block.
|
||||
*/
|
||||
void forEachBlk(CacheBlkVisitor &visitor) override {
|
||||
for (unsigned i = 0; i < numSets * assoc; ++i) {
|
||||
if (!visitor(blks[i]))
|
||||
for (CacheBlk& blk : blks) {
|
||||
if (!visitor(blk))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user