mem: Handful extra features for BasePrefetcher
Some common functionality added to the base prefetcher, mainly dealing with extracting the block address, page address, block index inside the page and some other information that can be inferred from the block address. This is used for some prefetching algorithms, and having the methods in the base, as well as the block size and other information is the sensible way.
This commit is contained in:
parent
df5a811833
commit
dad7d9277b
2 changed files with 47 additions and 2 deletions
35
src/mem/cache/prefetch/base.cc
vendored
35
src/mem/cache/prefetch/base.cc
vendored
|
@ -48,13 +48,14 @@
|
|||
|
||||
#include <list>
|
||||
|
||||
#include "base/intmath.hh"
|
||||
#include "mem/cache/prefetch/base.hh"
|
||||
#include "mem/cache/base.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
BasePrefetcher::BasePrefetcher(const BasePrefetcherParams *p)
|
||||
: ClockedObject(p), cache(nullptr), blkSize(0), system(p->sys),
|
||||
onMiss(p->on_miss), onRead(p->on_read),
|
||||
: ClockedObject(p), cache(nullptr), blkSize(0), lBlkSize(0),
|
||||
system(p->sys), onMiss(p->on_miss), onRead(p->on_read),
|
||||
onWrite(p->on_write), onData(p->on_data), onInst(p->on_inst),
|
||||
masterId(system->getMasterId(name())),
|
||||
pageBytes(system->getPageBytes())
|
||||
|
@ -67,6 +68,7 @@ BasePrefetcher::setCache(BaseCache *_cache)
|
|||
assert(!cache);
|
||||
cache = _cache;
|
||||
blkSize = cache->getBlockSize();
|
||||
lBlkSize = floorLog2(blkSize);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -76,6 +78,7 @@ BasePrefetcher::regStats()
|
|||
.name(name() + ".num_hwpf_issued")
|
||||
.desc("number of hwpf issued")
|
||||
;
|
||||
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -127,4 +130,32 @@ BasePrefetcher::samePage(Addr a, Addr b) const
|
|||
return roundDown(a, pageBytes) == roundDown(b, pageBytes);
|
||||
}
|
||||
|
||||
Addr
|
||||
BasePrefetcher::blockAddress(Addr a) const
|
||||
{
|
||||
return a & ~(blkSize-1);
|
||||
}
|
||||
|
||||
Addr
|
||||
BasePrefetcher::blockIndex(Addr a) const
|
||||
{
|
||||
return a >> lBlkSize;
|
||||
}
|
||||
|
||||
Addr
|
||||
BasePrefetcher::pageAddress(Addr a) const
|
||||
{
|
||||
return roundDown(a, pageBytes);
|
||||
}
|
||||
|
||||
Addr
|
||||
BasePrefetcher::pageOffset(Addr a) const
|
||||
{
|
||||
return a & (pageBytes - 1);
|
||||
}
|
||||
|
||||
Addr
|
||||
BasePrefetcher::pageIthBlockAddress(Addr page, uint32_t blockIndex) const
|
||||
{
|
||||
return page + (blockIndex << lBlkSize);
|
||||
}
|
||||
|
|
14
src/mem/cache/prefetch/base.hh
vendored
14
src/mem/cache/prefetch/base.hh
vendored
|
@ -68,6 +68,9 @@ class BasePrefetcher : public ClockedObject
|
|||
/** The block size of the parent cache. */
|
||||
unsigned blkSize;
|
||||
|
||||
/** log_2(block size of the parent cache). */
|
||||
unsigned lBlkSize;
|
||||
|
||||
/** System we belong to */
|
||||
System* system;
|
||||
|
||||
|
@ -102,6 +105,17 @@ class BasePrefetcher : public ClockedObject
|
|||
|
||||
/** Determine if addresses are on the same page */
|
||||
bool samePage(Addr a, Addr b) const;
|
||||
/** Determine the address of the block in which a lays */
|
||||
Addr blockAddress(Addr a) const;
|
||||
/** Determine the address of a at block granularity */
|
||||
Addr blockIndex(Addr a) const;
|
||||
/** Determine the address of the page in which a lays */
|
||||
Addr pageAddress(Addr a) const;
|
||||
/** Determine the page-offset of a */
|
||||
Addr pageOffset(Addr a) const;
|
||||
/** Build the address of the i-th block inside the page */
|
||||
Addr pageIthBlockAddress(Addr page, uint32_t i) const;
|
||||
|
||||
|
||||
Stats::Scalar pfIssued;
|
||||
|
||||
|
|
Loading…
Reference in a new issue