MultiSim
gem5 模拟的多处理支持。
问题
gem5 模拟器是单线程的。
这是核心设计的一部分,由于转换整个代码库的高成本,不太可能改变。
因此,我们无法通过更多的核心和线程来”加速”您的工作。
洞察
gem5 模拟器用于实验。
实验涉及探索当所有其他变量保持不变时,感兴趣的变量如何改变系统的行为。因此,使用 gem5 模拟器进行实验需要多次运行模拟器。 可以并行运行多个 gem5 实例。
如果不是使用多线程的单一 gem5 进程,为什么不使用多个 gem5 进程,每个都是单线程的呢?
((这对我们来说非常方便,因为我们不需要担心多线程的复杂性:内存一致性等。))
人们已经在这样做…某种程度上…
前往 materials/02-Using-gem5/11-multisim/01-multiprocessing-via-script 目录查看一个完整的示例,展示如何不运行多个 gem5 进程。
这是典型的做法,但不推荐。
编写脚本来运行多个 gem5 进程:
- 需要用户编写脚本。
- 增加了入门门槛。
- 增加了出错的可能性。
- 需要用户管理输出文件。
- 非标准化(每个人的做法都不同)。
- 难以与他人分享。
- 难以重现。
- 现在或将来都没有内置支持。
更好的方法
MultiSim 是 gem5 的一个功能,允许用户从单个 gem5 配置脚本运行多个 gem5 进程。
该脚本概述了要运行的模拟。 父 gem5 进程(用户直接启动的进程)会生成 gem5 子进程,每个子进程都能够运行这些模拟。
通过 Python multiprocessing 模块,父 gem5 进程将模拟(”作业”)排队,供子 gem5 进程(”工作线程”)执行。
与简单地编写脚本来运行多个 gem5 进程相比,Multisim 有几个优势:
- 我们(gem5 开发者)为您处理这些。
- 降低入门门槛。
- 降低出错的可能性。
- Multisim 会自动处理输出文件。
- 标准化。
- 易于与他人分享(只需发送脚本)。
- 易于重现(只需运行脚本)。
- 允许未来的支持(编排等)。
一些注意事项(这是新功能:请耐心等待)
此功能自版本 24.0 起是新的。
它还不完全成熟,仍然缺乏工具和库支持,这些支持将允许更大的灵活性和易用性。 然而,这个简短的教程应该能让您对如何继续使用它有一个很好的了解。
让我们看一个例子
首先打开 materials/02-Using-gem5/11-multisim/02-multiprocessing-via-multisim/multisim-experiment.py。
此配置脚本与上一个示例中的脚本几乎相同,但移除了 argparse 代码并添加了 multisim 导入:
开始:声明最大处理器数量
# Sets the maximum number of concurrent processes to be 2.
multisim.set_num_processes(2)
如果未设置,gem5 将默认消耗所有可用线程。 我们强烈建议设置此值以避免过度消耗系统资源。 将此行放在配置脚本的顶部附近。
使用简单的 Python 结构定义多个模拟
for data_cache_size in ["8kB","16kB"]:
for instruction_cache_size in ["8kB","16kB"]:
cache_hierarchy = PrivateL1CacheHierarchy(
l1d_size=data_cache_size,
l1i_size=instruction_cache_size,
)
用此代码替换 multisim-experiment.py 中的缓存层次结构,并缩进缓存层次结构之后的代码,使其全部位于内部 for 循环(for instruction_cache_size ...)内。
创建模拟并将其添加到 MultiSim 对象
关键区别:模拟器对象通过 add_simulator 函数传递给 MultiSim 模块。
这里不调用 run 函数。相反,它参与 MultiSim 模块的执行。
multisim.add_simulator(
Simulator(
board=board,
id=f"process_{data_cache_size}_{instruction_cache_size}"
)
)
id 参数用于标识模拟。强烈建议设置此参数。每个输出目录将根据 id 参数命名。
执行多个模拟
可以在 materials/02-Using-gem5/11-multisim/completed/02-multiprocessing-via-multisim/multisim-experiment.py 找到完整的示例。
cd /workspaces/2024/materials/02-Using-gem5/11-multisim/completed/02-multiprocessing-via-multisim
gem5 -m gem5.utils.multisim multisim-experiment.py
检查 “m5out” 目录以查看每个模拟的分离输出文件。
从 MultiSim 配置执行单个模拟
您也可以从 MultiSim 配置脚本执行单个模拟。
为此,只需将配置脚本直接传递给 gem5(即,不要使用 -m gem5.multisim multisim-experiment.py)。
要列出 MultiSim 配置脚本中模拟的 ID:
gem5 {config} --list
要执行单个模拟,传递 ID:
gem5 {config} {id}
