gem5 SE模式x86 ISA下两级缓存配置未生效问题咨询
问题描述
在SE模式下采用x86 ISA的gem5模拟器调整缓存大小开展性能评估,使用官方示例配置脚本gem5/configs/example/se.py,缓存相关配置逻辑由gem5/configs/common/CacheConfig.py实现。
测试过程中观测到如下现象:
- 添加
--caches参数开启L1缓存后,性能出现提升,符合预期; - 同时添加
--caches与--l2cache参数开启L1、L2两级缓存后,性能无任何提升。
测试两组缓存配置得到的统计结果完全一致:
- 配置:L1D=32kB, L2=256kB
simSeconds 0.063785 system.cpu.dcache.overallMisses::total 196608 system.cpu.dcache.overallHits::total 13434883 system.l2.overallMisses::total 196610 system.l2.overallHits::total 45
- 配置:L1D=32kB, L2=512kB
simSeconds 0.063785 system.cpu.dcache.overallMisses::total 196608 system.cpu.dcache.overallHits::total 13434883 system.l2.overallMisses::total 196610 system.l2.overallHits::total 45
两组数据完全一致,说明L2容量参数未实际生效;且所有L1缓存缺失中仅45次命中L2,不符合缓存层级的正常逻辑,初步怀疑配置文件存在端口连接遗漏。
测试基准
测试使用简单的向量加法程序验证缓存配置,代码如下:
#include <iostream> #define LKMC_M5OPS_DUMPSTATS __asm__ __volatile__ (".word 0x040F; .word 0x0041;" : : "D" (0), "S" (0) :) #define LKMC_M5OPS_RESETSTATS __asm__ __volatile__ (".word 0x040F; .word 0x0040;" : : "D" (0), "S" (0) :) int main(int argc, char* argv[]) { int N = 1024 * 1024 * 1; float* A = new float[N]; float* B = new float[N]; float* C = new float[N]; LKMC_M5OPS_RESETSTATS; for(auto i = 0; i < N; i++) { C[i] = A[i] + B[i]; } LKMC_M5OPS_DUMPSTATS; delete[] A; delete[] B; delete[] C; return 0; }
gem5运行命令
仿真使用的完整运行命令如下:
build/X86/gem5.opt ./configs/example/se.py --cmd=./tests/test-progs/add_vector/add_vector --cpu-type=TimingSimpleCPU --caches --l2cache --l1d_size=32kB --l1i_size=32kB --l2_size=[256,512]kB
问题根因
该问题是经典缓存配置的端口连接遗漏导致的。SE模式下开启L2缓存时,配置逻辑未将L1缓存的内存侧端口接入L2的CPU侧端口,绝大多数L1缺失请求直接绕过L2访问主存,仅少量系统初始化阶段的请求会经过L2,因此出现L2命中率极低、修改L2容量完全不影响仿真结果的现象。
观测到的L2访问量仅比L1缺失多2次、命中数仅45次,就是因为L2没有处在核心的内存访问路径上,只有初始化流量经过。
修复方案
- 打开
configs/common/CacheConfig.py,定位到L2缓存配置函数(通常命名为config_l2_cache)。 - 修正端口连接逻辑:
- 单核配置下,将CPU的L1指令缓存、L1数据缓存的
mem_side端口,直接连接到L2缓存的cpu_side端口;多核配置下需要先将各核心L1的内存侧端口接到L2总线,再由L2总线连接L2的CPU侧端口。 - 将L2缓存的
mem_side端口连接到内存总线的CPU侧端口,同时删除原有L1缓存直接连接内存总线的代码,避免访问路径分叉。
- 单核配置下,将CPU的L1指令缓存、L1数据缓存的
- 校验缓存参数一致性:确认L1、L2缓存的缓存块大小配置一致,默认均为64字节,块大小不匹配也会导致缓存层级无法正常转发请求。
验证标准
修复后重新运行仿真,符合以下表现即为修复成功:
- 修改
--l2_size参数时,simSeconds统计值会随L2容量增大出现可观测的下降; - L2缓存命中数会远高于当前的45次,针对本次测试的12MB总数据量向量加法程序,256kB L2的命中率可达85%以上,512kB L2命中率会进一步提升;
- L2缓存的总访问数与L1缓存的总缺失数基本匹配,差值仅为个位数的系统级请求差异。
内容的提问来源于stack exchange,提问作者Mirco Mannino
相关产品推荐
相关产品推荐

