CS152 · Lab 5

Lab 5: Multicore Coherence

课程最后一个实验,把第 21 课的 MSI/MESI 协议、假共享概念,变成你亲手在一颗真实双核 Rocket 芯片上优化的并行程序——直接感受"同一份数据结构,写法不同,性能可以相差数倍"。

发布:2023-04-04(随第 21 课) 截止:2023-05-02 难度:较难

环境说明

双核 Rocket(RV64GC),每核私有 16KiB 指令缓存/4KiB 数据缓存,窥探式(snoopy)一致性,裸机运行(没有操作系统,所有线程同时进入 main(),通过 ncores/coreid 区分身份,barrier() 用于同步);每线程 24KiB 栈,没有任何保护机制——栈溢出会静默破坏其他数据,调试时需要格外小心。


指导性部分(约占 25% 分数)

  1. 在 Lab5MSIDualRocketConfig(MSI 一致性协议)下运行朴素的 vvadd
  2. 在 Lab5MIDualRocketConfig(更简单的 MI 协议,没有 Shared 状态)下运行同样的朴素代码,解释为什么朴素代码在两种协议下都表现不佳——这直接对应第 21 课"假共享"的核心教训:朴素实现很可能让多个核心的写入落在同一缓存行里
  3. 编写 vvadd_opt()——目标是把每次迭代的周期数压缩到朴素版本(MSI 协议下)的约 60%,通过自动评分器提交,不需要书面报告

开放性部分(约占 75% 分数,组队)

编写 matmul_opt(),实现一个 32×32 的整数矩阵乘法优化版本——矩阵本身有 12KiB 的内存占用,超过了 4 路 4KiB 的 L1 数据缓存容量,这本身就是一个现实的容量压力测试。关键优化技巧,全部直接呼应第 21 课的概念:

只有在没有达到性能目标时,才需要提交书面报告说明原因。


交付物与评分说明


知识检查

问题 1:指导性部分要求解释朴素 vvadd 为什么在 MSI 和 MI 协议下都表现不佳,根本原因是什么?

问题 2:开放性部分 matmul_opt() 列出的关键优化技巧中,哪两项直接呼应第 21 课的一致性协议概念?


参考资料与延伸阅读