gpt4 book ai didi

c - 分支预测会对接下来的 C 循环产生什么影响?

转载 作者:行者123 更新时间:2023-11-30 17:13:58 26 4
gpt4 key购买 nike

我对 C 的经验相对有限,而且我对其在现代 CPU 上的编译输出缺乏很好的理解。背景:我正在为 Android 应用程序进行图像处理。我读过无分支机器代码是内部循环的首选,所以我想知道这样的代码之间是否存在显着的性能差异:

if (p)      { double for loop, computing f() }

else if (q) { double for loop, computing g() }

else { double for loop, computing h() }

与在循环内进行条件检查的不太详细的版本相比:

for (int i = 0; i < xRes; i++)
{
for (int j = 0; j < yRes; j++)
{
image[i][j] = p ? f() : (q ? g() : h());
}
}

在此代码中,p 和 q 是类似于 mode == 3 的表达式,其中 mode 被传递到函数中并且在函数内从未更改。我有三个简单的问题:

(1) 第一个更详细的版本会比第二个版本编译成更高效的代码吗?

(2) 对于第二个版本,如果我在循环上方评估并存储 pq 的结果,性能会提高,这样我就可以替换 bool 表达式在带有变量的循环中?

(3) 我是否应该担心这一点,或者分支预测(或其他一些优化)会确保循环中的 bool 表达式几乎永远不会被评估?

最后,如果有人能说出这 3 个问题的答案是否取决于架构,我会很高兴。我对主要的 Android NDK 平台感兴趣:ARM、MIPS、x86 等。提前致谢!

最佳答案

看来这个问题已经得到了很好的回答 here:编译器可能会执行循环取消切换,从循环中删除条件并自动生成循环的 3 个副本,就像 stark 一样建议。此外,从那里和上面给出的评论来看,分支预测对于像这样的循环来说似乎非常有效。

关于c - 分支预测会对接下来的 C 循环产生什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535817/

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