You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

gem5 SE模式x86 ISA下两级缓存配置未生效问题咨询

问题描述

在SE模式下采用x86 ISA的gem5模拟器调整缓存大小开展性能评估,使用官方示例配置脚本gem5/configs/example/se.py,缓存相关配置逻辑由gem5/configs/common/CacheConfig.py实现。
测试过程中观测到如下现象:

  • 添加--caches参数开启L1缓存后,性能出现提升,符合预期;
  • 同时添加--caches与--l2cache参数开启L1、L2两级缓存后,性能无任何提升。

测试两组缓存配置得到的统计结果完全一致:

  1. 配置: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
  1. 配置: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没有处在核心的内存访问路径上,只有初始化流量经过。

修复方案
  1. 打开configs/common/CacheConfig.py,定位到L2缓存配置函数(通常命名为config_l2_cache)。
  2. 修正端口连接逻辑:
    • 单核配置下,将CPU的L1指令缓存、L1数据缓存的mem_side端口,直接连接到L2缓存的cpu_side端口;多核配置下需要先将各核心L1的内存侧端口接到L2总线,再由L2总线连接L2的CPU侧端口。
    • 将L2缓存的mem_side端口连接到内存总线的CPU侧端口,同时删除原有L1缓存直接连接内存总线的代码,避免访问路径分叉。
  3. 校验缓存参数一致性:确认L1、L2缓存的缓存块大小配置一致,默认均为64字节,块大小不匹配也会导致缓存层级无法正常转发请求。
验证标准

修复后重新运行仿真,符合以下表现即为修复成功:

  • 修改--l2_size参数时,simSeconds统计值会随L2容量增大出现可观测的下降;
  • L2缓存命中数会远高于当前的45次,针对本次测试的12MB总数据量向量加法程序,256kB L2的命中率可达85%以上,512kB L2命中率会进一步提升;
  • L2缓存的总访问数与L1缓存的总缺失数基本匹配,差值仅为个位数的系统级请求差异。

内容的提问来源于stack exchange,提问作者Mirco Mannino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 21:57:36