0

当处理器执行一条指令时,可以假设这是一个原子操作。但是当处理器使用流水线时,它是如何工作的呢?该指令在多个步骤中执行,与许多其他指令并行,都在不同的步骤中。但是,如果其他指令之一干扰了我们的指令怎么办?处理器如何“回滚”指令的效果,或完全避免干扰?

4

2 回答 2

3

我敢肯定,各种处理器采用了许多策略。我曾经有一个项目,我将流水线添加到模拟处理器中。我采用的技术是

  1. 冒泡。对于某些可能会干扰后续指令的操作,我知道干扰可能会发生多远。例如,如果在以下指令已经通过管道的一个阶段之前条件跳转评估尚未完成,我可能会将有效的 NOP 直接放在条件跳转后面的管道中。

  2. 转发。在几种情况下,我能够看到我需要指令中的一个值,该值比当前指令高一两个阶段,但尚未复制到它通常从中访问它的寄存器/门中。在这种情况下,它直接从后期访问它。

  3. 分支预测和校正。预测部分不是关于如何避免碰撞,但重要的是要注意。在条件跳转的情况下,您希望预测会发生什么并尽早将下一条指令加载到管道中。我总是假设条件会评估为不进行跳转,因为这样我可以立即将下一条指令加载到管道中而无需先评估跳转地址,从而避免了对气泡的需要。

当预言成真时,是的,我很高兴。如果预测没有实现,那么我需要否定我们乐观地早早启动的下一条指令的影响。我通过在前几个流水线级中将信号切换到与非门来实现这一点,以有效地 NOP 出当前正在那里执行的指令。

这是我从我唯一的个人经历中记得的。我查看了指令管道的维基百科页面,并看到了一些相同的想法,我确信有更好的解释:) http://en.wikipedia.org/wiki/Instruction_pipeline

于 2012-04-26T20:04:15.207 回答
1

这是由处理器的设计者定义的,并且对于每个特定的处理器来说可能是不同的。例如,如果我们采用典型的 Intel/AMD x86/x64 处理器系列,单指令并不总是原子的。

您必须始终说出您所谈论的处理器类型。如果它是与 x86/x64 不同的平台,您可能会在Electronics forum获得更好的答案,而不是在这里。

于 2012-04-26T19:45:47.453 回答