gem5安装记录
背景
gem5是当前体系结构研究领域的常用开源仿真器,可以提供从系统级到微架构级的建模与验证功能。
通过gem5可以快速搭建一个有着memory hierarchy和可执行代码的cpu的系统级仿真框架,从而进行系统级评估,以解决当下论证存算一体优势时,benchmark和指标存在片面性的问题。
安装方式
https://www.gem5.org/documentation/learning_gem5/part1/building/
https://www.gem5.org/documentation/general_docs/building
上方链接为gem5的官方安装教程,gem5可以通过从github上下载源码进行本地编译安装,也可以通过docker进行安装,这里采用了本地安源码装方式,在macOS上进行。
安装过程
首先按照教程下载gem5源码:
git clone https://github.com/gem5/gem5
随后需要进行依赖安装,主要依赖为scons(gem5使用的先进编译管理工具,类似于CMake,但提供了一些更好的feature),zlib和m4(其他常用依赖如python,gcc,clang等自行检查版本是否符合要求即可),这些依赖都可以使用homebrew进行安装,如果还没有安装homebrew包管理器则需要提前安装。linux系统如ubuntu可以直接使用apt安装相关依赖。
brew install scons
brew install zlib
brew install m4
完成上述依赖的安装后,即可开始进行安装。
cd到gem5安装目录下,运行命令:
scons build/{ISA}/gem5.{variant} -j {cpus}
其中 {ISA} 是目标指令集架构,{variant} 指定编译设置。在大多数情况下,opt 是一个良好的编译目标。-j 标志是可选的,它允许编译过程并行化,{cpus} 指定使用的线程数。从头开始的单线程编译在某些系统上可能需要长达 2 个小时。因此强烈建议在可能的情况下分配更多线程。
有效的 ISA(指令集架构)包括:
- ARM
- NULL
- MIPS
- POWER
- RISCV
- SPARC
- X86
有效的编译设置包括: - debug:关闭优化。这确保变量不会被优化掉,函数不会被意外内联,控制流也不会出现意外行为。这使得该版本更适合与 gdb 等工具一起使用,但没有优化意味着这个版本比其他版本慢得多。当你使用 gdb、valgrind 等工具,并且不希望任何细节被隐藏时,应选择该版本,否则建议使用更优化的版本。
- opt:开启优化,并保留调试功能(如断言和 DPRINTF)。这在模拟速度和调试信息之间取得了良好的平衡。这是大多数情况下的首选版本。
- fast:开启优化,并移除调试功能。这在性能方面做到了极致,但以运行时错误检查和调试输出功能为代价。如果你非常确定一切运行正常,并希望获得模拟器的最佳性能,推荐使用该版本。
针对项目实际需求情况,我选择的目标指令集架构为RISCV,编译设置选择为opt,使用8线程进行编译:
scons build/RISCV/gem5.opt -j 8
该编译安装过程时间较久,可能会耗费数十分钟到数小时(取决于并行线程数)。
若安装成功,则应该在/build/RISCV路径下产生gem5.opt可执行文件。
编译最终结果为:
[SO Param] m5.objects.Sequencer, RubySequencer -> RISCV/python/_m5/param_RubySequencer.cc
[SO Param] m5.objects.Sequencer, RubyHTMSequencer -> RISCV/python/_m5/param_RubyHTMSequencer.cc
[SO Param] m5.objects.Sequencer, DMASequencer -> RISCV/python/_m5/param_DMASequencer.cc
[SO Param] m5.objects.Sequencer, RubyPortProxy -> RISCV/params/RubyPortProxy.hh
[SO Param] m5.objects.Controller, RubyController -> RISCV/python/_m5/param_RubyController.cc
[ LINK] -> RISCV/gem5.opt
ld: warning: ignoring duplicate libraries: '-lc++'
ld: warning: search path 'build/RISCV/ext/googletest' not found
scons: done building targets.
完成安装之后,可以用gem5自带脚本进行基础功能测试,gem5提供了一个简单的单核系统,可以通过在上面运行helloworld程序来验证安装正确性,命令为:
./build/RISCV/gem5.opt configs/learning_gem5/part1/simple-riscv.py
运行结果为:
(python_env) python_envJ6JK212CLJ:gem5 bytedance$ ./build/RISCV/gem5.opt configs/learning_gem5/part1/simple-riscv.py
gem5 Simulator System. https://www.gem5.org./build/RISCV/gem5.opt configs/learning_gem5/part1/simple-riscv.py
gem5 is copyrighted software; use the --copyright option for details.
gem5 version 24.1.0.3
gem5 compiled May 22 2025 22:50:28
gem5 started May 23 2025 14:47:16
gem5 executing on J6JK212CLJ, pid 22348
command line: build/RISCV/gem5.opt configs/deprecated/example/se.py -c tests/test-progs/hello/bin/riscv/linux/hello
warn: The se.py script is deprecated. It will be removed in future releases of gem5.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
src/mem/dram_interface.cc:692: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
src/arch/riscv/isa.cc:280: info: RVV enabled, VLEN = 256 bits, ELEN = 64 bits
src/base/statistics.hh:279: warn: One of the stats is a legacy stat. Legacy stat is a stat that does not belong to any statistics::Group. Legacy stat is deprecated.
system.remote_gdb: Listening for connections on port 7002
**** REAL SIMULATION ****
src/sim/simulate.cc:199: info: Entering event queue @ 0. Starting simulation...
src/sim/mem_state.cc:448: info: Increasing stack size by one page.
Hello world!
Exiting @ tick 3306500 because exiting with last active thread context
至此安装过程完成。
安装踩坑
实际安装过程中遇到了若干主要问题如下:
- scons编译时搜索zlib失败导致编译无法进行。报错内容如下:
Error: did not find needed zlib compression library and/or zlib.h header file.
Please install zlib and try again.
尝试了设置系统变量添加路径等常规方式无果后,通过修改工程SConstruct脚本解决了该问题,具体方式为在gem5原始SConstruct脚本790行位置做如下修改:
env.Append(CPPPATH=['/opt/homebrew/opt/zlib/include'])
env.Append(LIBPATH=['/opt/homebrew/opt/zlib/lib'])
env.Append(LIBS=['z'])
with gem5_scons.Configure(env) as conf:
# On Solaris you need to use libsocket for socket ops
if not conf.CheckLibWithHeader(
[None, 'socket'], 'sys/socket.h', 'C++', 'accept(0,0,0);'):
error("Can't find library with socket calls (e.g. accept()).")
# if not conf.CheckLibWithHeader('z', 'zlib.h', 'C++','zlibVersion();'):
# error('Did not find needed zlib compression library '
# 'and/or zlib.h header file.\n'
# 'Please install zlib and try again.')
增加下面三条语句使得scons可以搜索到zlib并在编译时进行链接:
env.Append(CPPPATH=['/opt/homebrew/opt/zlib/include'])
env.Append(LIBPATH=['/opt/homebrew/opt/zlib/lib'])
env.Append(LIBS=['z'])
即使成功完成了这一链接,由于scons检查语句的功能问题,在脚本运行时仍然会报错抛出,因此注释掉该检测部分:
# if not conf.CheckLibWithHeader('z', 'zlib.h', 'C++','zlibVersion();'):
# error('Did not find needed zlib compression library '
# 'and/or zlib.h header file.\n'
# 'Please install zlib and try again.')
随后可以正常进行编译。
- scons编译安装时ISA选择ALL导致测试程序执行出现问题。最初使用的是ALL配置(会编译安装所有支持的指令集),编译命令如下:
scons build/ALL/gem5.opt -j 8
在运行se.py测试程序时发现存在执行结果不一致,有时对有时错的问题,例如:
(python_env) python_envJ6JK212CLJ:gem5 bytedance$ build/ALL/gem5.opt configs/deprecated/example/se.py -c tests/test-progs/hello/bin/x86/linux/hello
warn: The se.py script is deprecated. It will be removed in future releases of gem5.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
src/mem/dram_interface.cc:692: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
src/arch/riscv/isa.cc:280: info: RVV enabled, VLEN = 256 bits, ELEN = 64 bits
src/base/statistics.hh:279: warn: One of the stats is a legacy stat. Legacy stat is a stat that does not belong to any statistics::Group. Legacy stat is deprecated.
system.remote_gdb: Listening for connections on port 7002
src/arch/riscv/isa.cc:644: panic: panic condition idx > NUM_PHYS_MISCREGS occurred: Illegal CSR index 0xb2
Memory Usage: 405328048 KBytes
Program aborted at tick 0
--- BEGIN LIBC BACKTRACE ---
0 gem5.opt 0x00000001030adfe0 _ZN4gem515print_backtraceEv + 44
1 gem5.opt 0x00000001030c35d8 _ZN4gem512abortHandlerEi + 132
2 libsystem_platform.dylib 0x000000018400ede4 _sigtramp + 56
3 libsystem_pthread.dylib 0x0000000183fd7f70 pthread_kill + 288
4 libsystem_c.dylib 0x0000000183ee4908 abort + 128
5 gem5.opt 0x0000000100ba64cc _ZN4gem55linux8onUDelayEPNS_13ThreadContextEyyy + 0
6 gem5.opt 0x00000001025509e8 _ZN4gem58RiscvISA3ISA18setMiscRegNoEffectEty + 164
7 gem5.opt 0x0000000101106e10 _ZN4gem56X86ISA13X86_64Process9initStateEv + 504
8 gem5.opt 0x0000000100c3fd64 ZZN8pybind1112cpp_function10initializeIZNS0_C1IvN4gem59SimObjectEJEJNS_4nameENS_9is_methodENS_7siblingEEEEMT0_FT_DpT1_EDpRKT2_EUlPS4_E_vJSI_EJS5_S6_S7_EEEvOS9_PFS8_SB_ESH_ENUlRNS_6detail13function_callEE_8__invokeESP + 108
9 gem5.opt 0x0000000100bcb874 ZN8pybind1112cpp_function10dispatcherEP7_objectS2_S2 + 5212
10 Python 0x0000000108aa12fc cfunction_call + 76
11 Python 0x0000000108a43664 _PyObject_MakeTpCall + 124
12 Python 0x0000000108b6c7d0 _PyEval_EvalFrameDefault + 6876
13 Python 0x0000000108b6aa78 PyEval_EvalCode + 200
14 Python 0x0000000108b65cd0 builtin_exec + 440
15 Python 0x0000000108aa0a10 cfunction_vectorcall_FASTCALL_KEYWORDS + 88
16 Python 0x0000000108a443a0 PyObject_Vectorcall + 92
17 Python 0x0000000108b6c7d0 _PyEval_EvalFrameDefault + 6876
18 gem5.opt 0x0000000100c16aa0 ZNK8pybind116detail10object_apiINS0_8accessorINS0_17accessor_policies8str_attrEEEEclILNS_19return_value_policyE1EJEEENS_6objectEDpOT0 + 76
19 gem5.opt 0x00000001030c40c8 main + 344
20 dyld 0x0000000183c58274 start + 2840
--- END LIBC BACKTRACE ---
For more info on how to address this issue, please visit https://www.gem5.org/documentation/general_docs/common-errors/
后发现使用ALL配置编译后的gem5.opt,在执行se.py测试程序时会随机调用指令集架构,当架构和程序一致时就能成功执行,否则就会出现报错。解决方案就是删除build文件夹进行重装,根据实际情况选择所需的指令集进行编译。

浙公网安备 33010602011771号