【问题标题】:Execution speed of conditional instructions compared to mathematical functions [closed]与数学函数相比,条件指令的执行速度[关闭]
【发布时间】:2016-07-26 17:56:32
【问题描述】:

我会尽量清楚地说明我的问题(不容易……对我来说也不是那么清楚)。 假设您有一组带有多个操作数的 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 花费更少的时间,但这只是来自我在汇编中的旧背景的直觉,他们告诉我们条件指令需要更多时间时间比算术时间。

你能确认一下吗?甚至可以提供一些链接让我可以找到解释?

提前谢谢你们!

【问题讨论】:

  • 我认为你的直觉是对的。我在这里关注了一些关于消除分支的令人惊讶的结果的优化问题。
  • en.wikipedia.org/wiki/Branch_predictor 及其链接的文章将提供一个开始。相对收益取决于函数的复杂性和可能的​​分支,但对于现代处理器,流水线和分支预测器通常是相关的。
  • 也许你应该先检查你的编译器cannot already do this,然后再对你的程序进行检查。当然总是首先验证它实际上可以有所作为,使用分析器。程序员的格言是三度测量,一次切割。

标签: c++ c assembly computer-science computation


【解决方案1】:

你的直觉是正确的。

问题在于现代处理器有一个管道,并且在管道中接下来的 x 指令被顺序加载以准备执行。如果你有一个分支,一个 if 语句,那么处理器不知道你接下来要走哪条代码路径,所以它使用 branch predictor 进行猜测,但如果它得到它错了,它必须扔掉所有的管道,然后从正确的分支重新开始。

现代处理器中的分支预测器非常好,但如果您有 50/50 的机会以一种或另一种方式运行,那么您将遇到很多管道停顿。

这就是为什么消除 if 语句是好的原因,尤其是在紧密循环中。

这似乎有一些很好的解释:http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

【讨论】:

  • 想你的答案,我会检查出来!
猜你喜欢
  • 2017-02-24
  • 1970-01-01
  • 2012-11-24
  • 2022-07-27
  • 2018-05-15
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多