问题: 如何实现缓存set的抽样呢?比如2MB的LLC,cache line 64Byte, 32-way,那么拥有1024个set。现在要抽取其中的32个set,该set独立于LLC,但访问行为与LLC一致,如第0个,第32个,第64个……等,该抽样的set仅仅保留tag即可。那么如何实现呢?
思路:
- 与此部分相关的内容主要集中在gem5/src/mem/cache/目录下的cache_impl.hh和tags目录下的cacheset.hh和lru.cc等文件;
- cache_impl.hh是对缓存访问行为控制的文件,与访问lru的set一样,需要访问我们的sampling set;
- 由于lru.cc访问的cacheset都使用的是cacheset.hh这个模板文件,实际上set的个数及管理也是由lru.cc来控制的,那么这32个set就可以由自定义的mylru.cc来控制;
方法:
1、首先搭建sample set的样子,即该set的管理方法,生成samplelru.hh和samplelru.cc;
cp lru.cc samplelru.cc
cp lru.hh samplelru.hh
2、 为了能访问samplelru,需要修改gem5/src/mem/cache下的BaseCache.py,得到新的tags;
sampletags = Param.BaseTags(SampleLRU(), "Tag Store for SampleLRU caches")
3、在cache_impl.hh中修改初始化函数。
template<class TagStore>
Cache<TagStore>::Cache(const Params *p)
: BaseCache(p),
//tags(dynamic_cast<TagStore*>(p->tags)),
tags(Cache<LRU>(p->tags)), //将tags固定为LRU
sampletags(p->sampletags), // new add
prefetcher(p->prefetcher),
doFastWrites(true),
prefetchOnAccess(p->prefetch_on_access)
// 同时在access函数中增加对samplelru.cc中accessBlock方法的调用
BlkType *sampblk;
sampblk = sampletags->accessBlock(pkt->getAddr(), lat, id);
//由于初始化没有使用dynamic_cast<TagStore*>,那么需要将src/mem/cache/base.cc最后一个函数注释掉
BaseCache *
BaseCacheParams::create()
{
//下面的内容注释掉
/**
unsigned numSets = size / (assoc * system->cacheLineSize());
assert(tags);
if (dynamic_cast<FALRU*>(tags)) {
if (numSets != 1)
fatal("Got FALRU tags with more than one set\n");
return new Cache<FALRU>(this);
} else if (dynamic_cast<LRU*>(tags)) {
if (numSets == 1)
warn("Consider using FALRU tags for a fully associative cache\n");
return new Cache<LRU>(this);
} else {
fatal("No suitable tags selected\n");
}
*/
return NULL;
}
4、修改samplelru.cc和samplelru.hh,将里面的LRU全部替换为SampleLRU;
5、修改SConscript文件,添加:
Source('samplelru.cc')
6、修改Tags.py,添加:
class SampleLRU(BaseTags):
type = 'SampleLRU'
cxx_class = 'SampleLRU'
cxx_header = "mem/cache/tags/samplelru.hh"
assoc = Param.Int(Parent.assoc, "associativity")
part = Param.Int(Parent.part, "partition")
经过上述修改后,编译下scons build/ALPHA/gem5.debug,会有如下错误:
build/ALPHA/mem/cache/cache_impl.hh: In constructor 'Cache<TagStore>::Cache(const Params*)':
build/ALPHA/mem/cache/cache_impl.hh:73:7: error: class 'Cache<TagStore>' does not have any field named 'sampletags'
build/ALPHA/mem/cache/cache_impl.hh: In member function 'bool Cache<TagStore>::access(PacketPtr, Cache<TagStore>::BlkType*&, Cycles&, PacketList&)':
build/ALPHA/mem/cache/cache_impl.hh:333:15: error: 'sampletags' was not declared in this scope
scons: *** [build/ALPHA/mem/cache/cache.do] Error 1
7、修改cache.hh和cache.cc,添加:
//在cache.hh
/** SampleTag and data Storage */
TagStore *sampletags;
//在cache.cc
#include "mem/cache/tags/samplelru.hh"
//注释掉如下两行
//template class Cache<SampleLRU>;
//template class Cache<SampleLRU>;