当然,条件是每一次检查一次。但是,在进行检查时,它已深入到CPU管道中。同时,其他指令也已进入管道,并且处于执行的各个阶段。
通常,条件紧随其后是条件分支指令,如果条件评估为TRUE则分支,如果条件评估为FALSE则通过。这意味着根据条件是TRUE还是FALSE,可以在条件指令和分支指令之后将两种不同的指令流加载到管道中。不幸的是,在加载条件指令和分支指令之后,CPU尚不知道条件将对结果求值,但是它仍然必须继续将内容加载到管道中。因此,它会根据条件评估结果的选择来选择两组指令之一。
稍后,随着条件指令沿管线传递,现在是时候对其进行评估了。那时,CPU会发现其猜测是对还是错。
如果猜测正确,则分支转到正确的位置,并将正确的指令加载到管道中。如果事实证明猜测是错误的,那么条件分支指令之后加载到管道中的所有指令都是错误的,因此必须将其丢弃,并且必须从正确的位置重新开始获取指令。
修正案
为了回应StarWeaver的评论,给出一个CPU执行一条指令所必须做的事情的想法:
考虑一下MOV AX,[SI+10]
我们人类天真地认为“将AX加上SI加10的单词” 这样简单的事情。大致来说,CPU必须:
- 将PC的内容(“程序计数器寄存器”)发送到地址总线;
- 从数据总线读取指令操作码;
- 增量PC
- 解码操作码以弄清楚该如何处理;
- 将PC的内容发送到地址总线;
- 从数据总线读取指令操作数(在这种情况下为10);
- 增量PC
- 将操作数和SI馈入加法器;
- 将加法器的结果发送到地址总线;
- 从数据总线读取AX。
这是多达10个步骤。这些步骤中的某些步骤甚至在非流水线CPU中也会被优化,例如,CPU几乎总是与下一步并行地递增PC,这很容易做到,因为PC是非常非常特殊的寄存器,从未用于其他任何作业,因此,CPU的不同部分之间不可能争用该特定寄存器。但是,对于这样一条简单的指令,我们只剩下8个步骤,并且请注意,我已经代表CPU承担了某种程度的复杂性,例如,我假设对于该CPU,不需要整个额外的步骤。加法器实际执行加法,然后才能从中读取结果,
现在,考虑存在更复杂的寻址模式,例如MOV AX, [DX+SI*4+10]
,甚至更复杂的指令,例如MUL AX, operand
,它们实际上在CPU内部执行循环以计算其结果。
因此,我的意思是,“原子级”隐喻远不适合CPU指令级。如果您不想深入到实际的逻辑门级别,则它可能适合于流水线步骤级别。