gpt4 book ai didi

c - "goto"语句对CPU的 "branch prediction"有什么影响?

转载 作者:行者123 更新时间:2023-12-03 17:07:17 25 4
gpt4 key购买 nike

为了了解有关 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 所在的位置。跳转到以便能够预取那边的指令。

你知道这件事吗?

最佳答案

无条件分支对于分支预测器来说不是问题,因为分支预测器不必预测它们。

它们给推测性指令提取单元增加了一些复杂性,因为分支(和其他改变指令指针的指令)的存在意味着指令并不总是以线性顺序提取。当然,这也适用于条件分支。

请记住,分支预测和推测执行是不同的事情。推测性执行不需要分支预测:假设永远不会采用分支,您可以推测性地执行代码,并且如果您确实采用了分支,则取消该分支之外的所有操作。在无条件分支的情况下,这将是一件特别愚蠢的事情,但它会使逻辑保持良好和简单。 (IIRC,这就是第一个流水线处理器的工作方式。)

(我猜你可以在没有推测执行的情况下进行分支预测,但实际上并没有什么意义,因为分支预测器没有任何人可以告诉它的预测。)

所以是的,分支——有条件的和无条件的——增加了指令提取单元的复杂性。没关系。 CPU 架构师是一些非常聪明的人。

编辑:回到糟糕的过去,有人观察到 goto 的使用语句可能会对当今编译器优化代码的能力产生不利影响。这可能是你的想法。现代编译器要聪明得多,一般情况下 goto 不会让你大吃一惊。 .

关于c - "goto"语句对CPU的 "branch prediction"有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27866957/

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