“2 位预测器”可能指的是两件事中的任何一件,但更可能是一件。
不太可能的可能性是它们意味着一个只有四个条目的分支表,因此使用两位将特定分支与表中的条目相关联。这不太可能,因为 4 条目表非常小,以至于许多分支将共享相同的表条目,因此分支预测器不会比静态分支预测更准确(例如,总是预测反向分支,因为它们' re 通常用于形成循环)。
更相似的可能性是使用两位来指示是否可能采用分支。包括分支预测在内的一些最早的微处理器(例如 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从技术上讲,Pentium 实际上并没有以这种方式工作,但它是被记录的工作方式,并且可能打算工作;它实际工作方式的差异似乎是一个错误。