为什么CPU分支指令慢?

use*_*005 30 language-agnostic architecture compiler-construction cpu optimization

自从我开始编程以来,我已经在每个地方阅读,以避免不惜一切代价浪费分支机构.

这很好,虽然没有一篇文章解释了为什么我应该这样做.CPU解码分支指令并决定跳转时到底发生了什么?什么是"东西"使它比其他指令(如添加)慢?

Oli*_*rth 44

分支指令本身并不比任何其他指令慢.

但是,您之所以听到分支应该避免的原因是因为现代CPU遵循管道架构.这意味着同时执行多个顺序指令.但是如果管道能够在每个周期从内存中读取下一条指令,那么它只能被充分利用,这反过来意味着它需要知道要读取条指令.

条件分支上,它通常不会提前知道将采用哪条路径.因此,当发生这种情况时,CPU必须停止,直到决策得到解决,并抛弃分支指令后面的管道中的所有内容.这降低了利用率,从而降低了性能.

这就是存在分支预测分支延迟时隙之类的原因.

  • +1:对于这个问题也很重要:现代CPU通常有[barnch预测器](http://en.wikipedia.org/wiki/Branch_predictor)来最小化这种性能损失. (8认同)

Zel*_*luX 6

因为CPU采用流水线来执行指令,这意味着当某个阶段正在执行前一条指令时(例如,从寄存器读取值),下一条指令将同时执行,但是在另一个阶段(例如,解码)阶段).对于非控制指令是可以的,但是当控制指令喜欢jmpcall执行时,它会使事情变得复杂.

由于CPU在执行jmp指令时不知道下一条指令是什么,它使用分支预测技术来预测是否采用分支指令(例如,循环片段中的分支指令可能会将指令流带回循环头).

但是,当这种预测失败时,这称为分支错误预测,它将影响执行性能.由于分支之后的管道必须被丢弃,并从正确的指令重新开始.