2015-09-21 37 views
1

我错过了一些基本的思路。 CPU流水线:在基本层面上,为什么指令要完成不同数量的时钟周期,以及某些指令在多级CPU中只需要一个周期?了解CPU流水线阶段与指令吞吐量

除了明显的“不同指令需要不同数量的工作来完成”,听我说......

考虑的酷睿i7与约14级流水线。这需要14个时钟周期才能完成贯通。 AFAIK,这应该意味着整个管道的延迟为14个时钟。但事实并非如此。

XOR在1个周期内完成,延迟为1个周期,表明它不会经历所有14个阶段。 BSR的延迟时间为3个周期,但每个周期的吞吐量为1。 AAM的延迟时间为20个周期(更多的是阶段计数),吞吐量为8(在Ivy Bridge上)。

某些指令不能在每个时钟发出,但要完成的时间少于14个时钟。

我知道多个执行单元。我不明白指令在延迟和吞吐量方面的长度是如何与管道阶段的数量相关的。

+0

当您说XOR具有“1个周期的延迟”时,您的意思是什么?你的来源是什么?这似乎是一种无意义的测量。 –

+0

Agner雾的图表(http://agner.org/optimize/instruction_tables.pdf)。这意味着XOR需要1个时钟周期才能执行,因此等待时间为1,而BSR需要3个。 – IamIC

+0

您是否阅读过他对延迟意味着什么的解释?如果是这样,我不明白为什么你会说“XOR在1个周期内完成,并且延迟为1个周期,表明它不会经历全部14个阶段”。 –

回答

3

我失去了一些基本的东西。 CPU流水线:在基本层面上,为什么指令要完成不同数量的时钟周期,以及某些指令在多级CPU中只需要一个周期?

因为我们感兴趣的是指令之间的速度,而不是单条指令的开始到结束时间。

除了明显的“不同指令需要不同数量的工作来完成”,听我说......

嗯,这是关键答案,为什么不同的指令有不同的延迟。

考虑一个带有大约14级管线的i7。这需要14个时钟周期才能完成贯通。 AFAIK,这应该意味着整个管道的延迟为14个时钟。但事实并非如此。

这是正确的,虽然这不是一个特别有意义的数字。例如,为什么我们关心CPU完全执行指令需要多长时间?这基本上没有影响。

XOR在1个周期内完成并且具有1个周期的延迟,表明它不经历全部14个阶段。 BSR的延迟时间为3个周期,但每个周期的吞吐量为1。 AAM的延迟时间为20个周期(更多的是阶段计数),吞吐量为8(在Ivy Bridge上)。

这只是一堆误解。异或将一个周期的延迟引入到依赖链中。也就是说,如果我做了12条指令,每条指令修改前一条指令的值,然后添加一条XOR作为第13条指令,则它将多花一个周期。这就是延迟意味着什么。

某些指令不能在每个时钟发出,但要花不到14个时钟才能完成。

没错。所以?

我知道多个执行单元。我不明白指令在延迟和吞吐量方面的长度是如何与管道阶段的数量相关的。

他们没有。为什么应该有任何联系?假设在流水线开始时有14个额外的阶段。为什么会影响延迟或吞吐量呢?这意味着所有事情都会在14个时钟周期后发生,但仍然以相同的速度发生。 (尽管可能会影响错误预测的分支和其他事情的成本)。

+0

那么,你明白它是如何工作的。我可以找到的每个示例都显示了RISC(不是CISC)管道,其中每条等长指令遍历管道的所有(通常为5个)阶段。每个阶段执行不同的功能。例如:XOR和BSR是否在所有14个(说)阶段执行?如果我们将研讨会阶段描绘成研讨会的工作站,我们就会发现一个工作岗位需要从一个工作岗位转到另一个工作岗位,并逐渐完成工作,最终退休。但是为什么有些指令会造成> 1个周期的延迟?我希望你能理解我的问题。 – IamIC

+0

@IanC在流水线中的每一点,除非该指令所依赖的所有先前指令已经提供了该指令需要进入下一阶段的任何指令,否则下一条指令不能进入流水线的下一个状态。如果一行中的两条指令需要延迟第二条指令,那么第一条指令将引入多于一个的延迟周期。例如,考虑一个乘法,然后是结果的增量。在某个时候,增量将不得不等待乘法才能取得更多进展。 –

+1

@IanC指令经常在管道中停顿,因为它们不需要进入下一步所需的条件。这包括需要从主存储器访问信息,需要其他指令使用的执行资源,需要先前指令的结果等等。 –

2

我认为现有答案中缺少的是“旁路”或“转发”数据路径的存在。为了简单起见,我们坚持使用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可以在下一个周期执行。