我试图使用runspec测试我的本地分支预测器,但只发现了一个令人失望的结果。到目前为止,我已经尝试过使用64项LHT,当LHT满了时,我会使用FIFO策略来替换LHT中的一项。我不知道我是使用了一个很小的LHT,还是我不正确的替换策略使它变得非常精确,不管怎样,它只有60.9095。
for (int i = 0; i < 1 << HL; i++)
{
if (tag_lht[i] == (addr&(1-(1<<HL))))
{
addr = addr ^ LHT[i].getVal();
goto here;
break;
}
}
index_lht = index_lht%(1<<HL);
tag_lht[index_lht] = (addr&(1-(1<<HL)));
LHT[index_lht] = ShiftReg<2>();
addr = addr ^ LHT[index_lht].getVal();
index_lht++;
here:
for (int i = 0; i < 1 << L; i++)
{
if (tag[i] == (addr))
{
return bhist[i].isTaken();
}
}
index = index % (1 << L);
tag[index] = (addr);
bhist[index].reset();
return bhist[index++].isTaken();
在这里我对代码做一些解释。bhist是一个表,存储每个分支指令的2位状态。当表满时,使用FIFO替换策略。标签是表存储每条指令地址的位置。此外,我可能使用tag_lht来存储lht中存储的每条指令的地址。函数isTaken((可以很容易地得到预测结果。
谢谢大家,我发现我犯了那个愚蠢的错误,上面的代码是正确的,但可能看起来不完美。错误如下:
for (int i = 0; i < (1 << L); i++)
{
if (tag[i] == (addr))
{
if (takenActually)
{
LHT[j].shiftIn(1);
bhist[i].increase();
}
else
{
LHT[j].shiftIn(0);
bhist[i].decrease();
}
}
break;
}
但应该是这样的:
对于(int i=0;i<(1<<L(;i++({
if (tag[i] == (addr))
{
if (takenActually)
{
LHT[j].shiftIn(1);
bhist[i].increase();
}
else
{
LHT[j].shiftIn(0);
bhist[i].decrease();
}
break;
}
}
我太愚蠢了,我浪费了你们这些乐于助人的时间,我花了很多时间来弄清楚为什么它不起作用,起初我认为使用了错误的变量或论点,现在我只是觉得我是一个粗心的人。我再次感谢你们所有热心的人。然后我将用我的完整代码回答这个问题。PS。希望我糟糕的英语没有让任何人感到困惑