资料:https://github.com/GT-CHIPS/gem5_chips
说明:该源码为在gem5 garnet2.0的基础上可支持配置chiplet同构和异构互连系统。主要是提供了相关网络拓扑配置脚本文件(实现在configs/topologies中),在使用gem5仿真时可通过设定运行参数--topology来完成配置。
目录
源码配置过程
基于garnet3.0实现
CHIPS_Multicore_MemCtrlChiplet4.py
CHIPS_Multicore_GTRocketN.py
其他问题
1. 将源码下载到本地
git clone https://github.com/GT-CHIPS/gem5_chips.git
或直接在网页上下载后在本地解压缩,得到gem5_chips-master目录
2. 建立gem5.opt
scons build/RISCV_MESI_Two_Level/gem5.opt -j$(nproc)
特别提醒:一定要使用python2的版本进行编译,python3会出现很多错误。
那么就在这里简单记录一下在ubuntu上快速切换python版本的方法
(1)查看当前python版本
python -V
(2)选择更换python的版本(需要sudo)
sudo update-alternatives --config python
然后键入想要使用的python版本(在这里需要选择python2.7版本)
(3)再次查看python版本,确认已成功修改
3. 等待建立完成后可执行仿真命令(配置相应的参数)
以下为资料中给的参考指令(有坑)
./build/RISCV_MESI_Two_Level/gem5.opt configs/example/se.py \
--cpu-type TimingSimpleCPU \
--num-cpus=64 \
--l1d_size=16kB \
--l1i_size=16kB \
--num-l2caches=64 \
--l2_size=128kB \
--num-dirs=4 \
--mem-size=4096MB \
--ruby \
--network=garnet2.0 \
--topology=CHIPS_Multicore_MemCtrlChiplet4 \
-c tests/test-progs/hello/bin/riscv/linux/hello
执行后发现无法运行,错误信息如下:
根据提示查看源码发现需要缺少num_rows参数(默认为0),需要在仿真命令中设定(--mesh-rows)。因此,在仿真命令后添加--mesh-rows=4(数值可能有一定的讲究,但应该不唯一)。
这样可正常运行,同时终端上输出网络连接的信息,包括连线的端设备、延迟和带宽,如下:
正常执行结果如下:
(p.s.这里一定要注意选择与建立gem5的指令集相对应的测试程序,比如在这里使用的是riscv建立的,那么在用-c指定测试程序时要选择riscv文件夹下的可执行程序)
注意:以上过程可以成功配置出CHIPS_Multicore_MemCtrlChiplet4.py,但尝试在源码中配置CHIPS_Multicore_GTRocketN.py则会遇到无法解决的问题,我反复查看源码后怀疑是源码有bug,果然将CHIPS_Multicore_GTRocketN.py配置在新版的gem5中基于garnet3.0(下面会介绍)可以成功仿真。
命令行命令
./build/RISCV_MESI_Two_Level/gem5.opt configs/example/se.py \
--cpu-type=TimingSimpleCPU \
--num-cpus=64 \
--l1d_size=16kB \
--l1i_size=16kB \
--num-l2caches=8 \
--l2_size=128kB \
--num-dirs=4 \
--mem-size=4096MB \
--ruby \
--network=garnet2.0 \
--topology=CHIPS_Multicore_GTRocketN \
-c tests/test-progs/hello/bin/riscv/linux/hello \
--chiplet-link-latency=3
运行错误提示
以上介绍的是源码成功配置过程,但该源码是建立在garnet2.0的基础上,而当前gem5已经支持garnet3.0,改进融合了garnet2.0中的部分结构,并引入了serdes组件,可支持不同带宽组件之间的互连。因此,这里尝试参考该资料中的chiplet互连的配置文件,在gem5 22.0.0.2中基于garnet3.0实现。(先将这3个配置文件复制到文件夹configs/topologies下)
1. 由于该版本的gem5使用的是python3,而源码是在python2环境下写的,因此存在一些语法问题需要修改
(1)模块的引入
原:
(2)xrange修改为range
原:
修改为 :
(3) print需要将打印对象用括号括起来
原:
修改为:
2. 在configs/network/Network.py文件中添加与chiplet相关的参数
3. 修改连线的实例化参数
garnet2.0中的GarnetIntLink和GarnetExtLink包含对象与garnet3.0有所差异,在该源码中涉及到GarnetIntLink.tx_clip和GarnetIntLink.rx_clip,表示的是是否启用CDC组件(跨时钟域),在garnet3.0中对应的为GarnetIntLink.src_cdc和GarnetIntLink.dst_cdc,对应的位置进行修改。
完成以上基础修改后,尝试运行仿真命令(我这里建立的是X86系统的仿真gem5平台)
./build/X86/gem5.opt configs/example/se.py \
--cpu-type TimingSimpleCPU \
--num-cpus=64 \
--l1d_size=16kB \
--l1i_size=16kB \
--num-l2caches=64 \
--l2_size=128kB \
--num-dirs=4 \
--mem-size=4096MB \
--ruby \
--network=garnet \
--topology=CHIPS_Multicore_MemCtrlChiplet4 \
-c tests/test-progs/hello/bin/x86/linux/hello \
--mesh-rows=4
发现无法正常运行,错误如下:
相关源码如下:
可以发现这里只是对cpu和L2控制器对应的路由器设置了宽度为chiplet_link_width=128,而内存控制器对应的路由器为默认的16,因此不匹配。
有2种可选的解决方案:
这里我选择最简单的方法,因为尝试修改serdes会发现遇到更多的问题,后续再来慢慢研究这个serdes的用法。
4. 参照上述描述对路由器的初始化进行修改,运行后上述问题解决,但出现了新的问题
这个问题查看相关源码后(经历较长时间的源码追溯),发现问题出现在原先的连线配置中包含2种类型的带宽参数:chiplet_link_width=128, interposer_link_width=32,因此与上面问题解决思路一样,将两种参数修改为相等即可。
这里可以直接在configs/network/Network.py中将参数--interposer-link-width的默认值修改为128,也可以通过命令行设置该参数的值为128。修改后运行发现可以成功仿真:
同时在m5out文件夹下得到config.ini, config.json系统配置文件, stats.txt仿真结果文件,以及系统ruby配置的结构图,可知该实现的拓扑与原CHIPS_MenCtrlChiplet4一致。
该配置无法在源代码中实现,但通过以上基础修改后可以在新版gem5中基于garnet3.0成功配置,因此应该是源代码中gem5存在一些bug,后续版本已修复。
得到的配置拓扑图如下:
2023.5.17更新
在切换了环境,想要重新scons编译gem5时,很容易遇到找不到Python版本的问题(问题描述为:Error:Can't find a working Python installation),可以尝试将之前的build文件夹删掉后重试。
在我第一次配置时还出现了以下问题,但在我第二次用新的gem5源码配置时没有出现以下情况,我觉得应该和编译gem5.opt使用的指令集和协议有关系。这里也记录一下,如果有遇到相同情况的可以参考。
1. 我发现设置参数--mesh-rows=4之后会出现以下问题,即使在没有设置--topology的情况下(默认为Crossbar)也会出现。
查看相关源码,发现无论设定的拓扑是什么,如果设定了--mesh-rows,都会按照mesh结构进行相关检查,就会出现assert检查不通过,因此可以尝试将这部分的检查注释掉,不会影响正常仿真过程。
注意:修改后需要重新编译gem5.opt