Skip to content

Vexoben/RISC-V-Simulator-2022

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

用C++实现的一个RISC-V模拟器

  • sequential:顺序执行

  • tomasulo:tomasulo算法,尝试了分支预测

分支预测的正确率

由于 JAL 指令和 JALR 指令是永远预测正确和永远预测错误,不计入正确率的计算。这里只统计所有的 branch 类型指令

预测永远跳转(main.cpp)

测试点 总预测数 预测正确数 预测正确率 总时钟周期
array_test1 22 10 0.454545 285
array_test2 26 13 0.5 315
basicopt1 155139 63642 0.410226 1068921
bulgarian 71493 35289 0.493601 990137
expr 111 69 0.621622 879
gcd 120 45 0.375 893
hanoi 17457 8732 0.5002 231053
lvalue2 6 2 0.333333 80
magic 67869 31801 0.468564 783950
manyarguments 10 2 0.2 108
multiarray 162 132 0.814815 2124
naive 0 0 / 34
pi 39956380 23066734 0.577298 207718315
qsort 200045 140018 0.699933 1722449
queens 77116 28362 0.367784 849598
statement_test 202 82 0.405941 1754
superloop 435027 55272 0.127054 2085385
tak 60639 15160 0.250004 2137393

二位饱和计数器1(Two-bit_1.cpp)

初始所有的都是强不跳转,取指令的后12位寻址

测试点 总预测数 预测正确数 预测正确率 总时钟周期
array_test1 22 13 0.590909 290
array_test2 26 16 0.615385 317
basicopt1 155139 124121 0.800063 962646
bulgarian 71493 66218 0.926217 422274
expr 111 94 0.846847 805
gcd 120 82 0.683333 830
hanoi 17457 10791 0.618147 222831
lvalue2 6 4 0.666667 81
magic 67869 51597 0.760244 697499
manyarguments 10 8 0.8 94
multiarray 162 134 0.82716 2103
naive 0 0 / 34
pi 39956380 32773103 0.820222 169051727
qsort 200045 176402 0.881812 1528621
queens 77116 53464 0.693293 730904
statement_test 202 136 0.673267 1640
superloop 435027 399334 0.917952 1348670
tak 60639 44754 0.73804 2057794

二位饱和计数器2(Two-bit_2.cpp)

冷静分析一下,发现如果取最后12位,所有branch语句的后7位都是相同的,跳转pc的长度由于是4的倍数,所以还有一位永远是0,最后12位其实只有4位有用,冲突率肉眼可见的高。

分(hu)析(zhou)了一下之后取了[22:20],[17:9]

另外把计数器的初始状态改成了弱不跳转。

(于是成功拉低了前两个点的正确率)

测试点 总预测数 预测正确数 预测正确率 总时钟周期
array_test1 22 12 0.545455 287
array_test2 26 15 0.576923 323
basicopt1 155139 127840 0.824035 964592
bulgarian 71493 67527 0.944526 415445
expr 111 94 0.846847 795
gcd 120 81 0.675 825
hanoi 17457 10667 0.611044 222808
lvalue2 6 4 0.666667 81
magic 67869 53220 0.784158 686037
manyarguments 10 6 0.6 101
multiarray 162 135 0.833333 2087
naive 0 0 / 34
pi 39956380 32925342 0.824032 172694481
qsort 200045 174888 0.874243 1529793
queens 77116 53393 0.692373 731626
statement_test 202 123 0.608911 1709
superloop 435027 408156 0.938231 955290
tak 60639 44755 0.738056 2057790

二级自适应预测器(Adaptive-two-level.cpp)

总预测数较大的时候相对于二位饱和计数器有明显提升

正确率根据初始状态的设置略有差异,但对于比较大的测试点基本稳定

测试点 总预测数 预测正确数 预测正确率 总时钟周期
array_test1 22 12 0.545455 296
array_test2 26 13 0.5 341
basicopt1 155139 136541 0.88012 918145
bulgarian 71493 67410 0.94289 416025
expr 111 85 0.765766 851
gcd 120 73 0.608333 884
hanoi 17457 15097 0.864811 199128
lvalue2 6 4 0.666667 81
magic 67869 55508 0.81787 674091
manyarguments 10 8 0.8 94
multiarray 162 107 0.660494 2224
naive 0 0 / 34
pi 39956380 33311012 0.833684 170892766
qsort 200045 183338 0.916484 1492524
queens 73721 53694 0.728341 683265
statement_test 202 134 0.663366 1640
superloop 435027 413764 0.951123 871505
tak 60639 45906 0.757038 2054270

如果只截取预测数大于10000的测试点

测试点 总预测数 预测正确数 预测正确率 总时钟周期
basicopt1 155139 136541 0.88012 918145
bulgarian 71493 67410 0.94289 416025
hanoi 17457 15097 0.864811 199128
magic 67869 55508 0.81787 674091
pi 39956380 33311012 0.833684 170892766
qsort 200045 183338 0.916484 1492524
queens 73721 53694 0.728341 683265
superloop 435027 413764 0.951123 871505
tak 60639 45906 0.757038 2054270

About

The simulator of RISC-V, programmed by c++

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors