【发布时间】:2015-09-17 12:52:51
【问题描述】:
我最近在考虑现代 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 内核已知具有此功能?
【问题讨论】:
-
更多的是与编译器优化有关,而不是CPU。
-
我认为分支预测有点低级和“愚蠢”,因为它对程序的状态了解不多,只了解基本的指令输入。所以不,我不相信 CPU 会这样做。
-
据我了解,分支预测器在很大程度上取决于编译器,并且它以一种易于预测分支的方式组织代码。
-
嗯,不,听起来你在期待一个 cpu 内核来解决停机问题。已经完成,RISC 内核曾经有一个“分支槽”,一个额外的指令,总是在一个分支之后执行以购买延迟。像垃圾一样的规模,是您今天的机器中没有 RISC 内核的重要原因。
标签: c optimization hardware cpu-architecture branch-prediction