最近在gem5上做预取实验,添加自己的预取算法,这里采用hardware stream prefetcher , 修改了几个bug才给实验调试通过,发文记录下实验过程。
gem5上添加自己的预取算法步骤:
(1)路径gem5-master/configs/common/Caches.py下,开启预取:
class L1Cache(Cache):
assoc = 2
tag_latency = 2
data_latency = 2
response_latency = 2
mshrs = 4
tgts_per_mshr = 20
prefetcher = StridePrefetcher(degree=8, latency=1.0) #添加此行代码
# prefetch_policy='tagged' #若是老版本, 添加此行代码
class L2Cache(Cache):
assoc = 8
tag_latency = 20
data_latency = 20
response_latency = 20
mshrs = 20
tgts_per_mshr = 12
write_buffers = 8
prefetcher = StridePrefetcher(degree=8, latency=1.0) #添加此行代码
# prefetch_policy='tagged' #若是老版本, 添加此行代码
(2)在路径gem5-master/src/mem/cache/prefetch/下,添加自己的预取算法:主要是stream.hh和stream.cc文件。
(3)在路径gem5-master/src/mem/cache/prefetch/下的Prefetcher.py中配置:
class StreamPrefetcher(QueuedPrefetcher):
type = 'StreamPrefetcher'
cxx_class = 'StreamPrefetcher'
cxx_header = "mem/cache/prefetch/stream.hh"
table_sets = Param.Int(16, "Number of sets in PC lookup table")
table_assoc = Param.Int(4, "Associativity of PC lookup table")
tableSize = Param.Int(8, "Number of sets in PC lookup table")
distance = Param.Int(5, "Associativity of PC lookup table")
use_master_id = Param.Bool(True, "Use master id based history")
degree = Param.Int(4, "Number of prefetches to generate")
(4)在路径gem5-master/src/mem/cache/prefetch/下的Sconscript中配置:
Import('*')
SimObject('Prefetcher.py')
Source('base.cc')
Source('queued.cc')
Source('stride.cc')
Source('tagged.cc')
Source('stream.cc') #添加此行代码
注意:在这里若没有配置,在编译的时候会报错:
> build/X86/python/_m5/param_StreamPrefetcher_wrap.o: In function > `_wrap_StreamPrefetcherParams_create': > /home/jyf/download/gem_nvmain/gem5-master/build/X86/python/_m5/param_StreamPrefetcher_wrap.cc:4549: > undefined reference to `StreamPrefetcherParams::create()' collect2: > error: ld returned 1 exit status scons: *** [build/X86/gem5.opt] Error > 1 scons: building terminated because of errors.
原因是由于缺少以上配置,stream.cc没有生成stream.o文件,文件无法连接。
在编译的过程中会生成stream.o , sreamPrefetcher.hh(gem5-master/build/ARM/params/下),
param_StreamPrefetcher_wrap.cc(build/ARM/python/_m5/下)。这些文件里面都有StreamPrefetcher * create()相关联。
(5)由于我找的hardware stream预取算法比较老,版本不匹配,这里还需要修改 stream.cc ,stream.hh源码,:
stream.cc 中:
Addr 改为 AddrPriority
StreamPrefetcher::calculatePrefetch(const PacketPtr &pkt,
std::vector<AddrPriority> &addresses) {
uint32_t core_id = pkt->req->hasContextId() ? pkt->req->contextId() : -1;
//uint32_t core_id = pkt->req->contextId();
//if (core_id < 0) {
if (!pkt->req->contextId()) {
DPRINTF(HWPrefetch, "ignoring request with no core ID");
return;
}
.......
for