我认为现有答案中缺少的是“旁路”或“转发”数据路径的存在。为了简单起见,我们坚持使用MIPS 5级流水线。每条指令从出生到死亡需要5个周期 - 取指,解码,执行,内存,写回。这就是处理单条指令需要多长时间。
你想知道的是,一条指令将其结果交给一条相关指令需要多长时间。假设你有两个连续的ADD指令,而且也通过R1的依赖关系:
ADD R1, R2, R3
ADD R4, R1, R5
如果没有转发路径,我们不得不拖延多个周期(2或3的第二指令取决于写回是如何工作的),因此第一个可以将其结果存储到寄存器文件中,然后第二个读取结果作为解码阶段的输入。
但是,有转发路径允许从流水线中选出有效的结果(但还没有写回的结果)。假设第一个ADD从解码中的寄存器文件获取所有输入。第二个将R5取出寄存器文件,但它将在执行阶段之后将R1从流水线寄存器中取出。换句话说,我们将ALU的输出路由回到一个周期后的输入。
乱序处理器无处不在地使用转发。他们将有许多不同的功能单位,有很多不同的延迟。例如,ADD和AND通常需要一个周期(TO DO THE MATH,抛开前后所有的流水线阶段),MUL会像4,浮点运算需要很多周期,存储器访问有可变延迟(由于缓存未命中)等。
通过使用转发,我们可以将指令的关键路径仅限于执行单元的延迟,而其他所有内容(取指,解码,退休),它超出关键路径。指令被解码并转储到指令队列中,等待它们的输入由其他执行指令产生。当一个指令的依赖性得到满足时,它就可以开始执行。
让我们看看这个例子
MUL R1,R5,R6
ADD R2,R1,R3
AND R7,R2,R8
我会作出尝试在绘制时间轴,显示这些指令通过管道流。
MUL FDIXXXXWR
ADD FDIIIIXWR
AND FDIIIIXWR
重点:
F - Fetch
D - Decode
I - Instruction queue (IQ)
X - execute
W - writeback/forward/bypass
R - retire
所以,你看,乘法指令有9个循环的总寿命。但是MUL和ADD的执行有重叠,因为处理器是流水线的。当ADD进入IQ时,它必须等待它的输入(R1),同样依赖于ADD的结果(R2)的AND也是如此。我们关心的不是MUL总共生活多久,而是任何依赖性指令需要等待多长时间。这是它的有效延迟,这是4个周期。正如你所看到的,一旦ADD执行,由于转发,依赖的AND可以在下一个周期执行。
当您说XOR具有“1个周期的延迟”时,您的意思是什么?你的来源是什么?这似乎是一种无意义的测量。 –
Agner雾的图表(http://agner.org/optimize/instruction_tables.pdf)。这意味着XOR需要1个时钟周期才能执行,因此等待时间为1,而BSR需要3个。 – IamIC
您是否阅读过他对延迟意味着什么的解释?如果是这样,我不明白为什么你会说“XOR在1个周期内完成,并且延迟为1个周期,表明它不会经历全部14个阶段”。 –