条件指令的执行速度与数学函数相比如何?

5
我将尽力清晰地表达我的问题(这不容易...对我来说也不是很清楚)。 假设你有一组带有多个操作数的IF...THEN指令,例如

IF ((a==0) && (b==1) && (c==1)) THEN x=1
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2-

假设我可以用一个数学函数来替代所有这些IF语句,比如x = a * n1 + b * n2 + c * n3(这只是为了给你一个想法,在实际情况下它更加复杂,但IF语句和操作数也更多)。
这个函数来自之前训练过的人工神经网络。
我的直觉是,在执行时,这个函数应该比IF语句需要更少的时间,但这只是我的一种感觉,因为在汇编语言中,有条件的指令比算术指令需要更多的时间。
你能证实这一点吗?甚至能否提供一些链接,让我找到解释?
谢谢大家!

我认为你的直觉是正确的。我在SO上遵循了一些有关消除分支带来意外结果的优化问题。 - Peter - Reinstate Monica
https://en.wikipedia.org/wiki/Branch_predictor及其链接的文章将提供一个起点。相对收益取决于函数复杂度和可能分支,但是在现代处理器中,流水线和分支预测器通常是相关的。 - Peter
2
也许你应该先检查一下你的编译器是否已经可以做到这一点,然后再去修改你的程序,以免出现问题。当然,首先要验证它是否真的能够产生差异,使用分析工具。程序员的格言是:测量三次,切一次。 - Hans Passant
1个回答

4
你的直觉是正确的。
问题在于现代处理器有一个流水线,在流水线中,下一个x个指令按顺序加载以准备执行。如果你有一个分支,一个if语句,那么处理器不知道你接下来要采取哪个代码路径,因此它会使用分支预测器进行猜测,但如果猜错了,它就必须放弃整个流水线,并重新开始正确的分支。
现代处理器中的分支预测器相当不错,但如果你有一些50/50的机会去走这条路或那条路,你将会有很多流水线停顿。
这就是为什么消除if语句是好的,特别是在紧密循环中。
这篇文章似乎有一些很好的解释:http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

谢谢你的回答,我会去查看一下! - Maxyone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接