我在理解超级流水线CPU的"特性"时遇到了一个问题。我们了解到,通过重新排序命令可以使程序运行得"更快一个例子是,如果您将值1000加到寄存器1,然后从寄存器2减去寄存器1的值,然后减去inc寄存器9的值通过将inc放在add和子命令之间,CPU将能够在执行子命令时执行此操作(并行)如果所有的命令都使用ALU单元,那怎么可能呢?我可以理解它是MOV(或者任何不使用ALU单元的命令)先谢了
yacmzcpb1#
我们以你为例
I1: add r1, r1, 1000 I2: sub r2, r2, r1 I3: add r9, r9, 1
假设我们有一个流水线ALU,比如x〉1级,上面序列中的每条指令从发布到写回需要x个周期,因为它们都使用ALU。首先考虑一下在没有重新排序的情况下代码将如何运行。I1在周期1发出。I2通过r1与I1存在(RAW)相关性,因此I2必须等待I1完成执行才能发出指令,这发生在周期x +1。由于I3不依赖于前面的指令,因此它可以在发出I2之后的周期发出指令,在周期x +2。I3在周期2x +1之后完成。现在考虑一下如果CPU可以乱序执行会发生什么。CPU发出的任何指令的输入和输出都不同于所有执行指令的输出(输出必须不同于执行指令的输出的限制可以通过诸如寄存器重命名的技术来放宽)。这里,CPU通过在周期1发出I1开始。在周期2,它试图发出I2,但由于RAW相关性而无法执行此操作,但它可以发出I3,它确实发出了I3。I1在周期x之后完成,因此可以在周期x +1发出I2。I3在周期x +1之后完成。I2在周期2x之后完成。因此,通过在I2之前执行I3节省了1个周期,这用于隐藏由于RAW相关性而导致的延迟。如果x较大,则节省的时间不多。但这实际上是因为我们的程序较小。假设在I3之后还有另一条指令,如
I1: add r1, r1, 1000 I2: sub r2, r2, r1 I3: add r9, r9, 1 I4: add r4, r4, 4
您可以看到,如果不进行重新排序,所述CPU将需要2 x +2个周期来运行此代码。如果进行重新排序,则仍然只需要2 x个周期。由于我们能够继续发出独立指令来隐藏I1和I2之间的延迟,因此现在节省了2个周期。显然,节省的时间增加了我们拥有的独立指令。
这些参数并不要求CPU实现寄存器重命名或成为超标量(定义为每个周期能够发出多条指令),我们只要求执行单元是流水线的或重复的,这可以证明在组织上是等效的。
1条答案
按热度按时间yacmzcpb1#
我们以你为例
假设我们有一个流水线ALU,比如x〉1级,上面序列中的每条指令从发布到写回需要x个周期,因为它们都使用ALU。
首先考虑一下在没有重新排序的情况下代码将如何运行。I1在周期1发出。I2通过r1与I1存在(RAW)相关性,因此I2必须等待I1完成执行才能发出指令,这发生在周期x +1。由于I3不依赖于前面的指令,因此它可以在发出I2之后的周期发出指令,在周期x +2。I3在周期2x +1之后完成。
现在考虑一下如果CPU可以乱序执行会发生什么。CPU发出的任何指令的输入和输出都不同于所有执行指令的输出(输出必须不同于执行指令的输出的限制可以通过诸如寄存器重命名的技术来放宽)。这里,CPU通过在周期1发出I1开始。在周期2,它试图发出I2,但由于RAW相关性而无法执行此操作,但它可以发出I3,它确实发出了I3。I1在周期x之后完成,因此可以在周期x +1发出I2。I3在周期x +1之后完成。I2在周期2x之后完成。
因此,通过在I2之前执行I3节省了1个周期,这用于隐藏由于RAW相关性而导致的延迟。如果x较大,则节省的时间不多。但这实际上是因为我们的程序较小。假设在I3之后还有另一条指令,如
您可以看到,如果不进行重新排序,所述CPU将需要2 x +2个周期来运行此代码。如果进行重新排序,则仍然只需要2 x个周期。由于我们能够继续发出独立指令来隐藏I1和I2之间的延迟,因此现在节省了2个周期。显然,节省的时间增加了我们拥有的独立指令。
这些参数并不要求CPU实现寄存器重命名或成为超标量(定义为每个周期能够发出多条指令),我们只要求执行单元是流水线的或重复的,这可以证明在组织上是等效的。