一、设计内容 基于版本为21.2.0.0的Gem5模拟器的缓存存储体系实验
1实验准备 
（1）CPU 参数配置 
在 Gem5 中，通过参数命令可以指定 CPU 的配置， 例如配置 2 核 1 GHz、4 核 2 GHz 的 CPU，涉及-n 和--cpu-clock 选项。 
1）配置 2 核 CPU：$GEM5_DIR/build/ARM/gem5.opt$GEM5_DIR/configs/example/se.py –n 2 -- 
cpu-clock=1 GHz 
2）配置 4 核 CPU：$GEM5_DIR/build/ARM/gem5.opt$GEM5_DIR/configs/example/se.py –n 4 -- 
cpu-clock=2 GHz 
（2）缓存配置 
在 Gem5 中，有 2 种方法可以配置缓存：一是在配置文件中直接修改对应的参数值$GEM5_DIR/configs/common/Caches.py，这种方法比较直观；二是通过参数命令指定，比如配置二级缓存的容量和组相联度，可通过--l2_size 和--l2_assoc 选项指定，具体如下： 
1）128 KB、8 路组相连。 
$GEM5_DIR/build/ARM/gem5.opt$GEM5_DIR/configs/example/se.py--caches --l1d_size=32kB --l1d_assoc=2 --l1i_size=32kB --l1i_assoc=2--l2cache --l2_size=128kB --l2_assoc=8 
2）256 KB、16 路组相连。 
$GEM5_DIR/build/ARM/gem5.opt$GEM5_DIR/configs/example/se.py--caches --l1d_size=32kB --l1d_assoc=2 --l1i_size=32kB --l1i_assoc=2 --l2cache --l2_size=256kB --l2_assoc=16 
（3）基准测试程序配置 
spec cpu 2006benchmark 使用命令runspec来进行编译和运行。
runspec命令使用一个以.cfg结尾的配置文件来对benchmark进行编译。默认在$spec安装目录/config/ 下提供了一些配置文件的实例，可以根据需要对其进行修改。要使spec cpu 2006的bench能在gem5里运行，需要对每个bench进行静态编译。进入SPEC-cpu2006-1.2/config目录下，复制Example-linux64-amd64-gcc43+的配置文件（这个文件的选择根据Gem5中模拟的核模型来选择），将其重命名为aarch64.cfg（可以任意命名为其它名称）。对于配置文件主要做如下的更改：
 
gem5核模型是arm，需要使用aarch交叉编译为arm架构的可执行文件。
 
回到SPEC-cpu2006-1.2目录下，在命令行中执行：
runspec --config=<你的配置文件名> --action=build --tune=base <编译的样例名>
编译的样例名可以为某个具体的样例名，也可以是all（全部样例），int（全部整型样例），fp（全部浮点型样例）。由于任务要求是测试三个样例，所以可以仅编译某三个样例。
（4）缓存源代码修改示例 
以获取缓存读操作的访问信息为例，可通过如下步骤实现。 
步骤一：在文件 $GEM5_DIR/src/mem/cache/SConscript 中添加 DebugFlag('myflag')；
步骤二：在文件 $GEM5_DIR/src/mem/cache/base.cc 中添加 #include debug/myflag.hh，然后在 
access 函数中添加一下语句： 
if(pkt->isRead()) { 
DPRINTF(myflag, "isread")； 
} 
步骤三：在 Gem5 运行命令中添加调试选项—debug-flag=myflag，即可获取缓存读操作的访问 
信息。 
2实验步骤 
Gem5 模拟器的缓存存储体系实验性能测试参数配置如下： 
（1）处理器。配置为 2 核 CPU，ARM 架构，主频 800 MHz，每个 CPU 包含，1 个一级私有缓存和 1 个共享二级缓存。 
（2）一级私有缓存。容量 32 KB，4 路组相连，访问时间为 1 个周期，LRU 缓存替换算法。 
（3）二级共享缓存。容量为 512 KB，8 路组相连，访问时间为 8 个周期，LRU 缓存替换算法。 
（4）主存。主存大小为 256 MB，访问时间为 65个周期。 
使用 SPEC2006测试集对实验性能进行测试。 
在gem5中运行一个bench，以bzip2为例。使用config/example/se.py作为配置文件。命令很长，将其写成shell 脚本。 
#!/bin/bash
#run_bzip2.sh
#你的Gem5绝对路径
gem5path=$GEM5_DIR/gem5-stable
#你的Spec2006的！所有样例！的绝对路径
spec2006path=$gem5path/SPEC-cpu2006-1.2/benchspec/CPU2006
#你期望的结果保存位置
outdir=$gem5path/result
#你期望运行的样例编号.名称
bench=401.bzip2
#你期望运行的样例的具体位置（相对于$spec2006path/$bench的路径）
ben_suffix=run/run_base_ref_aarch64-gcc-8.0000
#你期望运行的样例的可执行文件名
exe=bzip2_base.aarch64-gcc-8
#Gem5的相对路径（注意架构和版本）-o为样例的选项，-i为样例的输入，不同样例不同，参见官方文档。--cpu-type为cpu类型，根据要求选用。
$gem5path/build/ARM/gem5.debug \
-debug-flags=Exce \
--outdir=$outdir \
$gem5path/configs/example/se.py \
-c "$spec2006path/$bench/$ben_suffix/$exe" \
-o "" \
-i "$spec2006path/$bench/$ben_suffix/control" \
--cpu-type=AtomicSimpleCPU \
--caches \
--cacheline_size=64 \
--l1d_size=64kB --l1i_size=32kB --l1i_assoc=8 --l1d_assoc=8 \
--l2cache --l2_size=2MB --l2_assoc=8 \
--mem-size=4096MB \
--mem-type=SimpleMemory \
在$gem5path/result 文件中记录着测试返回的日志信息程序运行的时间。
适当修改缓存存储体系结构（修改缓存参数，比如配置二级缓存的容量和组相联度等），观察结果变化（如程序运行时间、缓存miss率变化等）并记录之。

二、设计内容（以下两项任务任选其一完成）
（2）Cache仿真数据分析
为了弥补 CPU 与内存两者之间的性能差异，就在 CPU 内部引入了 CPU Cache，也称高速缓存。Gem5 仿真器通常需要与基准测试程序配合使用，具体的仿真流程如图所示，Gem5仿真器读取基准测试程序的二进制文件和数据输入，模拟处理器的硬件架构和运行流程，并在运行中动态输出不同阶段的性能数据(stats.txt)具体硬件配置信息(config.ini)以及可选的各硬件的运行记录信息(debug.log)。
 
1.	任选SPEC2006测试集中的一个样例（如gcc,bzip2等），编译为目标机的可执行文件。如果是SPEC2006测试集中的样例，此处标明哪个样例和输入集即可，否则需列出样例文件。
401.bzip2
2.	在GEM5仿真器中运行样例文件，分析所得到的运行数据，将日志文件的信息整合到如下的excel表中

访存地址	由addr右移Cacheline宽度对应的Bit位数得到的全局的Cacheline Index	Cacheline中的Offset	读/写操作，0代表读，1代表写	实际访问的数据长度	访存指令PC	L1Cache是否命中	L2Cache是否命中	L1Cache索引	L2Cache索引
addr	cacheId	offset	type	byte	pc	l1cacheState	l2cacheState	l1index	l2index
									

总结任务2的流程用于 TO DO规划