这是一个同时支持串行和并行的 RISCV 模拟器。
默认为并行,将 main.cpp 中的 Pararrel 修改为 Serial 即可变为串行。
update time: 2019.7.4
实现了串行处理的功能,即一个命令执行后再执行下一个命令。
利用的是分 stage 执行,即每个 stage 封装一个 class,每次执行 go() 以及 pass() 来执行过程和传递结果。
在调试的过程中,发现了如下问题:
- 寄存器中0的值不能被改变,且访问时始终返回0;
- 最后返回的是寄存器中的值,而不是内存的值。
update time: 2019.7.8
因为某些原因写了一个分指令类型的串行程序,效率并没有想象中的好,于是扔掉了…
update time: 2019.7.5
实现了并行处理的功能,即在可能出现 data hazard 和 control hazard 的时候,全部利用 lock() 对相应寄存器进行暂时锁定,以解决问题。
因为运行过于缓慢,此版本完成后转而写 v1.1 版本。
update time: 2019.7.8
v1.1 版本运行仍然缓慢,于是发现开 -O2 之后会快很多,因此将 v2.0 版本进行了 O2 优化。
update time: 2019.7.8
利用 Forwarding 处理了 Data Hazard,即增加 MA -> EX, EX -> ID, MA -> ID 的信息传输路线。
具体可见 forward.hpp 中的三个 Forward 函数。
update time: 2019.7.9
进行了小优化,对于JAL指令不再进行lock等待而直接跳转。
update time: 2019.7.9
一个错误的版本,忽略…
update time: 2019.7.9
加入了分支预测,对于每个指令记录下前面若干次访问的结果,从而预测是跳转还是不跳转,预测失败需要清空前面指令的信息。
该版本分支预测全部跳转。
update time: 2019.7.9
该版本分支预测为采取前面所有指令的两种结果取 max 的一个结果。
update time: 2019.7.9
该版本分支预测为采取前 10 条指令的两种结果取 max 的一个结果。
update time: 2019.7.10
对于一部分分支预测进行了加权。目前结果为:(仅摘取部分分支预测工作量大的数据):
- basicopt1:128895 / 155139 Accuracy 83.0836%
- bulgarian: 57500 / 71493 Accuracy: 80.4275%
- hanoi: 12839 / 17457 Accuracy: 73.5464%
- magic: 40873 / 67869 Accuracy: 60.2234%
- pi: 32374472 / 39956380 Accuracy: 81.0245%
- qsort: 165102 / 200045 Accuracy: 82.5234%
- queens: 53405 / 77116 Accuracy: 69.2528%
- superloop: 376805 / 435027 Accuracy: 86.6165%
- tak: 42972 / 60639 Accuracy: 70.8653%
update time: 2019.7.10
加入搜索循环节来分支预测
仅搜索长度为2、3且循环超过5次。
- basicopt1:128895 / 155139 Accuracy 84.8633%
- bulgarian: 57500 / 71493 Accuracy: 82.2346%
- hanoi: 12839 / 17457 Accuracy: 73.5464%
- magic: 40873 / 67869 Accuracy: 61.2680%
- pi: 32374472 / 39956380 Accuracy: 81.9294%
- qsort: 165102 / 200045 Accuracy: 88.0802%
- queens: 53405 / 77116 Accuracy: 70.5535%
- superloop: 376805 / 435027 Accuracy: 88.5890%
- tak: 42972 / 60639 Accuracy: 73.9062%
搜索循环节2、3、4、5,参数为5、5、4、4
- basicopt1:128895 / 155139 Accuracy 92.6988%
- bulgarian: 57500 / 71493 Accuracy: 86.7386%
- hanoi: 12839 / 17457 Accuracy: 73.5350%
- magic: 40873 / 67869 Accuracy: 60.6369%
- pi: 32374472 / 39956380 Accuracy: 82.0983%
- qsort: 165102 / 200045 Accuracy: 87.4938%
- queens: 53405 / 77116 Accuracy: 73.3855%
- superloop: 376805 / 435027 Accuracy: 89.9825%
- tak: 42972 / 60639 Accuracy: 74.086%
搜索循环节2、3、4、5、6,参数为6、5、4、4、3
- basicopt1:128895 / 155139 Accuracy 92.6982%
- bulgarian: 57500 / 71493 Accuracy: 85.2629%
- hanoi: 12839 / 17457 Accuracy: 96.9181%
- magic: 40873 / 67869 Accuracy: 60.6801%
- pi: 32374472 / 39956380 Accuracy: 81.1564%
- qsort: 165102 / 200045 Accuracy: 87.7573%
- queens: 53405 / 77116 Accuracy: 75.0817%
- superloop: 376805 / 435027 Accuracy: 90.5845%
- tak: 42972 / 60639 Accuracy: 74.2311%
针对 v5.4.2 中 PI 的 TLE 进行了改进。
-
对于 50,000 次以内的预测,搜索长度为 2,3,4,5,6 的循环节
-
对于 500,000 次以内的预测,搜索长度为2,3,4,5的循环节
-
其余搜索长度为2,3的循环节。
(参数分别为 6,5,4,4,3)
- basicopt1:128895 / 155139 Accuracy 92.6982%
- bulgarian: 57500 / 71493 Accuracy: 85.2629%
- hanoi: 12839 / 17457 Accuracy: 96.9181%
- magic: 40873 / 67869 Accuracy: 60.6801%
- pi: 32374472 / 39956380 Accuracy: 81.1499%
- qsort: 165102 / 200045 Accuracy: 87.7573%
- queens: 53405 / 77116 Accuracy: 75.0817%
- superloop: 376805 / 435027 Accuracy: 90.5845%
- tak: 42972 / 60639 Accuracy: 74.2311%