Gem5 perf evaluation

1 minute read

Published:

gem5进行体系结构设计的性能评测流程

此文档旨在协助同学们熟悉gem5模拟器使用,快速上手系统调用模式进行基准程序的测试

一、导入带gem5模拟器的Docker环境

为了免去配置gem5模拟器编译运行环境的烦恼,在Docker镜像中提供了完整工具链和gem5代码,可直接使用Scons编译和系统调用(SE)模式运行。

  1. 首先需要找管理员申请Docker用户权限,从阿里云Registry拉取gem5镜像, docker pull registry.cn-hangzhou.aliyuncs.com/ronglonely/gem5:latest,默认238服务器已经存在该镜像

  2. 创造自己的容器,将存储基准目录映射到容器,实现文件共享,docker run -it --name [rename] -v [/src]:[/dst] [ImageID/NAME] bash (/src必须写绝对路径,在238服务器,ImageID为6a99d3febe7d)

  3. 之后运行容器,需先启动,docker start [containerID/NAME],再进入,docker attach [containerID/NAME](也可以docker exec -it [containerID/NAME] /bin/bash,如果退出,容器不会停止)

二、编译gem5

进入容器后,/home/gem5是模拟器代码的根目录,下面开始了修改设计和测试全过程(假设当前处于gem5模拟器根目录)

  1. 修改CPU设计参数,作为一个基准参考,这里一般选择O3乱序CPU,根据MediumBOOM微体系结构可配置参数,打开src/cpu/o3/O3CPU.py文件进行设置,下表是gem5参数表

    ParametersValues
    Fetch Width4
    Decode Width2
    Issue Width4
    Number of reorder buffer entries64
    Number of physical integer registers80
    Number of physical floating point registers64
    Number of load queue entries16
    Number of store queue entries16
    Fetch queue size in micro-ops per-thread16
    ICache configL1: 4Ways, 64Sets, total 16KB
    DCache configL1: 4Ways, 64Sets, total 16KB
  2. 确定ISA,一般是RISCV,为了能区分各种修改源代码配置后的编译生成的gem5.opt可执行文件,需在build_opt目录中复制一份RISCV编译选项文件,cp ./build_opt/RISCV ./build_opt/RISCV_XX(如果在第一步设置设计参数时,是基准参考,可命名为RISCV_BASE,如果设置了ROB队列容量为128,可命名为RISCV_ROB128,以方便自己识别为准)

  3. 编译gem5模拟器源代码,生成gem5.opt,scons build/RISCV_XX/gem5.opt -j`nproc`,(nproc表示服务器最大线程并行编译)

  4. 第3步可以编译生成修改了微体系结构参数后的特定设计对应的模拟器可执行文件,接下来就是性能评测了。使用gem5 SE模式运行基准测试,统计性能指标到m5out目录下的stat文本文件,./build/RISCV_IW8/gem5.opt --stats-file iw8_xalan_stats.txt ./configs/example/se.py -c ./spec/bin/Xalan -o "-v ./spec/483.xalancbmk/t5.xml ./spec/483.xalancbmk/xalanc.xsl" --fast-forward 100000000 -I 500000000 --cpu-type O3CPU --caches (这里假设测试发射宽度修改为8后的CPU设计的性能,测试基准为SPEC中的Xalan)

  5. 解释第4步的命令,及gem5 SE模式运行时的各类选项。–stats-file后是统计性能指标的文件命名,默认会生成在m5out目录中,接着就是SE模式的Python配置文件路径,-c后面是基准程序可执行文件目录(在这里需和ISA对应,是RISCV可执行文件),-o后面双引号中内容是基准程序执行时所需的参数,如需要输入文件,也可用相对路径写在这里。–fast-forward也可写为-F,表示预热的指令数,不会统计在性能指标IPC中,-I表示执行的总指令数,(一般SPEC在模拟器中执行时间过长,需用该选项,而Mibench等其他基准无需使用)–cpu-type表示使用O3CPU乱序流水线执行基准,–caches 则配置高速缓存

三、编译SPEC基准为RISCV可执行文件

这里以SPEC为例,说明一下如何编译自己的各种基准程序,生成RISCV可执行文件的过程。其他基准如Mibench,可供参考。

  1. 从管理员申请spec2006基准套件,在自己目录解压,cd spec2006/benchspec/CPU2006/,进入目录,在该目录下会有各种以编号开头的目录,即为各种基准程序,如gcc

  2. 进入编号开头的目录,不妨以403.gcc目录为例,源文件代码在run/build_base_riscv.0001目录下,基准运行时所需的输入文件在data/ref/input目录,输出文件在data/ref/output目录,修改完源文件c++或c语言代码后,打开run/build_base_riscv.0001/Makefile.spec文件(在Mibench基准套件中,编译配置文件是各程序所在目录下的Makefile),修改编译选项,一般选择CC编译器为riscv64-unknown-linux-gnu-gcc或riscv64-unknown-elf-gcc,CXX则将末尾的gcc改为g++(在238服务器中,环境变量已经配置好),COPTIMIZE(编译优化等级等参数)设置为-O2 -static(gem5只支持运行静态编译后的可执行文件,优化等级按照需求设置)

  3. run/build_base_riscv.0001/目录下,执行make命令,即可开始编译,若无报错,在该目录下会生成一个RISCV架构的可执行文件,文件名可在编译选项文件中设置。

  4. 基准程序的运行命令可以参考 run/run_base_ref_amd64.0001/speccmds.cmd文件,例如gcc的该文件内容如下:

    -C /home/lishuoke/spec2006/benchspec/CPU2006/403.gcc/run/run_base_ref_amd64.0001
    -o 166.out -e 166.err ../run_base_ref_amd64.0001/gcc_base.amd64 166.i -o 166.s
    -o 200.out -e 200.err ../run_base_ref_amd64.0001/gcc_base.amd64 200.i -o 200.s
    -o c-typeck.out -e c-typeck.err ../run_base_ref_amd64.0001/gcc_base.amd64 c-typeck.i -o c-typeck.s
    -o cp-decl.out -e cp-decl.err ../run_base_ref_amd64.0001/gcc_base.amd64 cp-decl.i -o cp-decl.s
    -o expr.out -e expr.err ../run_base_ref_amd64.0001/gcc_base.amd64 expr.i -o expr.s
    -o expr2.out -e expr2.err ../run_base_ref_amd64.0001/gcc_base.amd64 expr2.i -o expr2.s
    -o g23.out -e g23.err ../run_base_ref_amd64.0001/gcc_base.amd64 g23.i -o g23.s
    -o s04.out -e s04.err ../run_base_ref_amd64.0001/gcc_base.amd64 s04.i -o s04.s
    -o scilab.out -e scilab.err ../run_base_ref_amd64.0001/gcc_base.amd64 scilab.i -o scilab.s
    

    基准运行命令,可以从第二行开始的后半部分提取出来,../run_base_ref_amd64.0001/gcc_base.amd64 166.i -o 166.s ,其中../run_base_ref_amd64.0001/gcc_base.amd64表示可执行文件的路径,替换成自己基准的位置即可,后面就是基准运行所需的参数(写入到gem5执行命令中的-o选项),gcc基准可以有多种不同负载类型的输入文件。