背景

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

至此安装过程完成。

安装踩坑

实际安装过程中遇到了若干主要问题如下:

  1. 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.')

随后可以正常进行编译。

  1. 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文件夹进行重装,根据实际情况选择所需的指令集进行编译。

gem5安装记录的更多相关文章

  1. 分布式监控系统Zabbix-3.0.3-完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  2. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  3. sourceinsight安装记录

    sourceinsight安装记录 此文章为本人使用sourceinsight一个星期之后的相关设置步骤记录和经验记录,以备以后查验,网上的相关资料都也较为完善,但是对于新手还是有一定困难的,所以在这 ...

  4. openerp安装记录及postgresql数据库问题解决

    ubuntu-14.04下openerp安装记录1.安装PostgreSQL 数据库    a.安装         sudo apt-get install postgresql    安装后ubu ...

  5. Matlab安装记录 - LED Control Activex控件安装

    Matlab安装记录-LED Control Activex控件安装 2013-12-01  22:06:36 最近在研究Matlab GUI技术,准备用于制作上位机程序:在Matlab GUI的技术 ...

  6. Arch Linux 安装记录

    Arch Linux 安装记录 基本上参考wiki上的新手指南,使用arch 2014.6.1 iso安装 设置网络 有线网络 Arch Linux 默认开启DHCP. 静态ip 首先关闭DHCP:s ...

  7. redis5.0.3单实例简单安装记录

    redis5.0.3单实例简单安装记录 日常需要测试使用,索性记录下来,免得临时又麻烦的找资料. yum -y install make gcc-c++ cmake bison-devel ncurs ...

  8. mysql5.7安装记录

    mysql安装记录 版本5.7 windows系统 一.缺少my.ini文件 [mysql]# 设置mysql客户端默认字符集default-character-set=utf8 [mysqld]#设 ...

  9. Liunx/RHEL6.5 Oracle11 安装记录

    1.创建用户组 groupadd oinstall #创建用户组oinstall groupadd dba #创建用户组dba useradd -g oinstall -g dba -m oracle ...

  10. zookeeper三节点集群安装记录

    以下是3个节点的zk安装记录. 下载 下载地址: http://mirrors.shu.edu.cn/apache/zookeeper/ cd /data/opt/zk wget http://mir ...

随机推荐

  1. CF1928C Physical Education Lesson 题解

    CF1928C Physical Education Lesson 我们发现,每 \(2k-2\) 个数构成了一个周期.其中,前 \(k\) 个数为前周期,后 \(k-2\) 个数为后周期.我们对于 ...

  2. MySQL 15 日志相关问题追问

    先放一下两阶段提交的图,在后续问题中会用到: 问题 在MySQL 02中,讲到为什么要使用两阶段提交时用的是反证法,说明了如果不使用两阶段提交,会导致MySQL出现主备数据不一致等问题. 那么如果在两 ...

  3. ETLCloud中多并行分支运行的设计技巧

    在大数据处理领域,ETL(Extract, Transform, Load)流程是至关重要的一环,它涉及数据的提取.转换和加载,以确保数据的质量和可用性.而在ETL流程中,多并行分支的运行设计是一项关 ...

  4. java中如何处理夏令时?

    在国际化的项目中,处理时间时经常会遇到夏令时(BST,British Summer Time)问题,发明夏令时(以及冬令时)主要是为了省电.   冷知识:中国历史上也曾经采用过(1986-1991)夏 ...

  5. 红日ATT&CK系列靶场(五)笔记

    环境搭建 第一次登录会提示需要更改账号密码. win7账号密码: sun\heart 123.com sun\Administrator dc123.com --------------------- ...

  6. LG 8 月月赛

    1 比赛情况 A B C D \(100\) \(100\color{red}{\text{(已被 Hack)}}\) \(45\) \(0\) 2 比赛流程 开场构造 A,构造错了,卡了 \(30\ ...

  7. C#/.NET/.NET Core技术前沿周刊 | 第 48 期(2025年7.21-7.27)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  8. C# 线程相关一点杂记

    相信很多人在实际开发中是不愿使用到多线程的,因为一旦引入多线程这个概念,对应功能就需要加很多关于线程的考虑措施,如锁,任务回调顺序等等.有事加了一些对应的措施,还是感觉程序出现偶发的不同问题,这里主要 ...

  9. js 设置 cookies , 读取cookies

    /** * js 设cookies * @param name 存储的名称 列如 name = 'one_name'; * @param value 存储的值 列如 value = '123' * @ ...

  10. I & Carlos

    说起来文风这件事,我的文风是一成不变的.倘若有一日变得唐突,那我一定不是在写文章,而是在输入内心 os.这两者,有本质区别.就像 galaxy 老师(我习惯这么称呼但是生活中显然不是这样,或者说一次都 ...