采取或不采取的分支序列,降低了分支误预测率

use*_*863 3 branch pipeline mips prediction branch-prediction

增加分支预测表的大小意味着程序中的两个分支不太可能共享共同预测器.预测单个分支指令的单个预测器通常比服务多个分支指令的相同预测器更准确.列出一系列分支采取和未采取的动作,以显示2位预测器共享的简单示例(几个不同的分支指令被映射到预测表的相同条目中​​),与情况相比,降低了分支误预测率其中单独的预测变量条目用于每个分支.(注意:请务必显示两个不同分支指令的结果,并明确指出这些结果的顺序以及它们对应的分支)

有人可以向我解释一下这个问题具体要求吗?此外,"2位预测器共享(几个不同的分支指令被映射到预测表的相同条目)"和"每个分支使用单独的预测器条目"是什么意思?我一直在阅读和重读我的笔记,但我无法理解.我试图在网上找到一些分支预测示例但是没有遇到任何问题.

Jer*_*fin 5

"2位预测器"可以指两种情况中的任何一种,但更可能是指另一种情况.

不太可能的是,它们意味着只有四个条目的分支表,因此使用两个位将特定分支与表中的条目相关联.这不太可能,因为4条目表太小,以至于许多分支将共享相同的表条目,因此分支预测器不会比静态分支预测准确得多(例如,总是预测后向分支,因为它们'通常用于形成循环).

更可能的是使用两个比特来指示是否可能采用分支.包括分支预测在内的一些最早的微处理器(例如,Pentium,PowerPC 604)大致以这种方式工作.基本思想是保留一个两位饱和计数器,并根据其当前状态进行预测.英特尔称这些州强烈没有被采取,弱被采取,弱采取,强烈采取.这些将被编号为(例如)0,1,2和3,因此您可以使用两位计数器来跟踪状态.每次进行分支时,你都会增加数字(除非它已经是3),并且每次不进行分数时,你减去它(再次,除非它已经是0).当你需要预测一个分支,如果计数器是0或1你预测分支没有采取,如果它'.

用于每个分支的单独预测器条目意味着程序中的每个分支指令在分支预测表中具有其自己的条目.另一种选择是从分支指令到表条目的某种映射.例如,如果您有一个包含2 20个条目的表,则可以使用分支指令地址中的20位,并将这些位用作表中的索引.假设一台具有32位寻址和32位指令,你必须高达1024个分支指令可以映射到表中的任何一个条目(32-20-2 = 10,2 10 = 1024).实际上,您只希望一小部分指令是分支,一些地址空间用于数据等,因此可能只有少数分支映射到表中的一个条目.

至于它所要求的基本问题:他们想要一个分支指令序列,当两个分支映射到分支预测器表中的相同时隙时,将更准确地预测(通过什么重合)比当/如果每个映射到表中的一个单独的插槽.稍微详细一点(但希望不会泄露整个难题),从分支模式开始,分支预测器通常是错误的.预测器基本上做的是假设如果分支是最后一次,这表明这次更有可能被采取(相反,如果不是最后一次采取,那么可能不会是这次).

所以,你从一个完全相反的分支模式开始.然后,您希望将第二个分支映射添加到分支预测表中的相同位置,该分支预测表将遵循将调整分支预测变量表中的数据的分支模式,以便它更准确地反映即将到来的分支而不是前一个分支.


1从技术上讲,奔腾实际上并没有以这种方式工作,但它是如何记录工作的,并且可能是为了工作; 它实际上如何工作的差异似乎是一个错误.

  • 这称为*构造性混叠*(对比破坏性混叠,其中多个分支映射到同一预测器条目会增加误预测率)。2 位预测器增加了一点迟滞,减少了破坏性混叠(不太常见的反向偏向分支不太可能翻转预测)并使建设性混叠更有帮助(可以更快地克服迟滞)。 (2认同)