gem5模拟器中实现了一种更细节的内存子系统的模拟模型——Ruby。它建模了inclusive/exclusive cache,包含多种替换策略、一致性协议、互连网络、DMA和内存控制器,以及多种用于初始化内存请求和处理响应的排序器。
一般情况下,我们使用如下命令建立一个X86 gem5模拟器:
scons build/X86/gem5.debug -j$(nproc)
然后使用上述建立的X86 gem5模拟器运行fs.py配置文件,添加--ruby选项,可以运行带ruby内存模型的X86全系统仿真。
build/X86/gem5.debug configs/example/fs.py --kernel=x86-linux-kernel-5.4.49 --disk=x86-ubuntu-18.04-img --ruby --mem-type=DDR3_2133_8x8 -n=2
得到的结果配置文件如下(包含ruby对象):
同时,gem5提供了许多cache一致性协议,例如:CHI、MI、MOESI、MESI、Garnet_standalone等(configs/ruby文件夹下),而在fs.py的配置选项中并没有可以配置该协议的选项,预估是无法在仿真时添加配置选项来配置。那么该如何配置呢?
以下介绍配置CHI协议的过程。
1. 建立包含cache一致性协议的gem5模拟器
查看源码(configs/ruby/Ruby.py),如下:
发现该协议应该在建立gem5模拟器时就声明,添加选项PROTOCOL:
scons build/X86/gem5.debug PROTOCOL=CHI -j$(nproc)
2. 运行仿真
上述包含cache一致性协议的gem5模拟器成功建立后,即可直接使用来运行全系统仿真。
build/X86/gem5.debug configs/example/fs.py --kernel=x86-linux-kernel-5.4.49 --disk=x86-ubuntu-18.04-img --mem-type=DDR3_2133_8x8 -n=2 --ruby
得到的配置文件与之前无协议的配置文件的对比如下(部分):
会添加更多的组件,例如:sequencer、cache控制器等。
在CHI协议的源码中(configs/ruby/CHI.py),我发现针对该协议可以添加自定义的配置文件,但前提是网络拓扑需要配置为CustomMesh。
然后我尝试配置一下,在这里就发现源码由bug,需要修改源码才能正确运行,在此记录一下。
首先运行以下命令
build/X86/gem5.debug configs/example/fs.py --kernel=x86-linux-kernel-5.4.49 --disk=x86-ubuntu-18.04-img --mem-type=DDR3_2133_8x8 -n=2 --ruby --topology=CustomMesh --chi-config=configs/example/noc_config/2x4.py
p.s. --topology配置网络拓扑,选择CustomMesh的话必须添加--chi-config选项来配置网络参数,源码中提供了一个CHI协议配置文件示例configs/example/noc_config/2x4.py
然后发现无法运行,出现错误:
根据提示查看源码( configs/topologies/CustomMesh.py):
函数distributeNodes声明(在同一个文件中)如下:
因此可知,源码中确实是多传入了一个参数options,将其删掉即可:
重新运行仿真,可成功建立ruby网络拓扑为CustomMesh的配置:
其他的一些坑
scons build/NULL/gem5.debug PROTOCOL=Garnet_standalone