NSCSCC2020-个人赛
- (1)建模:利用C++实现周期精确级模拟器(cpp-cpu-model)
- (2)通过暴力搜索优化参数[1](自动调参)
- (3)根据优化结果进行RTL设计
- (4)若RTL无法满足模型假设,回到(1)修正模型
- (5)若RTL满足设计要求,进行FPGA验证。
在 120MHz时钟主频下,运行三组高负载基准程序[2],结果如下
测试名称 | 用时[3] |
---|---|
UTEST_STREAM | 0.055s |
UTEST_MATRIX | 0.114s |
UTEST_CRYPTONIGHT | 0.245s |
五级流水、猜测执行、分支预测、Cache、Write Buffer
源码树:thinpad_top.srcs/sources_1/new 内各文件描述如下:
源文件 | 描述 | 详细 |
---|---|---|
yamp32_parameters.vh | parameters | CPU全局参数定义 |
yamp32_biu.v | BIU(Bus Interface Unit)总线接口单元 | 实现数据/指令接口的仲裁,实现SRAM读写时序 |
yamp32_core.v | CPU核心 | CPU顶层设计 |
yamp32_bpu.v | BPU(Branching Prediction Unit)分支预测单元 | 目前只实现了最简单的动态分支预测 |
yamp32_icache.v | I-Cache | 指令高速缓存(四路组相关、LRU置换、全流水化) |
yamp32_ifu.v | IFU(Insn Fetching Unit) | 取指单元 |
yamp32_idu.v | IDU(Insn Decoding Unit) | 译码单元 |
yamp32_exu.v | EXU(Execution Unit) | 执行单元,包括ALU等子部件 |
yamp32_lsu.v | LSU(Load & Store Unit) | 访存单元,包括Write Buffer |
yamp32_wb_mux.v | WB(Writing Back) | 回写单元。实际上为寄存器写入端口提供仲裁 |
yamp32_regfile.v | Regfile | 寄存器堆 |
yamp32_ctrl.v | Controller | 流水线控制器。决定各级流水线暂停状态 |
yamp32_segmap.v | Segment mapping | 完成段映射 |
bypass_net.v | 旁路网络 | 实现流水线操作数旁路 |
源文件 | 描述 | 详细 |
---|---|---|
uart.v | UART | 带FIFO的通用异步收发器 |
fifo_fwft_sclk.v | FWFT(First-word-Fall-Through) | 实现FWFT模式的FIFO(无需读指令,而自动将操作数放到输出端口) |
xpm_sdpram_bypass.v | xpm简单双口RAM | Xilinx参数化内存封装,增加一层旁路逻辑 |
C++模型模拟MIPS指令的运行,精确计算Cache Miss或分支预测失败带来的开销,自动调参,输出统计信息,为微架构设计与优化提供量化依据。
下面是编译运行该C++模型的指南。
准备Linux环境(如果在Windows下,可以考虑使用Cygwin、WSL或MinGW),在源码根目录下运行如下命令:
cd cpp-cpu-model
mkdir build && cd ./build
cmake ..
make -j8
编译成功将在build目录生成可执行文件cpu(cpu.exe)。
在build目录使用如下命令启动模拟器。模拟器将模拟CPU运行,自动向监控程序的终端发送命令,启动基准程序。
./cpu kernel.bin STREAM
其中kernel.bin
为监控程序supervisor的二进制映像。对于supervisor v2.01,可在其源码根目录中kernel/kernel.bin中找到。
STREAM
为测试用例的名称,在NSCSCC2020中,共有STREAM、MATRIX、CRYPTONIGHT三个测试用例。
当检测到supervisor从终端返回的执行完毕状态后,模拟器将打印出各种统计信息,包括Cache命中率,分支预测命中率等,这些数据可为量化研究提供依据。
如下为程序运行结果的一个实例:
WARNING! unknown writing operation to UART.
Boot message:MONITOR for MIPS32 - initialized.
User program written
Program Readback:
10 80 04 3c 40 80 05 3c 30 00 06 3c 21 30 86 00
05 00 86 10 04 00 a5 24 00 00 82 8c fc ff a2 ac
fb ff 00 10 04 00 84 24 08 00 e0 03 00 00 00 00
Program memory content verified
Data memory content verified
=======
Clks: 9831244
Secs: 0.0983124
=======
-------clk: 10355664
DCache
Cache dump:
Hit: 787564
Miss: 786509
Writeback: 327765
P(h) = 0.500335
ICache
Cache dump:
Hit: 4723960
Miss: 8
Writeback: 0
P(h) = 0.999998
==================
BPU dump:
JR
JR Hit:292
JR Miss:2
JR P(h):0.993197
BCC
BCC Hit:1573105
BCC Miss:285
BCC P(h):0.999819
sb_hit =0 sb_miss=393219
若要使用自动调参功能,请手动修改cpu.cc,找到main() 函数中的如下函数调用:
函数 | 功能 |
---|---|
optimise_icache() | 优化ICache参数(P_WAYS、P_SETS、P_LINE) |
optimise_dcache() | 优化DCache参数(P_WAYS、P_SETS、P_LINE) |
取消cpu.cc中相应注释,重新编译运行,开始自动调参。
读取输出结果。输出报告中P_WAYS、P_SETS和P_LINE的数值解释如下:
(1<<P_WAYS)路、(1<<P_SETS)行、每行(1<<P_LINE)字节。
目前我们选取CPU运行三个测试用例所需时钟数之和作为目标函数。
ICache参数搜索边界:
参数 | 最小值 | 最大值 | 步进 |
---|---|---|---|
P_WAYS | 1 | 4 | 1 |
P_SETS | 1 | 13 | 1 |
P_LINE | 1 | 13 | 1 |
DCache 参数搜索边界:
参数 | 最小值 | 最大值 | 步进 |
---|---|---|---|
P_WAYS | 1 | 7 | 1 |
P_SETS | 1 | 20 | 1 |
P_LINE | 1 | 20 | 1 |
在BRAM资源占用和调参程序运行时间可接受的情况下,您可以可适当增大搜索边界的范围,以期寻到更优解。
自动调参只在有限的测试用例(STREAM、MATRIX和)中进行,只能确保这三个测试用例取得优化解。
请参考cpu.cc中cpu_clk()函数中”Set breakpoints here...“部分代码。
为了尽可能提升主频,在MUL
指令后设置了RAW延迟槽,也就是说MUL
指令后的第一条指令不能存在相对于MUL
结果的RAW相关,否则相关操作数取到的是MUL
之前的值。
类似于控制转移指令的延迟槽,如果MUL
存在上述情况,需要用其它合适的指令填充延迟槽。若找不到合适的指令,请使用nop填充。
实现MIPS isa32指令集的一个子集:
ADDIU
001001ssssstttttiiiiiiiiiiiiiiiiADDU
000000ssssstttttddddd00000100001AND
000000ssssstttttddddd00000100100ANDI
001100ssssstttttiiiiiiiiiiiiiiiiBEQ
000100ssssstttttooooooooooooooooBGTZ
000111sssss00000ooooooooooooooooBNE
000101ssssstttttooooooooooooooooJ
000010iiiiiiiiiiiiiiiiiiiiiiiiiiJAL
000011iiiiiiiiiiiiiiiiiiiiiiiiiiJR
000000sssss0000000000hhhhh001000LB
100000bbbbbtttttooooooooooooooooLUI
00111100000tttttiiiiiiiiiiiiiiiiLW
100011bbbbbtttttooooooooooooooooMUL
011100ssssstttttddddd00000000010OR
000000ssssstttttddddd00000100101ORI
001101ssssstttttiiiiiiiiiiiiiiiiSB
101000bbbbbtttttooooooooooooooooSLL
00000000000tttttdddddaaaaa000000SRL
00000000000tttttdddddaaaaa000010SW
101011bbbbbtttttooooooooooooooooXOR
000000ssssstttttddddd00000100110XORI
001110ssssstttttiiiiiiiiiiiiiiii
延迟槽,无CP0、HI、LO寄存器,无异常、中断,无TLB
如有疑问,欢迎开issues,或发邮件:[email protected]
-
[1] 即:在给定参数区间内搜索最优解,使得基准程序运行时间之和最小。
-
[2] 请参考清华监控程序supervisor_v2.01简化版 https://github.com/z4yx/supervisor-mips32/tree/simplified
-
[3] 数据来自NSCSCC在线实验平台
- L. Hennessy, David A. Patterson. 计算机体系结构:量化方法(第5版). 机械工业出版社