最近在gem5上添加自己的预取算法,因为gem5的版本更新,因此网上的代码,大多都难以直接使用,通过借鉴大佬的文章和对gem5中带有的硬件预取算法的模仿,成功添加了一个自定义算法。
以下是在gem5上添加自定义预取算法的步骤:
(1)在路径gem5/src/mem/cache/prefetch/下,添加自己的预取算法:主要是simple.hh和simple.cc文件。
simple.hh文件代码如下:
#ifndef __MEM_CACHE_PREFETCH_SIMPLE_HH__
#define __MEM_CACHE_PREFETCH_SIMPLE_HH__
#include "mem/cache/prefetch/queued.hh"
#include "mem/packet.hh"
namespace gem5
{
struct SimplePrefetcherParams;
GEM5_DEPRECATED_NAMESPACE(Prefetcher, prefetch);
namespace prefetch
{
class Simple : public Queued
{
public:
Simple(const SimplePrefetcherParams &p);
~Simple() = default;
void calculatePrefetch(const PrefetchInfo &pfi,
std::vector<AddrPriority> &addresses) override;
};
} // namespace prefetch
} // namespace gem5
#endif // __SIMPLE_PREFETCHER_HH__
simple.cc文件代码如下:
#include "mem/cache/prefetch/simple.hh"
#include "params/SimplePrefetcher.hh"
namespace gem5
{
GEM5_DEPRECATED_NAMESPACE(Prefetcher, prefetch);
namespace prefetch
{
Simple::Simple(const SimplePrefetcherParams &p)
: Queued(p)
{
}
void
Simple::calculatePrefetch(const PrefetchInfo &pfi,
std::vector<AddrPriority> &addresses)
{
// 获取当前访问的地址
Addr current_addr = blockAddress(pfi.getAddr());
// 计算预取地址,并将它们添加到addresses向量中
for (int i = 1; i <= 3; i++) {
Addr prefetch_addr = current_addr + i*64;
addresses.emplace_back(AddrPriority(prefetch_addr, 0));
}
}
} // namespace prefetch
} // namespace gem5
(3)在路径gem5/src/mem/cache/prefetch/下的Prefetcher.py中配置:
class SimplePrefetcher(QueuedPrefetcher):
type = 'SimplePrefetcher'
cxx_class = 'gem5::prefetch::Simple'
cxx_header = "mem/cache/prefetch/simple.hh"
(4)在路径gem5/src/mem/cache/prefetch/下的Sconscript中配置:
SimObject('Prefetcher.py', sim_objects=[
'BasePrefetcher', 'MultiPrefetcher', 'QueuedPrefetcher',
'StridePrefetcherHashedSetAssociative', 'StridePrefetcher',
'Tagged1Prefetcher', 'IndirectMemoryPrefetcher', 'SignaturePathPrefetcher',
'SignaturePathPrefetcherV2', 'AccessMapPatternMatching', 'AMPMPrefetcher',
'DeltaCorrelatingPredictionTables', 'DCPTPrefetcher',
'IrregularStreamBufferPrefetcher', 'SlimAMPMPrefetcher',
'BOPPrefetcher', 'SBOOEPrefetcher', 'STeMSPrefetcher', 'PIFPrefetcher', 'MyprefetctPrefetcher', 'SimplePrefetcher'])
# 其中添加了'SimplePrefetcher'
# 并且在下边添加代码:
Source('simple.cc')
然后重新编译gem5即可,感谢大佬的文章:
https://blog.csdn.net/qqq_11101/article/details/73436699