2014-09-03 69 views

回答

5

某处在处理器内部。究竟做什么取决于处理器。

在一个非常简单的情况下,您可能需要4096位的分支预测数据。然后,对于每个分支,都采用分支地址的最后12位,从而得到4096个不同的值,并将其作为分支预测数据的索引。由于您只有一个数据位,因此您只需存储最后一个分支是否被占用。

优点是它非常便宜。缺点是两个分支完全相距4096字节使用表中的相同条目。因此,如果您的代码始终执行这两个分支,并且一个总是被采用而另一个从未被采用,则分支预测相当糟糕。

某些处理器每个分支使用两位意思是“强烈采取”,“采取”,“未采取”,“强烈未采取”。每次分支采取预测走向“强大”,如果分支不采取它走向“强不采取”。如果分支通常是罕见的例外,这会更好。

一些处理器不仅仅使用分支地址的最后12位或更多位,但它们混合在一起,不管是否说最后四个分支都被占用了。假设你有代码

if (x >= 0) { ... } 
if (x <= 0) { ... } 

x很少是0,但是非常随机的正面或负面。那么第一个分支很难预测,但第二个分支在第一个分支被采用后从未被采用,并且如果第一个分支未被采用则总是被采用。通过混合这些信息,可以在分支预测表中为第二个分支使用两个条目,但即使分支是随机采集或不采集,第二个分支的预测也是非常准确的。

您总是会遇到问题:分支预测表中的相同条目将用于多个分支;你只是住在那。 (做任何聪明的事情都需要太多的存储空间,我们每分支预测使用1或2位,所以我们可以拥有很少的存储空间的大型表)。

+0

我想知道为什么他们不把它粘在代码本身的操作码中的一些未使用的位中。猜测这将是真正的缓慢,因为它必须回到公羊。 – johnnycrash 2014-09-03 17:44:04

+0

@johnnycrash,坚持什么?分支分辨率对于程序中每个分支位置(一个独特的IP/PC)都不是静态的,最好的例子是一个循环分支 - 它只在不再被使用的时候才被采用。一些分支预测器会在不同的历史上下文中为这些分支保存多个条目。另一方面,如果您的意思是在运行时更改这些位,请查看自修改代码并再次考虑。 – Leeor 2014-09-10 19:24:58

+0

@Leeor由于这只是一个提示,所以不会有自我修改的代码问题。 (另外,前端将进行修改。)如果多个程序/线程正在运行代码,则会出现问题,在这种情况下,Icache重新填充可能会根据另一个线程的历史记录进行预测。这也意味着更多的脏缓存块被写回。 – 2014-10-20 21:58:15