【问题标题】:Where/how is branch prediction data stored?分支预测数据存储在哪里/如何存储?
【发布时间】:2014-10-28 07:28:35
【问题描述】:

我一直想知道预测数据存储在哪里/如何存储?有限制吗?它只是最近的分支吗?我最关心的是英特尔架构,但我可以从任何架构中学到任何东西。

【问题讨论】:

    标签: branch-prediction


    【解决方案1】:

    分支预测器的元数据存储在芯片上,在分支预测器表中。一些研究工作建议将它们存储在缓存层次结构中(称为predictor virtualization),但我认为它尚未在任何真正的处理器中实现。

    由于您表示愿意了解更多信息,请参阅我的survey paper,了解有关多个分支预测器架构的更多详细信息。

    【讨论】:

      【解决方案2】:

      处理器内部的某个地方。具体做什么取决于处理器。

      在一个非常简单的情况下,您可能需要 4096 位的分支预测数据。然后对于每个分支,您获取分支地址的最后 12 位,它给出 4096 个不同的值,并将其作为分支预测数据的索引。而且由于您只有一点数据,您只需存储是否采用了最后一个分支。

      优点是非常便宜。缺点是正好相隔 4096 字节的两个分支使用表中的相同条目。因此,如果您的代码一直在执行这两个分支,并且始终采用一个,而从不采用一个,则分支预测非常糟糕。

      某些处理器每个分支使用两位,表示“强采用”、“采用”、“未采用”、“强未采用”。每次采用分支时,预测都会向“强采用”方向移动,如果未采用分支,则预测会向“强未采用”方向移动。如果分支通常在极少数例外情况下采用,这会更好。

      一些处理器不仅使用分支地址的最后 12 位或更多位,而且还会混合使用最后四个分支是否被采用。假设你有代码

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

      并且 x 很少为 0,而是随机地为正或负。那么第一个分支很难预测,但是在第一个分支被取走之后,第二个分支永远不会被取走,如果第一个分支没有被取走,则总是被取走。通过混合这些信息,您会用完第二个分支的分支预测表中的两个条目,但第二个分支的预测将非常准确,即使该分支是随机采用或不采用的。

      你总是会遇到分支预测表中的同一个条目会被用于多个分支的问题;你只是忍受它。 (做任何聪明的事情来处理这个会占用太多的存储空间。我们使用每个分支预测 1 或 2 位,所以我们可以用很少的存储空间拥有海量表)。

      【讨论】:

      • 我想知道为什么他们不将其粘贴在代码本身的操作码中一些未使用的位中。猜猜这会很慢,因为它必须回到 ram。
      • @johnnycrash,坚持什么?每个程序中的单个分支位置(唯一的 IP / PC)的分支分辨率不是静态的,最好的例子是循环分支 - 它只被采用直到它不再被采用。一些分支预测器会在不同的历史上下文中为这些分支保存多个条目。另一方面,如果您打算在运行时更改这些位 - 请查看 Self-Modifying-Code 并重新考虑。
      • @Leeor 因为这只是一个提示,所以不会出现自修改代码问题。 (此外,前端将进行修改。)如果多个程序/线程正在运行代码,则会出现问题,在这种情况下,Icache 重新填充可能会从另一个线程的历史记录中做出预测。这也意味着要回写更多脏缓存块。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2014-04-28
      • 2015-11-17
      • 2012-04-11
      相关资源
      最近更新 更多