c++ - 与数学函数相比,条件指令的执行速度

标签 c++ c assembly computer-science computation

<分区>

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

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

提前谢谢你们!

最佳答案

你的直觉是正确的。

问题是现代处理器有一个流水线,在流水线中,下一个 x 指令被顺序加载以准备执行。如果你有一个分支,一个 if 语句,那么处理器不知道你接下来要采用哪条代码路径,所以它会使用分支预测器进行猜测,但如果它得到它错误的是它必须丢弃所有管道并沿着正确的分支重新开始。

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

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

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

关于c++ - 与数学函数相比,条件指令的执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449291/

相关文章:

c++ - 我想用迭代器的方式做一个循环,但是有一个错误

c++ - 禁用为 C/++ 中的某些行生成调试符号?

c - sscanf() double 和字符串

c++ - RDTSC 在 Ubuntu 中运行缓慢

assembly - IT指令点ARM汇编

c++ - 当我对一个已经锁定的 pthread_mutex_t 执行 pthread_mutex_init 时会发生什么?

c++ - 在 QThread 中运行长时间操作并向主线程发送信号仍然会卡住 UI

c - 下面的c定义的语法是什么?

c++ - 奇怪的优化?在 `libuv` 中。请解释

javascript - 如何仅使用单个数组在 JavaScript 中模拟调用堆栈