这是Agner Fog's microarchitecture paper(第 15 页)中简要描述的具有全局历史表的两级自适应预测器的变体。
在这个变体中,历史寄存器在所有分支之间共享,但是模式历史表是分支本地的1。
最后n(n = 2,在你的情况下)分支的结果被记住(0 = 未采用,1 = 采用),按时间顺序从左到右排序,形成一个n 位的值,与分支地址2 一起用于索引 2 位饱和计数器表。
如果采用分支,则每个计数器都会递增,否则会递减(这是规范的实现,任何 4 状态 FSA 都可以)。
每个计数器值的含义是:
00b (0) Strongly not taken
01b (1) Weakly not taken
10b (2) Weakly taken
11b (3) Strongly taken
饱和意味着比 3+1(再次采用强烈采用的分支)= 3 和 0-1(再次不采用强烈未采用的分支)= 0,而通常寄存器上的算术是模 2n 。
在你的练习中,假设是:
- 模式历史表以二维表的形式给出,其中行对应于分支的完整地址,列对应于全局历史寄存器的值。
- 所有计数器都以状态 01b 开始(弱未采用)。
- 全局历史寄存器在复位时为 00b。
-
R1 开头为 0。
我们只看第一次迭代。
第一次迭代
指令是BEQZ R1, D(显然是一个分支),它的地址是A。
由于R1 为0,分支将被采用(朝向D)。
对具有 00b 全局历史和地址 A 的表进行索引为我们提供了计数器值 01b(弱未采用),因此预测未采用。
一旦 CPU 执行了分支并刷新了错误预测的阶段,就必须更新表。
由于采用了分支,计数器从 01b 递增到 10b。
最后,全局历史从 00b 变为 01b,因为分支被采用(从右侧移入 1)。
请注意,黄色突出显示的条目是在执行相应指令时读取的条目,而绿色突出显示的条目是由先前预测更新的条目。
因此,要查看计数器值已增加,您必须查看下一行。
由于采用了分支,CPU 位于D (BEQZ R1, F),这和之前完全一样,只是全局历史寄存器的值是 01b。
这条指令执行后CPU在F,所以R1变成了111..11b(解决方法只是表示为1),重新执行以上两个分支。
1这是一种简化,表几乎总是一个缓存。对于可以找到分支的每个可能的内存地址的条目,这是不切实际的。
2部分地址用作缓存中的索引,一旦选择了一个集合,该地址再次与该集合的每一路的标签进行比较。