TA的每日心情 | 开心 2019-11-4 13:48 |
---|
签到天数: 14 天 连续签到: 1 天 [LV.3]偶尔看看II
|
4 Rocket处理器分支预测机制性能评估
4.1 评估环境
Rocket使用Chisel编写,所以可以很容易得到对应的C++模拟器,本文使用得到的C++模拟器,运行RISC-V提供的benchmark,以测试分支预测性能。默认的Rocket编译后并不会输出分支预测有关的信息,需要在rocket.scala添加如下代码。
- val counter0 = WideCounter(64, mem_reg_valid && !take_pc_wb && mem_ctrl.branch)
- val counter1 = WideCounter(64, mem_reg_valid && !take_pc_wb && mem_ctrl.branch && mem_wrong_npc)
- printf("branch inst number[%x]\n ", counter0)
- printf("misprediction branch inst number[%x]\n ", counter1)
复制代码
上述代码定义了两个计数器,第一个计数器counter0,当访存阶段是分支指令的时候加1,第二个计数器counter1,当访存阶段是分支指令,且分支预测错误的时候加1,所以,上述两个计数器可以分别输出分支指令数、分支预测错误指令数。
4.2 分支预测机制性能评估
BTB的表项数量不同,会影响分支预测的准确率,分别取BTB的表项为40、60、120,其分支预测效果如图6所示。当BTB的表项为默认的40的时候,最差情况为0.815,最好情况为0.991;当BTB的表项为60的时候,最差情况为0.813,最好情况为0.991;当BTB的表项为120的时候,最差情况为0.819,最好情况为0.992。并且,从图6中可以发现对于一个特定的测试程序,当BTB表项增加的时候,其分支预测准确率相对有所提高。
图6 当BTB表项是40、60、120的时候的分支预测效果
在实验过程中发现如果BTB表项数目是2的幂,那么分支预测准确率会急剧下降,如图7所示,分别取BTB表项为32、64、128,与BTB表项为40时的分支预测效果对比。
图7 当BTB表项是40、32、64、128的时候的分支预测效果
原因是由于BTB Module中如下一段代码引起的。
- val nextRepl =
- if (!isPow2(entries)) {
- Counter(r_btb_update.valid && !updateHit, entries)._1 // BTB表项不是2的幂的时候的替换算法
- } else {
- val plru = new PseudoLRU(entries) // BTB表项是2的幂的时候的替换算法
- when (hits.orR) { plru.access(OHToUInt(hits)) }
- plru.replace
- }
复制代码 其中计算nextRepl的值。如果当前更新的分支指令在BTB中没有查询到,那么就从BTB中找出一个表项,用来存储这个新的分支指令,nextRepl计算的就是这个新的表项的序号。如果BTB的表项是2的幂,那么替换算法是伪最近最少使用算法(PseudoLRU),反之,替换算法就是简单地累加。算法的不同,导致最终效果的差异,建议使用的时候可以避免设置BTB表项的值为2的幂。
结语
RISC-V是UCB设计发布的一个开源指令集,Rocket是UCB设计发布的基于RISC-V的开源处理器,其具有分支预测功能,通过分析发现其使用的是GShare分支预测算法,并且具有比较高的分支预测准确率。在试验过程中,发现了Rocket分支预测机制实现的一个问题,即当BTB表项设置为2的幂的时候,分支预测准确率会下降,这一实验结果对于计划实际使用Rocket处理器的研发、使用人员具有一定的参考意义。
作者:leishangwen
来源:CSDN
相关阅读:
开源处理器Rocket的分支预测机制研究与性能评估(一)
开源处理器Rocket的分支预测机制研究与性能评估(二)
开源处理器Rocket的分支预测机制研究与性能评估(三)
|
|