OracleBP简介
在处理器性能探索过程中,前端分支预测单元目前较低的分支预测准确率可能会掩盖后续执行单元的一些性能优化点,为便于后端在前端当前RTL实现不够满意的场景进行性能探索,我们为香山提供了OracleBP
分支预测器,利用模拟器先于硬件执行程序获取到的分支指令信息指导分支预测器产生高精度的预测结果,从而提升前端指令供应能力。
该工具最新版本利用Run Ahead机制实现,允许模拟器在RTL运行时动态同步影响控制流的外部信息,从而解决了基于静态trace的OracleBP
因RTL仿真中存在的不可预测MMIO
访问或中断与trace失去匹配的问题。
使用
NEMU
提供了riscv64-xs-ahead-ref_defconfig
配置,使用该配置可生成用于指导OracleBP
的run ahead版NEMU
动态链接库。
在香山带有OracleBP
支持的源码中编译生成emu
后,运行emu
前,需设置AHEAD_HOME
环境变量,将其指向run ahead版NEMU
目录:
export AHEAD_HOME=/PATH/TO/AHEAD_NEMU
注意
为正确使用difftest
,运行时需将NEMU_HOME
环境变量指向正常版本的NEMU
目录而非run ahead版本目录。
运行效果验证
通常,OracleBP
不会产生任何可见的输出。用户可通过检查OracleBP
开启前后程序运行结束后性能计数器读数(例如BpInstr
及BpWrong
)检验预测器工作效果。
实现细节
LightQS
OracleBP
的运行需要允许模拟器在运行时回滚并同步状态,为实现模拟器的快速状态恢复,我们为NEMU
模拟器添加了轻量级快照功能,允许模拟器恢复自身状态到快照点到当前区间内任意一点。
为实现状态恢复,我们在指定的快照点(记为X
)记录当前通用寄存器、CSR、MMU及外设(可选)状态,在快照点之后运行时记录所有store操作所操作内存原始值。在需要恢复状态到X+n
时,我们首先将模拟器状态恢复到X
:恢复通用寄存器、CSR、MMU及外设到快照记录状态,反向遍历快照点至今的各内存操作并根据记录反向操作以将内存恢复到X
状态。恢复到X
后,令模拟器重新向前执行n
步,即让模拟器恢复到X+n
状态。
初始化
在difftest
框架初始化时,若开启了OracleBP
,框架将会以与加载difftest
用NEMU动态链接库(后续记为A
)相似的方式加载OracleBP
所依赖的NEMU
动态链接库(后续记为B
),与difftest
不同的是,其会在第一条指令提交前,将NEMU
的状态保持在执行了一定量指令的位置,从而能够为预测器提供分支指令执行结果信息。此外,B
为保证可恢复到初始状态,将会在完成初始化后准备一初始快照。
指令提交
在difftest
框架检测到RTL指令提交时,根据是否skip
,其会要求A
同步RTL的状态或同样执行一步并比较执行结果。相似地,B
在这一场景同样会根据skip
与否向软件同步RTL状态或向前执行一步以保持其执行状态的领先。为实现skip
有效时RTL状态的同步,B
需要首先利用LightQS
进行状态恢复,将其状态恢复到RTL执行该skip
指令之前,同步状态后继续向后执行一定量指令以继续保持其执行信息的领先。在同步完成后,为保证同步的状态信息不会被后续恢复冲刷,将会在此时设置一快照点。为保证处理器RTL与模拟器指令总计数一致,skip
处理函数将在状态同步完毕后增加B的指令执行计数。
数据传输
B对外暴露一个分支trace记录数组,RTL中的OracleBP
可通过以自身记录的分支指令计数为下标访问这一数组获取到未来部分分支指令的地址、类型、跳转方向、跳转目标信息。在未来的指令信息与当前所需预测的FTB
项内分支指令信息匹配时,Oracle
预测器就可以纠正其他预测器作出的不正确预测。
预测器分支指令计数维护
如前所述,OracleBP
需要维护当前执行过的分支指令计数来获取到近期执行的分支指令数据。该维护机制被划分为推测与非推测两部分。
在分支预测器内部,OracleBP
会根据当前命中的分支指令在分支记录中的偏移量,推测地维护当前执行到的分支指令计数。但由于分支预测可能处于错误路径,还需要非推测路径在必要时更正计数。
在管理指令生命周期的FTQ
模块,会根据取指识别到的分支指令类型及指令提交信息,维护非推测的分支指令计数,在触发重定向时,非推测的分支指令计数将随redirect
通路返回给分支预测单元,从而更新正确的分支指令计数。