2012-04-15 36 views
0

我正在研究计算机体系结构类中的分配,我们必须在C++中实现分支预测算法(用于Alpha 21264微处理器体系结构)。分支预测 - 全局共享实现说明

有一个解决方案作为example提供。该解决方案是一个Global Share Predictor的实现。

我只是想了解给定的解决方案,具体是什么,是怎么回事:

*predict (branch_info &b) {...} 

具体而言,

if (b.br_flags & BR_CONDITIONAL) {...} 

谁能为我提供一个解释?谢谢。

回答

5

我认为斯科特McFarling以下文件提供了详细的解答:

http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-TN-36.pdf

让我用你的代码来解释。

unsigned char tab[1<<TABLE_BITS]; 

模式历史表。选项卡中的每个条目都保留一个2位饱和计数器。条件分支的方向最终由计数器的MSB确定:

u.direction_prediction (tab[u.index] >> 1); 

为什么我们使用两个或多个位,而不只是一个位的计数器的原因是为了使图案,以减少错误预测较不敏感。例如,

for(int i = 0; i < m; i++) 
{ 
    for(int j = 0; j < n; j++) 
    { 
     ... 
    } 
} 

当内循环的下一次执行时,一个比特计数器将误预测分支而2位计数器,可以防止它。

接下来是如何在模式历史记录表中找到正确的模式。

天真的方法是使用分支地址作为索引。但它忽略了不同分支之间的相关性。这就是为什么全球分支机构历史记录介绍(更多详情请参阅http://www.eecg.utoronto.ca/~moshovos/ACA06/readings/two-level-bpred.pdf)。

在你的代码,

unsigned int history; 

分支历史寄存器存储的全局分支历史。

然后一些人发现,结合全局分支历史分公司地址为指标可能会导致更准确的预测比只用其中的一个。原因是全局分支历史和分支地址都会影响分支模式。 如果忽略其中的一个,可能会将不同分支模式散列到模式历史记录表的相同位置,从而导致碰撞问题。

在提议Gshare之前,有一种称为Gselect的解决方案,它使用全局分支历史和分支地址的串联作为模式历史表的索引。

由Gshare提供的解决方案是

index = branch_addr XOR branch_history 

哈希函数这是什么下面的代码的意思是:

u.index = (history << (TABLE_BITS - HISTORY_LENGTH))^(b.address & ((1<<TABLE_BITS)-1)); 

斯科特McFarling的论文提供了一个很好的例子,说明如何Gshare作品优于Gselect:

  1. Branch Address = 1111_1111 Global Branch History = 0000_0000
  2. 分公司地址= 1111_1111全局分支历史= 1000_0000

假设我们用下面的G选择策略,以防止偏差:

index = { {branch_addr[7:4]}, {branch_history[3:0]} } 

然后G选择会产生两种情况1111_0000而Gshare可以区分不同的模式。

据我所知,Gshare证明是迄今为止解决碰撞的最佳解决方案。