CPU 如何知道什么时候停止流水线阶段?
How does the CPU know when to hold a pipeline stage back?
CPU 如何检查管道阶段是否繁忙,以便它可以阻止所有前面的阶段?也就是说,在一个三级流水线示例中,如果第 2 级占用多个时钟周期并使流水线停滞,CPU 如何知道不让第 1 级向前移动?
首先,x86-64 作为标签没有什么意义。有真正的 ARM CPU 具有 3 级流水线(例如 Cortex-M),但没有 x86-64 CPU 如此短。 x86 解码对于那么短的管道来说太昂贵了,"x86 tax" 吃掉了太多 space/performance 对于简单的 CPUs。
很明显,任何给定阶段都可以检测到何时需要启动 停顿。例如。内存访问阶段可以检测到缓存未加载或存储缓冲区已满(这需要在没有任何内存级并行性的情况下在简单的 CPU 上停止管道,这与真正的现代 x86 不同,它可以推测命中未命中和错过下错过)。我想你只是在问这些信息是如何向后传播的。
在可以停滞的管道中1,每个阶段都必须为下一阶段无法接受新内容的可能性做好准备。您只需要发出前一个阶段的信号,而不是之前的所有阶段。管道中可能有气泡可以关闭。
显而易见的实现是从每个阶段到前一个阶段的信号线。
如果一个阶段还没有准备好接受新工作,它就会发出这个信号。在通常将数据从一个阶段传播到另一个阶段的时钟边沿上,如果设置了该信号,则前一个阶段会保留其数据。
如果流水线已满,最后阶段的停顿将导致流水线向后波动。 (先前为空的流水线阶段可以停止传播:即使下一个阶段不能从它们那里获取任何工作,它们仍然可以在本周期接受新工作。)这种反向传播可以早于时钟边沿开始,就像一旦后期检测到它需要停止。
实际上,在阶段之间缓冲数据的锁存器可能会吸收一些这种纹波延迟并将其从关键路径上移开。就像数据总是可以在阶段之间的边界被锁存器缓冲,但如果该信号被提升,那么锁存器会一直保持到稍后?
IDK 您想深入了解数字逻辑/门设计。高层图片只是每个阶段都可以向前一个阶段发出信号,表明它还没有准备好在这个周期接受新工作。而且这个信号必须以某种方式向后传播。
脚注 1:并非所有管道都可以停顿。例如完全流水线化的整数乘法执行单元不需要任何流量控制。它总是可以在每个周期接受一个新的输入,无论如何。
但是,是的,一个完整的 CPU 管道通常必须至少能够暂停内存。
CPU 如何检查管道阶段是否繁忙,以便它可以阻止所有前面的阶段?也就是说,在一个三级流水线示例中,如果第 2 级占用多个时钟周期并使流水线停滞,CPU 如何知道不让第 1 级向前移动?
首先,x86-64 作为标签没有什么意义。有真正的 ARM CPU 具有 3 级流水线(例如 Cortex-M),但没有 x86-64 CPU 如此短。 x86 解码对于那么短的管道来说太昂贵了,"x86 tax" 吃掉了太多 space/performance 对于简单的 CPUs。
很明显,任何给定阶段都可以检测到何时需要启动 停顿。例如。内存访问阶段可以检测到缓存未加载或存储缓冲区已满(这需要在没有任何内存级并行性的情况下在简单的 CPU 上停止管道,这与真正的现代 x86 不同,它可以推测命中未命中和错过下错过)。我想你只是在问这些信息是如何向后传播的。
在可以停滞的管道中1,每个阶段都必须为下一阶段无法接受新内容的可能性做好准备。您只需要发出前一个阶段的信号,而不是之前的所有阶段。管道中可能有气泡可以关闭。
显而易见的实现是从每个阶段到前一个阶段的信号线。
如果一个阶段还没有准备好接受新工作,它就会发出这个信号。在通常将数据从一个阶段传播到另一个阶段的时钟边沿上,如果设置了该信号,则前一个阶段会保留其数据。
如果流水线已满,最后阶段的停顿将导致流水线向后波动。 (先前为空的流水线阶段可以停止传播:即使下一个阶段不能从它们那里获取任何工作,它们仍然可以在本周期接受新工作。)这种反向传播可以早于时钟边沿开始,就像一旦后期检测到它需要停止。
实际上,在阶段之间缓冲数据的锁存器可能会吸收一些这种纹波延迟并将其从关键路径上移开。就像数据总是可以在阶段之间的边界被锁存器缓冲,但如果该信号被提升,那么锁存器会一直保持到稍后?
IDK 您想深入了解数字逻辑/门设计。高层图片只是每个阶段都可以向前一个阶段发出信号,表明它还没有准备好在这个周期接受新工作。而且这个信号必须以某种方式向后传播。
脚注 1:并非所有管道都可以停顿。例如完全流水线化的整数乘法执行单元不需要任何流量控制。它总是可以在每个周期接受一个新的输入,无论如何。
但是,是的,一个完整的 CPU 管道通常必须至少能够暂停内存。