【问题标题】:How to write a local branch predictor?如何编写本地分支预测器?
【发布时间】: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 &lt; 1 &lt;&lt; HL; i++) -->> for (int i = 0; i &lt; (1 &lt;&lt; HL); i++)
  • @wildplasser,这可能会提高可读性,但
  • (addr&amp;(1-(1&lt;&lt;HL))); --(addr&((1u<<HL) -1 )); ,假设您打算提取低位作为标签。

标签: cpu-architecture branch-prediction


【解决方案1】:

谢谢大家,我发现我犯了一个愚蠢的错误,上面的代码是正确的,但可能看起来并不完美。错误如下:

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;
    }

但应该是这样的:

for (int i = 0; i

        if (tag[i] == (addr))
        {
            if (takenActually)
            {
                LHT[j].shiftIn(1);
                bhist[i].increase();
            }
            else
            {
                LHT[j].shiftIn(0);
                bhist[i].decrease();
            }
            break;
        }
    }

我太愚蠢了,浪费了你有用的人的时间,我花了很多时间来弄清楚为什么它不起作用,起初我以为使用了错误的变量或参数,现在我只是觉得我是一个粗心的人。 再次感谢各位热心的小伙伴。然后我将用我的完整代码回答这个问题。 PS。希望我糟糕的英语没有让任何人感到困惑。:)

【讨论】:

    猜你喜欢
    • 2014-04-25
    • 2014-03-03
    • 1970-01-01
    • 2016-07-01
    • 2011-02-01
    • 2015-11-24
    • 2014-07-03
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多