【发布时间】:2022-01-10 20:23:56
【问题描述】:
我正在尝试使用 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 是每条指令的表存储地址。此外,我可能使用 tag_lht 来存储存储在 LHT 中的每条指令的地址。函数isTaken()可以很方便的得到预测结果。
【问题讨论】:
-
抱歉,细节不够了解。缺少的是这段代码的周围上下文(即整个函数)和数据声明(类型和全局变量),可能还有一两个注释,甚至还有一个解释各种表之间关系的图表。
-
注:
for (int i = 0; i < 1 << HL; i++)-->>for (int i = 0; i < (1 << HL); i++) -
@wildplasser,这可能会提高可读性,但
-
(addr&(1-(1<<HL)));--(addr&((1u<<HL) -1 )); ,假设您打算提取低位作为标签。
标签: cpu-architecture branch-prediction