File tree Expand file tree Collapse file tree 4 files changed +9
-8
lines changed
Expand file tree Collapse file tree 4 files changed +9
-8
lines changed Original file line number Diff line number Diff line change @@ -23,7 +23,7 @@ TAGE 作为一种混合式预测器,其优势在于可以同时根据不同长
2323
2424### TAGE:硬件实现
2525
26- TAGE 是高精度条件分支方向预测器。使用不同长度的分支历史和当前 PC 值寻址多个 SRAM 表,当在多个表中出现命中时,优先选择最 命中的历史长度最长的对应表项的预测结果作为最终结果 。
26+ TAGE 是高精度条件分支方向预测器。使用不同长度的分支历史和当前 PC 值寻址多个 SRAM 表,当在多个表中出现命中时,优先选择命中的历史长度最长的对应表项的预测结果作为最终结果 。
2727
2828![ TAGE 原理] ( ../figure/BPU/TAGE-SC/principle.png )
2929
Original file line number Diff line number Diff line change @@ -149,7 +149,7 @@ TAGE 由一个基预测表和多个历史表组成,基预测表用 PC 索引
149149
150150##### TAGE 预测时序
151151
152- TAGE 是高精度条件分支方向预测器。使用不同长度的分支历史和当前 PC 值寻址多个 SRAM 表,当在多个表中出现命中时,优先选择最 命中的历史长度最长的对应表项的预测结果作为最终结果 。
152+ TAGE 是高精度条件分支方向预测器。使用不同长度的分支历史和当前 PC 值寻址多个 SRAM 表,当在多个表中出现命中时,优先选择命中的历史长度最长的对应表项的预测结果作为最终结果 。
153153
154154TAGE 需要 2 拍延迟:
155155
Original file line number Diff line number Diff line change 4747
4848#### 特性 1:Jal 指令预测错误检查
4949
50- jal 指令预测错误的条件是,预测块中有一条 jal 指令(由预译码信息给出),但是要么这个预测块没有预测跳转,要么找个预测块预测跳转的指令在这条 jal 指令之后(即这条 jal 指令没有被预测跳转)。
50+ jal 指令预测错误的条件是,预测块中有一条 jal 指令(由预译码信息给出),但是要么这个预测块没有预测跳转,要么这个预测块预测跳转的指令在这条 jal 指令之后(即这条 jal 指令没有被预测跳转)。
5151
5252#### 特性 2:Ret 指令预测错误检查
5353
54- ret 指令预测错误的条件是,预测块中有一条 ret 指令(由预译码信息给出),但是要么这个预测块没有预测跳转,要么找个预测块预测跳转的指令在这条 ret 指令之后(即这条 ret 指令没有被预测跳转)。
54+ ret 指令预测错误的条件是,预测块中有一条 ret 指令(由预译码信息给出),但是要么这个预测块没有预测跳转,要么这个预测块预测跳转的指令在这条 ret 指令之后(即这条 ret 指令没有被预测跳转)。
5555
5656#### 特性 6:重新生成指令有效范围向量
5757
58- PredChecker 在检查出 Jal/Ret 指令预测错误时,需要重新生成指令有效范围向量,有效范围截取到 Jal/Ret 指令的位置,之后的 bit 全部置为 0。需要注意的是,jal 和 ret 指令的错误检查都会导致指令有效范围的缩短,所以需要重新生成指令有效范伟 fixedRange,同时修复预测结果(即将原来的预测结果取消,把找个指令块的预测结果根据 jal 指令的位置重新生成)
58+ PredChecker 在检查出 Jal/Ret 指令预测错误时,需要重新生成指令有效范围向量,有效范围截取到 Jal/Ret 指令的位置,之后的 bit 全部置为 0。需要注意的是,jal 和 ret 指令的错误检查都会导致指令有效范围的缩短,所以需要重新生成指令有效范伟 fixedRange,同时修复预测结果(即将原来的预测结果取消,把这个指令块的预测结果根据 jal 指令的位置重新生成)
5959
6060#### 特性 3:非 CFI 预测错误检查
6161
Original file line number Diff line number Diff line change @@ -77,10 +77,11 @@ IFU 在收到 BPU 发送的冲刷请求时,会将 F0、F1 流水级上取指
7777
7878### 分支预测错误提前检查
7979
80- 为了减少一些比较容易识别的分支预测错误的冲刷,IFU 在 F3 流水级使用 F2 产生的预译码信息做前端的分支预测错误检查。预译码信息首先送到 PredChecker 模块,根据其中的 CFI 指令类型检查 jal 类型错误、ret 类型错误、无效指令预测错误、非 CFI 指令预测错误,同时根据指令码计算 16 个转移目标地址,和预测的目标地址进行比对,检查转移目标地址错误,PredChecker 将纠正 jal 类型错误 ret 错误的预测结果,并重新产生指令有效范围向量 fixedRange(为 1 表示该条指令在预测块内),fixedRange 在 jump_range 和 ftr_range 的基础上根据 jal 和 ret 的检查结果,把范围缩小到其实地址到没有检测出来的 jal 或者 ret 指令。下面是 PredChecker 模块对分支预测检查的错误类型:
80+ 为了减少一些比较容易识别的分支预测错误的冲刷,IFU 在 F3 流水级使用 F2 产生的预译码信息做前端的分支预测错误检查。预译码信息首先送到 PredChecker 模块,根据其中的 CFI 指令类型检查 jal 类型错误、ret 类型错误、无效指令预测错误、非 CFI 指令预测错误,同时根据指令码计算 16 个转移目标地址,和预测的目标地址进行比对,检查转移目标地址错误,PredChecker 将纠正 jal 类型错误 、 ret 错误的预测结果以及 jalr 错误的预测结果,并重新产生指令有效范围向量 fixedRange(为 1 表示该条指令在预测块内),fixedRange 在 jump_range 和 ftr_range 的基础上根据 jal 和 ret 的检查结果,把范围缩小到起始地址到没有检测出来的 jal 或者 ret 指令。下面是 PredChecker 模块对分支预测检查的错误类型:
8181
82- - jal 类型错误:预测块的范围内有 jal 指令,但是预测器没有对这条指令预测跳转;
83- - ret 类型错误:预测块的范围内有 ret 指令,但是预测器没有对这条指令预测跳转;
82+ - jal 类型错误:预测块的范围内有 jal 指令,但是预测器没有对这条指令预测跳转或预测块预测跳转位置在其之后;
83+ - jalr 类型错误:预测块的范围内有 jalr 指令,但是预测器没有对这条指令预测跳转或预测块预测跳转位置在其之后;
84+ - ret 类型错误:预测块的范围内有 ret 指令,但是预测器没有对这条指令预测跳转或预测块预测跳转位置在其之后;
8485- 无效指令预测错误:预测器对一条无效的指令(不在预测块范围/是一条 32 位指令中间)进行了预测;
8586- 非 CFI 指令预测错误:预测器对一条有效但是不是 CFI 的指令进行了预测;
8687- 转移目标地址错误:预测器给出的转移目标地址不正确。
You can’t perform that action at this time.
0 commit comments