【发布时间】:2023-03-12 13:46:02
【问题描述】:
为了了解更多关于 CPU 和代码优化的信息,我开始学习汇编编程。我还阅读了一些巧妙的优化,例如 CPU 为加速自身而进行的“分支预测”。
我的问题可能看起来很愚蠢,因为我还不太了解这个主题。
我有一个非常模糊的记忆,我在某处(在互联网上)读到 goto 语句会降低程序的性能,因为它不能很好地与 CPU 中的分支预测配合使用。然而,这可能只是我编造的东西,并没有真正阅读过。
我认为这可能是真的。
我希望这个例子(在伪 C 中)能阐明我为什么这么认为:
int function(...) {
VARIABLES DECLARED HERE
if (HERE IS A TEST) {
CODE HERE ...
} else if (ANOTHER TEST) {
CODE HERE ...
} else {
/*
Let us assume that the CPU was smart and predicted this path.
What about the jump to `label`?
Is it possible for the CPU to "pre-fetch" the instructions over there?
*/
goto label;
}
CODE HERE...
label:
CODE HERE...
}
对我来说,这似乎是一项非常复杂的任务。这是因为 CPU 需要查找 goto 跳转到的位置,以便能够预取那里的指令。
你知道吗?
【问题讨论】:
-
goto是无条件跳转,与分支预测100%无关。分支预测适用于条件分支:ifwhile、for、virtual和函数指针.. -
@Mooing 但是分支预测如何与条件分支中包含的无条件跳转交互?这是我的问题。
-
分支预测像对待其他指令一样对待无条件跳转:它完全忽略它。我真的不明白这个问题。也许您对 CPU 管道的工作方式感到困惑,只是使用了错误的术语? 你所说的“分支预测器”是什么意思?
-
我的理解是,“分支预测器”是确定在实际执行之前应该将哪些指令放入 CPU 管道的东西。我真的不知道该怎么解释。就像我说的,我还不太了解这个主题。
-
@user3787875:哦!我是一个很好的猜测!您正在描述“CPU管道”的“指令获取”阶段。 “分支预测器”是指令提取的很大一部分,但显然您是在询问整个提取阶段。好的,我们现在在同一个页面上。
标签: c optimization cpu goto branch-prediction