X86 CPU如何知道何时停止管道阶段?

X86 CPU如何知道何时停止管道阶段?,x86,x86-64,cpu,intel,cpu-architecture,X86,X86 64,Cpu,Intel,Cpu Architecture,CPU如何检查一个管道阶段是否繁忙,以便它可以阻止所有以前的阶段?也就是说,在一个三级管道的示例中,如果第2级占用多个时钟周期并使管道暂停,CPU如何知道不向前移动第1级?首先,x86-64作为标记没有什么意义。真正的ARM CPU有三级流水线,例如Cortex-M,但x86-64 CPU从来没有这么短。x86解码对于如此短的管道来说过于昂贵,而x86税对于简单的CPU来说占用了太多的空间/性能 很明显,任何给定的级都可以检测到何时需要启动失速。例如,内存访问阶段可以检测缓存未命中负载或存储缓冲

CPU如何检查一个管道阶段是否繁忙,以便它可以阻止所有以前的阶段?也就是说,在一个三级管道的示例中,如果第2级占用多个时钟周期并使管道暂停,CPU如何知道不向前移动第1级?

首先,x86-64作为标记没有什么意义。真正的ARM CPU有三级流水线,例如Cortex-M,但x86-64 CPU从来没有这么短。x86解码对于如此短的管道来说过于昂贵,而x86税对于简单的CPU来说占用了太多的空间/性能

很明显,任何给定的级都可以检测到何时需要启动失速。例如,内存访问阶段可以检测缓存未命中负载或存储缓冲区已满,这需要在没有任何内存级别并行性的简单CPU上暂停管道,而不像真正的现代x86,它可以在未命中和未命中下推测命中。我想你只是在问这些信息是如何反向传播的

在一条可能停滞的管道中,每个阶段都必须为下一阶段可能无法接受新材料做好准备。您只需要发出前一阶段的信号,而不是所有前一阶段的信号。管道中可能会出现可能会关闭的气泡

显而易见的实现是从每个阶段到前一阶段的信号线。 如果一个舞台还没有准备好接受新作品,它就会发出这个信号。在通常将数据从一级传输到另一级的时钟边缘上,如果设置了该信号,则前一级保留其数据

如果管道已满,则最后阶段的失速将导致管道中的波纹向后。以前为空的管道阶段可以停止传播:即使下一阶段不能从它们那里接受任何工作,它们仍然可以在本周期接受新工作。这种反向传播可以在时钟边缘之前开始,就像一个后期阶段检测到它需要暂停一样

实际上,用于在级之间缓冲数据的锁存器可能会吸收一些波动延迟,并使其脱离关键路径。可能数据总是可以在级与级之间的边界处由锁存器进行缓冲,但是如果该信号被提升,那么锁存器将一直保持到稍后

IDK您想深入研究数字逻辑/门设计的程度。高层次的情况是,每个阶段都可以向前一阶段发出信号,表明它还没有准备好接受本周期的新工作。这个信号必须以某种方式向后传播

脚注1:并非所有管道都能失速。e、 一个完全流水线的整数乘法执行单元不需要任何流控制。无论发生什么情况,它都可以在每个周期接受新的输入


但是,是的,完整的CPU管道通常至少必须能够暂停内存。

感谢您的回答,深度级别已经足够了!我之所以使用这些标记,是因为我对它在这些体系结构下的工作方式感兴趣——我使用的示例只是试图澄清我的问题,而不是准确地表示x86-64管道。@VortixDev:现代x86 CPU在管道阶段之间有队列来吸收气泡。由于奔腾M或Core 2左右。e、 g.请参阅和Agner Fog的uarch指南:。这将阶段解耦,因此失速涟漪可能不必通过多个阶段传播回来,我不确定在一个时钟周期内事情的低级细节。它们也是超标量和无序执行,尽管前端仍然正常。无论如何,传达前一阶段信号的高级思维模式没有改变。