CS152 · Lab 5
课程最后一个实验,把第 21 课的 MSI/MESI 协议、假共享概念,变成你亲手在一颗真实双核 Rocket 芯片上优化的并行程序——直接感受"同一份数据结构,写法不同,性能可以相差数倍"。
双核 Rocket(RV64GC),每核私有 16KiB 指令缓存/4KiB 数据缓存,窥探式(snoopy)一致性,裸机运行(没有操作系统,所有线程同时进入 main(),通过 ncores/coreid 区分身份,barrier() 用于同步);每线程 24KiB 栈,没有任何保护机制——栈溢出会静默破坏其他数据,调试时需要格外小心。
Lab5MSIDualRocketConfig(MSI 一致性协议)下运行朴素的 vvaddLab5MIDualRocketConfig(更简单的 MI 协议,没有 Shared 状态)下运行同样的朴素代码,解释为什么朴素代码在两种协议下都表现不佳——这直接对应第 21 课"假共享"的核心教训:朴素实现很可能让多个核心的写入落在同一缓存行里vvadd_opt()——目标是把每次迭代的周期数压缩到朴素版本(MSI 协议下)的约 60%,通过自动评分器提交,不需要书面报告编写 matmul_opt(),实现一个 32×32 的整数矩阵乘法优化版本——矩阵本身有 12KiB 的内存占用,超过了 4 路 4KiB 的 L1 数据缓存容量,这本身就是一个现实的容量压力测试。关键优化技巧,全部直接呼应第 21 课的概念:
只有在没有达到性能目标时,才需要提交书面报告说明原因。
问题 1:指导性部分要求解释朴素 vvadd 为什么在 MSI 和 MI 协议下都表现不佳,根本原因是什么?
问题 2:开放性部分 matmul_opt() 列出的关键优化技巧中,哪两项直接呼应第 21 课的一致性协议概念?