我有与相关预测因子相关的练习,其中说明了以下内容:
A:BEQZ R1,D
...
D:BEQZ R1,F
...
F:不是R1,R1
G:JUMP A
预测的工作如下:
获取当前指令
如果是分支,则确定预测变量的当前状态并预测分支:
a.row由分支地址(在这种情况下为A或D)确定
b.column由当前的全球移位寄存器确定
c。使用单元格中的值来确定状态机的预测(当前状态保存在单元格中)
执行分支,并确定实际决策 (拍摄:1,未拍摄:0):
根据当前状态和更新来更新单元格
实际决定
b.更新全局移位寄存器(向左移位并将实际决策位添加到右侧)
转到第1步
这是解决方案 Solved exercise
我理解这个方案并且知道2位预测器意味着更少的错误,但是我无法解决这个问题而且我很难找到解决方案是如何找到的,任何帮助都会受到赞赏。
答案 0 :(得分:1)
这是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而通常对寄存器的算术是模2 n 。
在练习中,假设是:
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 部分地址用作缓存中的索引,一旦选择了一个集合,地址将再次与集合中每个方式的标记进行比较。