目录
一、A tour of the directory structure
三、Some common options?se.py?and?fs.py
在这个教程中,将探讨如何使用gem5附带的默认配置脚本。
gem5附带了许多配置脚本,使用户快速使用gem5。但是在使用gem5进行计算机体系结构研究时,应该充分了解正在模拟的系统。这个教程就是指导用户了解系统中的默认配置脚本的重要选项和部分内容。
前面介绍的是从头开始创建自己的脚本,这样可以自定义系统参数。但是例如完整的ARM或x86系统等架构非常复杂,难以用我们自己创建的方法进行设置。所以gem5的开发人员提供了许多脚本来启动构建系统的过程。
可以用tree命令在config目录中查看当前目录文件结构。
tree
configs/boot:
bbench-gb.rcS bbench-ics.rcS hack_back_ckpt.rcS halt.sh
configs/common:
Benchmarks.py Caches.py cpu2000.py FileSystemConfig.py GPUTLBConfig.py HMC.py MemConfig.py Options.py Simulation.py
CacheConfig.py cores CpuConfig.py FSConfig.py GPUTLBOptions.py __init__.py ObjectList.py SimpleOpts.py SysPaths.py
configs/dist:
sw.py
configs/dram:
lat_mem_rd.py low_power_sweep.py sweep.py
configs/example:
apu_se.py etrace_replay.py garnet_synth_traffic.py hmctest.py hsaTopology.py memtest.py read_config.py ruby_direct_test.py ruby_mem_test.py sc_main.py
arm fs.py hmc_hello.py hmc_tgen.cfg memcheck.py noc_config riscv ruby_gpu_random_test.py ruby_random_test.py se.py
configs/learning_gem5:
part1 part2 part3 README
configs/network:
__init__.py Network.py
configs/nvm:
sweep_hybrid.py sweep.py
configs/ruby:
AMD_Base_Constructor.py CHI.py Garnet_standalone.py __init__.py MESI_Three_Level.py MI_example.py MOESI_CMP_directory.py MOESI_hammer.py
CHI_config.py CntrlBase.py GPU_VIPER.py MESI_Three_Level_HTM.py MESI_Two_Level.py MOESI_AMD_Base.py MOESI_CMP_token.py Ruby.py
configs/splash2:
cluster.py run.py
configs/topologies:
BaseTopology.py Cluster.py CrossbarGarnet.py Crossbar.py CustomMesh.py __init__.py MeshDirCorners_XY.py Mesh_westfirst.py Mesh_XY.py Pt2Pt.py
其中对每个目录进行详细解释说明。
这些是在完整系统模式下使用的 rcS 文件。这些文件在Linux启动后由模拟器加载,并由shell执行。其中大部分用于在完整系统模式下控制基准测试。有些是实用函数,例如 hack_back_ckpt.rcS。这些文件在完整系统模拟章节中会更详细地介绍。
该目录包含了一些辅助脚本和函数,用于创建模拟系统。例如,Caches.py类似于前几章中创建的caches.py和caches_opts.py文件。
这个文件夹中主要是用于测试DRAM的脚本。
该目录包含一些示例gem5配置脚本,可以直接使用来运行gem5。特别是se.py和fs.py非常有用。关于这些文件的更多信息可以在下一节中找到。此外,该目录还包含一些其他实用的配置脚本。
该目录包含了learning_gem5教程中的所有gem5配置脚本。
该目录包含了HeteroGarnet网络的配置脚本。
相关教程:gem5: HeteroGarnet (Garnet 3.0)
该目录包含使用NVM接口的示例脚本。
该目录包含了Ruby及其包含的缓存一致性协议的配置脚本。
相关教程:gem5: Introduction
该目录包含了用于运行splash2基准套件的脚本,其中包含了一些选项用于配置模拟系统。
该目录包含了在创建Ruby缓存层次结构时可使用的拓扑结构的实现。有关详细信息,请参阅Ruby章节。
其中还有一些没有详细说明的,deprecated/目录是已经启用。
se.py
?and?fs.py
在本节中,将讨论一些可以通过命令行传递给se.py和fs.py的常见选项。有关如何运行完整系统仿真的详细信息,请参阅完整系统仿真:gem5: X86 Full-System Tutorial。在这里,只将讨论这两个文件中共有的选项。
本节讨论的大多数选项都可以在Options.py中找到,并在函数addCommonOptions中注册。本节不详细介绍所有选项。要查看所有选项,请使用--help运行配置脚本,或阅读脚本的源代码。
首先,简单地运行hello world程序,不使用任何参数:
build/X86/gem5.debug configs/deprecated/example/se.py --cmd=tests/test-progs/hello/bin/x86/linux/hello
默认情况下,gem5使用原子CPU和原子内存访问,因此没有报告真实的时间数据!要确认这一点,可以查看m5out/config.ini文件。CPU显示在第51行:
为了实际以timing mode模式运行gem5,指定一个CPU类型。在此过程中,还可以为L1缓存指定大小。
build/X86/gem5.debug configs/deprecated/example/se.py --cmd=tests/test-progs/hello/bin/x86/linux/hello --cpu-type=TimingSimpleCPU --l1d_size=64kB --l1i_size=16kB
检查config.ini文件,确保这些选项正确地传播到最终的系统中。在m5out/config.ini中搜索“cache”,没有创建任何缓存。因为尽管指定了缓存的大小,但没有指定系统应该使用缓存,所以没有被创建。正确的命令行【在最后加入--caches】:
build/X86/gem5.debug configs/deprecated/example/se.py --cmd=tests/test-progs/hello/bin/x86/linux/hello --cpu-type=TimingSimpleCPU --l1d_size=64kB --l1i_size=16kB --caches
se.py
?and?fs.py
打印所有可能的选项:
build/X86/gem5.debug configs/deprecated/example/se.py --help
教程中只列出了一部分比较重要的:
--cpu-type=CPU_TYPE
????????要运行的CPU类型。这是一个重要的参数,必须设置。默认值是atomic,不执行定时仿真。
--sys-clock=SYS_CLOCK
????????系统速度运行的时钟。
--cpu-clock=CPU_CLOCK
????????CPU速度运行的时钟,与上面的系统时钟是分开的。
--mem-type=MEM_TYPE
????????要使用的内存类型。选项包括不同的DDR内存和Ruby内存控制器。
--caches
????????使用经典缓存进行仿真。
--l2cache
????????如果使用经典缓存,则使用L2缓存进行仿真。
--ruby
????????将Ruby作为缓存系统仿真,而不是使用经典缓存。
-m TICKS, --abs-max-tick=TICKS
????????运行到指定的绝对模拟时钟,包括从恢复的检查点中计算的时钟。如果只想模拟一定量的模拟时间,需要使用这个参数。
-I MAXINSTS, --maxinsts=MAXINSTS
????????要模拟的总指令数(默认为无限)。如果您想在执行一定数量的指令后停止仿真,需要使用这个参数。
-c CMD, --cmd=CMD
????????以系统调用仿真模式运行的二进制文件。
-o OPTIONS, --options=OPTIONS
????????传递给二进制文件的选项,整个字符串要用引号括起来。当运行需要选项的命令时,需要使用这个参数。可以通过此变量传递参数和选项(例如,--whatever)。
--output=OUTPUT
????????将stdout重定向到文件。如果想将模拟应用程序的输出重定向到文件而不是打印到终端上,需要使用这个参数。注意:要重定向gem5的输出,必须在配置脚本之前传递一个参数。
--errout=ERROUT
????????将stderr重定向到文件。类似于上面的操作。