gpt4 book ai didi

c - 现代 CPU 中的分支 "anticipation"

转载 作者:太空狗 更新时间:2023-10-29 15:35:17 24 4
gpt4 key购买 nike

我最近在考虑现代 CPU 中的分支预测。据我了解,分支预测是必要的,因为在流水线中执行指令时,我们并不知道分支前条件运算的结果。

因为我知道现代乱序 CPU 可以按任何顺序执行指令,只要它们之间的数据依赖性得到满足,我的问题是,CPU 能否以分支目标已经存在的方式重新排序指令知道CPU需要走分支的时间,从而可以“预测”分支方向,所以根本不需要猜测?

那么 CPU 可以转这个吗:

do_some_work();
if(condition()) //evaluating here requires the cpu to guess the direction or stall
do_this();
else
do_that();

对此:

bool result = condition();
do_some_work(); //bunch of instructions that take longer than the pipeline length
if(result) //value of result is known, thus decision is always 100% correct
do_this();
else
do_that();

一个特殊且非常常见的用例是迭代集合,其中退出条件通常是循环不变的(因为我们通常在迭代时不修改集合)。

我的问题是现代 CPU 是否可以执行此操作?如果可以,已知哪些特定 CPU 内核具有此功能?

最佳答案

请记住,分支预测是在管道中很早就完成的,您仍然没有解码指令,并且您无法解决数据依赖性,因为您不知道使用了哪个寄存器。您可能会记得某个地方,但这不是 100%(因为您的存储容量/时间将受到限制),所以这几乎就是您的普通分支预测器所做的事情 - 仅根据指令指针推测目标。

然而,更早地进行条件评估是有用的,它在过去已经完成,并且主要是一种编译器技术,但可能会通过一些硬件支持得到增强(例如 - hoisting branch condition )。分支预测错误的主要性能影响是评估延迟,因为这些天分支恢复本身非常短。

这意味着您可以通过编译器仅提升条件并更早地计算它来减轻大部分惩罚,而无需任何硬件修改 - 如果您错误预测分支(以及现代预测器的可能性通常很低),但您会立即知道在解码分支本身时(因为数据会提前准备好),因此损坏将仅限于使其进入管道的极少数指令经过那个分支。

虽然能够提升评估并不简单。在大多数情况下,编译器可能能够检测到是否存在任何直接数据依赖性(在您的示例中使用 do_some_work()),但在大多数情况下会有。循环不变量是编译器今天已经移动的第一件事。此外,一些最难预测的分支依赖于一些内存获取,你通常不能假设内存会保持不变(你可以,之后进行一些特殊检查,但大多数常见的编译器不会这样做).无论哪种方式,它仍然是一种编译器技术,而不是分支预测的根本变化。

关于c - 现代 CPU 中的分支 "anticipation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31143130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com