在gem5中利用garnet3.0配置chiplet互连系统

资料:https://github.com/GT-CHIPS/gem5_chips

说明:该源码为在gem5 garnet2.0的基础上可支持配置chiplet同构和异构互连系统。主要是提供了相关网络拓扑配置脚本文件(实现在configs/topologies中),在使用gem5仿真时可通过设定运行参数--topology来完成配置。

  • CHIPS_Multicore_MemCtrlChiplet4.py
  • CHIPS_Multicore_GTRocketN.py
  • CHIPS_Multicore_Monolithic.py

在gem5中利用garnet3.0配置chiplet互连系统_第1张图片


目录

源码配置过程

基于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版本)

在gem5中利用garnet3.0配置chiplet互连系统_第2张图片

 (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

执行后发现无法运行,错误信息如下:

在gem5中利用garnet3.0配置chiplet互连系统_第3张图片

 根据提示查看源码发现需要缺少num_rows参数(默认为0),需要在仿真命令中设定(--mesh-rows)。因此,在仿真命令后添加--mesh-rows=4(数值可能有一定的讲究,但应该不唯一)。

这样可正常运行,同时终端上输出网络连接的信息,包括连线的端设备、延迟和带宽,如下:

  • 外部连线(GarnetExtLink):控制器与路由器相连

在gem5中利用garnet3.0配置chiplet互连系统_第4张图片

在gem5中利用garnet3.0配置chiplet互连系统_第5张图片

  •  内部连线(GarnetIntLink):路由器之间互连

在gem5中利用garnet3.0配置chiplet互连系统_第6张图片

 正常执行结果如下:

(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

运行错误提示


基于garnet3.0实现

以上介绍的是源码成功配置过程,但该源码是建立在garnet2.0的基础上,而当前gem5已经支持garnet3.0,改进融合了garnet2.0中的部分结构,并引入了serdes组件,可支持不同带宽组件之间的互连。因此,这里尝试参考该资料中的chiplet互连的配置文件,在gem5 22.0.0.2中基于garnet3.0实现。(先将这3个配置文件复制到文件夹configs/topologies下)

CHIPS_Multicore_MemCtrlChiplet4.py

1. 由于该版本的gem5使用的是python3,而源码是在python2环境下写的,因此存在一些语法问题需要修改

(1)模块的引入

原:

修改为:

 (2)xrange修改为range

原:

修改为 :

(3) print需要将打印对象用括号括起来

原:

在gem5中利用garnet3.0配置chiplet互连系统_第7张图片

修改为:

在gem5中利用garnet3.0配置chiplet互连系统_第8张图片

2. 在configs/network/Network.py文件中添加与chiplet相关的参数

在gem5中利用garnet3.0配置chiplet互连系统_第9张图片

 3. 修改连线的实例化参数

garnet2.0中的GarnetIntLink和GarnetExtLink包含对象与garnet3.0有所差异,在该源码中涉及到GarnetIntLink.tx_clip和GarnetIntLink.rx_clip,表示的是是否启用CDC组件(跨时钟域),在garnet3.0中对应的为GarnetIntLink.src_cdc和GarnetIntLink.dst_cdc,对应的位置进行修改。

在gem5中利用garnet3.0配置chiplet互连系统_第10张图片

完成以上基础修改后,尝试运行仿真命令(我这里建立的是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

发现无法正常运行,错误如下:

相关源码如下:

在gem5中利用garnet3.0配置chiplet互连系统_第11张图片

可以发现这里只是对cpu和L2控制器对应的路由器设置了宽度为chiplet_link_width=128,而内存控制器对应的路由器为默认的16,因此不匹配。

有2种可选的解决方案:

  • (最简单)将内存控制器对应的路由器的宽度也设置为128,可以保证一致性(直接在所有路由器初始化阶段设定宽度)

  • 添加serdes组件(在创建GarnetLink对象时设定相关参数为true)

这里我选择最简单的方法,因为尝试修改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配置chiplet互连系统_第12张图片

CHIPS_Multicore_GTRocketN.py

该配置无法在源代码中实现,但通过以上基础修改后可以在新版gem5中基于garnet3.0成功配置,因此应该是源代码中gem5存在一些bug,后续版本已修复。

得到的配置拓扑图如下:

在gem5中利用garnet3.0配置chiplet互连系统_第13张图片


 其他问题


2023.5.17更新

在切换了环境,想要重新scons编译gem5时,很容易遇到找不到Python版本的问题(问题描述为:Error:Can't find a working Python installation),可以尝试将之前的build文件夹删掉后重试。


在我第一次配置时还出现了以下问题,但在我第二次用新的gem5源码配置时没有出现以下情况,我觉得应该和编译gem5.opt使用的指令集和协议有关系。这里也记录一下,如果有遇到相同情况的可以参考。

1. 我发现设置参数--mesh-rows=4之后会出现以下问题,即使在没有设置--topology的情况下(默认为Crossbar)也会出现。

在gem5中利用garnet3.0配置chiplet互连系统_第14张图片

查看相关源码,发现无论设定的拓扑是什么,如果设定了--mesh-rows,都会按照mesh结构进行相关检查,就会出现assert检查不通过,因此可以尝试将这部分的检查注释掉,不会影响正常仿真过程。

在gem5中利用garnet3.0配置chiplet互连系统_第15张图片

 注意:修改后需要重新编译gem5.opt

你可能感兴趣的:(gem5学习,git,ruby)