要编译出能在 gem5 SE 模式下稳定运行的 SPEC CPU2006 二进制文件,最核心的原则是:静态编译(Static Linking) 以及 目标架构对齐。
由于 gem5 的 SE 模式通过模拟系统调用(Syscall Emulation)来运行程序,它无法像真实系统那样动态加载 .so 库。因此,必须将所有依赖库全部打包进二进制文件中。
目前工作致力于基于gem5建立针对某项自主架构的模拟器,为此,需要在目标架构下使用相应的编译器静态编译出包括了所需依赖库的二进制文件方可交由gem5进行模拟,运行在其他架构的gem5会模拟出目标架构,以此测试gem5对目标架构的模拟情况。
1. 准备工作:安装交叉编译器
如果你是在 x86 机器上模拟 x86 架构,使用系统自带的 gcc 即可。但如果你是在模拟 Alpha、ARM 或 RISC-V,则需要安装对应的交叉工具链。
对于 x86_64(最常用):Bashsudo apt-get install build-essential gfortran对于 Alpha(针对你日志中出现的 Alpha): 通常需要寻找较旧版本的alpha-linux-gnu-gcc静态编译版本。
(AI的总结包含此部分,由于本工作直接使用目标架构的真机进行编译,故仅作记录按下不表)
2. 修改 SPEC 配置文件 (Config)
SPEC 使用 .cfg 文件来管理编译选项。你需要进入 SPEC2006/config/ 目录,复制一个模板(如 linux-x86_64-gcc43.cfg)并修改关键字段。
spec cpu 2006benchmark 使用命令runspec来进行编译和运行。
runspec命令使用一个以.cfg结尾的配置文件来对benchmark进行编译。默认在$spec安装目录/config/ 下提供了一些配置文件的实例,可以根据需要对其进行修改。
要使spec cpu 2006的bench能在gem5里运行,需要对每个bench进行静态编译。对于配置文件主要做如下的更改:
## Base is low opt
default=base=default=default:
COPTIMIZE = -O2 -fno-strict-aliasing
CXXOPTIMIZE = -O2 -fno-strict-aliasing
FOPTIMIZE = -O2 -fno-strict-aliasing
# 改为
COPTIMIZE = -O2 -fno-strict-aliasing -static
CXXOPTIMIZE = -O2 -fno-strict-aliasing -static
FOPTIMIZE = -O2 -fno-strict-aliasing -static
可能也需要包括如下内容:
A. 开启静态链接
在 PORTABILITY 或 OPTIMIZE 部分,确保添加 -static 标签。
# 强制所有库静态连接
EXTRA_LDFLAGS = -static
EXTRA_LIBS = -lm
B. 禁用不兼容的特性
SE 模式对某些复杂的系统特性(如多线程锁、特殊的显存调用)支持有限。
# 建议使用的基础优化参数
OPTIMIZE = -O3 -fno-strict-aliasing
3. 执行编译命令
使用 SPEC 提供的 runspec 工具进行编译(--action=build)。
步骤示例:
# 初始化环境:
cd /path/to/SPEC2006
source shrc
# 编译特定测试程序
runspec --config=your_modified_config.cfg --action=build --tune=base 429.mcf
4. 获取生成的二进制文件
编译完成后,二进制文件通常存放在: SPEC2006/benchspec/CPU2006/429.mcf/exe/mcf_base.your_config_name
验证是否为静态编译: 在 Linux 终端执行 file 命令:
file mcf_base.your_config_name
# 输出应包含:ELF 64-bit LSB executable, ..., statically linked
如果是 dynamically linked,gem5 运行程序时会直接报错。
运行一个例子
编译并运行一个bench,以401.bzip2为例
# 编译perlbench
runspec --config=xxx.cfg --action=build --tune=base bzip2
# 运行perlbench
runspec --config=xxx.cfg --size=ref -I --tune=base bzip2
这里的xxx.cfg是对应的配置文件,指定了包括编译和运行SPEC CPU的环境参数。还可以使用int,fp,all来替代bzip2编译或运行整型bench,浮点或所有bench。
二进制运行
当编译一个bench会在对应目录下生成一个run子文件夹,里面包含编译生成的可执行文件和对应的输入。想了解每个bench 到底做了什么可以直接运行这个可执行文件。以bzip2为例
cd $PATH_TO_YOUR_SPEC_CPU2006_INSTALL/benchspec/CPU2006/401. bzip2/run/run__base.amd64-m64-gcc43-nn.0000/
./bzip2_base.amd64-m64-gcc43-nn control
对于不同的bench,有不同的运行输入,具体可见官方说明或安装目录下每个bench下的Docs子文件夹。要使这些bench在gem5中被正确地执行,指定正确的输入是很重要的。否则即使能跑起来也没有正确的输入。使用runspec运行bench 只需要使用–size选项来指定输入就好了。
声明:存在AI生成内容
主要参考:https://tomsworkspace.github.io/2020/09/22/gem5%E8%BF%90%E8%A1%8CSPECCPU2006benchmark/