跳转至

评分标准

我们将在以下 4 个测例上运行你编写的缓存测试程序和优化前后的矩阵乘法程序,具体规格如下:

测例编号 访存延迟 缓存大小(B) 缓存行大小(B) 相联度 替换策略 写策略 矩阵乘法测试
1 5 2048 32 4 LRU 写通过
2 5 4096 4 16 FIFO 写通过
3 5 512 16 8 LRU 写回
4 5 1024 8 4 FIFO 写回

你只需要通过这 4 个测例即可,其他规格 cache 在本实验中不做要求。

具体评分细则如下:

  1. 缓存大小测试:2 分。通过测试 1 分,报告中给出原理 1 分。
  2. 缓存行大小测试:3 分。通过测试 2 分,报告中给出原理 1 分。
  3. 相联度测试:3 分。通过测试 2 分,报告中给出原理 1 分。
  4. 替换策略测试:1 分。通过测试 0.5 分,报告中给出原理 0.5 分。
  5. 写策略测试:1 分。通过测试 0.5 分,报告中给出原理 0.5 分。
  6. 矩阵乘法测试:2 分。通过测试 1.5 分,报告中给出原理 0.5 分。

所有测试项目均为捆绑测试(即必须通过全部测例才可以获得分数)。总分不会超过 10 分。

2024 框架有实现问题

实验框架的实现有问题,请将 ./backend/backend_wc.cpp 中的 BackendWithCache::commitInstruction 函数修改为如下的内容:

bool BackendWithCache::commitInstruction(const ROBEntry &entry,
                                     Frontend &frontend) {
    using namespace RV32I;

    unsigned saveROBPopPtr = rob.getPopPtr();

    bool executeExit = Backend::commitInstruction(entry, frontend);

    if (saveROBPopPtr != rob.getPopPtr() &&
        (entry.inst == LB || entry.inst == LBU || entry.inst == LH ||
        entry.inst == LHU || entry.inst == LW)) {
        auto ldSlot = loadBuffer.pop(saveROBPopPtr);
        if (!ldSlot.invalidate) {
            totalMemoryTime++;
            if (entry.state.cacheHit) {
                totalCacheHitTime++;
            }
        }
    }

    return executeExit;
}

原版本的实现对访存数和缓存命中数的相关统计有问题。

实验收取

请在自己的仓库中,将 .gitlab-ci.yml 修改为如下内容:

image: riscv64:alpha

before_script:
  - rm -rf checkfiles/ || true
  - rm -rf build/ || true
  - git clone $TESTCASES
  - mkdir build && cp tomasulo-simulator-testcases/check_predict.sh build/check_predict.sh && cp tomasulo-simulator-testcases/check_tomasulo.sh build/check_tomasulo.sh
  - cp -r tomasulo-simulator-testcases/checkfiles ./checkfiles
  - cd build && cmake -DJUDGE_ONLINE:STRING=true ..
  - make

after_script:
  - cd ~/ && rm -rf build

stages:
  - cache

job 1:
  stage: cache
  script:
    - ./cache_checker -f ../checkfiles/cache_spec.chk
  tags:
    - 2024-alpha

这样评测 ci 就会运行 cache-lab 的相关测例,并进行评分了。对于标准实现,评分程序最后的输出如下:

Testcase       0       1       2       3
Size      PASSED  PASSED  PASSED  PASSED
Block     PASSED  PASSED  PASSED  PASSED
Assoc     PASSED  PASSED  PASSED  PASSED
Matmul   SKIPPED SKIPPED  PASSED  PASSED
Replace   FAILED SKIPPED SKIPPED SKIPPED
Write     PASSED  PASSED  FAILED SKIPPED
Final score: 100

可以看到,标准实现没有完成替换策略和写策略的测试,只完成了 4 项必做任务。checker 输出的最终分数是按照对应项目的报告满分,满分为 100 计算的。请同学们在进行实验时自己进行换算。

实验提示

  1. 给出的访存延迟仅仅为期望值,实际的访存时间可能会有浮动。
  2. 内存模拟器模拟的内存对连续访存有优化,重复读取相同地址或者连续读取相邻地址的访存速度会显著变快。
  3. 请不要进行硬编码,保证你的程序有一定的普适性。如果我们发现你在某个测试项目当中对测例进行过拟合,你将会失去对应测试项目的分数。
  4. 实验中提供的 run_tests.sh 会运行上述 4 个测例。在 i7-10750H CPU 上,4 个测试大约需要运行 10 分钟,在 CI 评测机上大约需要运行 7 分钟。
  5. 实验的测试时间很长,请同学们务必安排好时间进行实验,防止因服务器压力过大导致实验无法提交。
  6. 评测机的 Timeout 为 15min。如果你发现自己的实现不能够满足时间限制,请优化你的实现。

实验参考

作为参考,我们给出标准实现在模拟器的对应测例的运行周期数。

缓存大小测试

测例\测试大小 512 1024 2048 4096 8192
1 21052 21167 21292 43497 43420
2 21065 21065 21067 21058 29157
3 21033 35303 35225 35296 35272
4 21098 21098 31208 31128 31201

缓存行大小测试

测例\测试步长 2 4 8 16 32 64
1 85523 89107 96275 110611 139281 172057
2 81930 81932 114670 114614 114726 114629
3 85006 88079 94224 106513 139247 139208
4 83982 86031 90125 122827 122824 122967

相联度测试

测例\测试相联度 1 2 4 8 16 32
1 110645 96329 179154 175689 173757 172937
2 110630 96305 89147 85599 116522 115651
3 110634 96313 89174 142861 141061 147940
4 110631 96306 129939 126557 124744 123973

矩阵乘法测试

测例 3:

[ WARNING ] Before optimization, cache hit rate = 0.533, finished in 116655 cycles
[ WARNING ] After optimization, cache hit rate = 0.952, finished in 98985 cycles

测例 4:

[ WARNING ] Before optimization, cache hit rate = 0.774, finished in 91854 cycles
[ WARNING ] After optimization, cache hit rate = 0.932, finished in 95446 cycles

最后更新: 2024年5月20日
作者:cuibst