CPU时钟周期误解

时间:2016-07-15 16:31:52

标签: cpu-architecture

我不太了解CPU时钟,例如3.4Ghz。我知道这是每秒3.4亿个时钟周期。

因此,如果机器使用单个时钟周期指令,那么它每秒可以执行大约3.4亿个指令。

但在管道中,基本上每条指令需要更多周期,但每个周期长度都比单个时钟周期短。

但是虽然管道具有更高的吞吐量,但无论如何cpu每秒可以达到34亿个周期。因此,它可以执行3.4十亿/ 5条指令(如果一条指令需要5个周期),这意味着小于单周期实现(3.4> 3.4 / 5)。我错过了什么?

3.4Ghz等CPU时钟是基于流水线循环的,而不是基于单周期实现?

3 个答案:

答案 0 :(得分:5)

流水线

流水线操作不涉及比单个时钟周期短的周期。以下是流水线的工作原理:

enter image description here

我们有一项复杂的任务要做。我们将这项任务分解为若干阶段,每个阶段都相对简单。我们研究每个阶段的工作量,以确保每个阶段花费的时间与其他阶段相同。

使用处理器,我们做了大致相同的事情 - 但在这种情况下,它不会安装这14个螺栓"它就像获取和解码指令一样,阅读操作数,执行(通常是这里的几个阶段),并写回结果。

与汽车生产线一样,我们为管道的每个阶段提供了一套专门的工具,用于完全(并且仅)完成该阶段所需的工作。当我们完成对汽车/指令的一个处理阶段时,它会移动到下一个阶段,这个阶段将获得下一个要处理的汽车/指令。

在理想的情况下,这个过程(大致)是这样的:

enter image description here

福特用了大约12个小时来制造一辆N型轿车(型号T的前身)。主要由于 pipelining 生产线,构建模型T只需要大约2个半小时。更重要的是,即使模型T从2.5小时开始完成,该时间也被打破了进入不少于84个不连续的步骤,所以当一切顺利进行时,整个生产线可以每两分钟生产一辆汽车(约)。

但事情并非总是如此。如果一个阶段缺少部分,那么阶段之后就必须等待。如果暂停持续很长时间,它会支持事情,所以前面的阶段也必须等待。

处理器管道中也会发生同样的情况。例如,当分支发生时,处理器可能必须等待一段时间才能获取下一条指令。如果一条指令需要一个来自内存的操作数,那么这可能会导致暂停(#34;管道泡泡")。

为了防止他的管道暂停,亨利福特聘请人们研究各个阶段,弄清楚每个阶段需要掌握多少部分,等等。我不确定,但我认为可能有一些人被指定观察不同车站的零件供应,并派人跑去让仓库经理知道(如果(无论出于何种原因)特定阶段的零件供应看起来很短,所以他们需要更快。

处理器做了一些相同的事情 - 他们有像分支预测器和预取器这样的东西,试图提前弄清楚正在执行的指令流所需要的东西,并试图确保一切都在手边当它需要时(例如,使用缓存暂时存储看起来可能很快就需要的东西)。

因此,与模型T一样,每条指令执行开始到结束需要相对较长的时间,但我们会以更短的时间间隔完成另一个产品 - 最好是一次一个时钟(但请参阅我的其他答案 - - 现代设计通常每个时钟执行多条指令。

答案 1 :(得分:3)

典型的现代CPU可以同时执行许多不相关的指令(那些不依赖于相同资源的指令)。

要做到这一点,它通常会以这样的基本结构模糊地结束:

enter image description here

所以,我们左边有一个指令流。我们有三个解码器,每个解码器可以在每个时钟周期解码一条指令(但可能存在限制,因此复杂的指令都必须通过一个解码器,而其他两个解码器只能执行简单的指令)。

从那里,指令进入重新排序缓冲区,该缓冲区保留每个指令使用哪些资源的“记分板”,以及哪些资源受该指令影响(其中“资源”通常类似于CPU寄存器)或者旗帜登记册中的旗帜。)

然后,电路比较这些记分板以确定依赖性。例如,如果一条指令写入寄存器0,后一条指令从寄存器0读取,则这些指令必须串行执行。在每个时钟,它尝试查找没有执行依赖项的N个最旧的指令。

然后有许多独立的执行单位。这些中的每一个基本上都是一个“纯”函数 - 它需要一些输入,对它进行指定的转换,并产生一个输出。这样可以根据需要轻松复制它们,并且可以按照我们想要/能够承受的数量并行运行。这些通常是分组的,每个组有一个端口。在每个时钟中,我们可以通过该端口向该组中的一个执行单元发送一条指令。一旦指令到达执行单元,可能需要不止一个时钟才能完成执行。

一旦执行了这些,我们就会有一组退出单元来获取结果,并按执行顺序将它们写回寄存器。我们再次拥有多个单元,因此我们可以在每个时钟退出多个指令。

注意:此图试图对其描述的解码器,引退单元和端口的粗略数量是半现实的,但它显示的是一般概念 - 不同的CPU将具有更多或更少的特定资源。对于它们中的几乎任何一个,记分板单元中的解码指令数量很少 - 实际数字更像是50条指令。

在任何情况下,指令的实际执行是衡量或推理的最难的部分之一。端口数量为我们在任何给定时钟中启动执行的指令数量提供了硬上限。解码器和引退单元的数量给出了每个时钟可以开始/完成的指令数量的上限。执行本身......好吧,有很多执行单元,每个执行单元(至少可能)采用不同数量的时钟来执行指令。

使用上面所示的设计,每个时钟的上限为3个硬上限。这是你可以解码或退休的最多。使用不同的设计,显然可以上升或下降(例如,有4个解码器,4个端口和4个退休单元,上限可能达到4)。

实际上,通过该设计,您通常不会期望在大多数时钟周期中执行三条指令。指令之间存在足够的依赖关系,您可能期望接近2作为长期平均值(更可能略低于2)。增加可用资源(更多的解码器,更多的退休单元等)很少会有很多帮助 - 每个时钟平均可以达到三条指令,但希望四条指令可能不切实际。

答案 2 :(得分:1)

正如其他人已经注意到现代CPU如何运作的全部细节是复杂的。但你的部分问题有一个简单的答案:

  

3.4Ghz等CPU时钟仅仅意味着基于管道周期,   不是基于单周期实施?

CPU的时钟频率是指时钟信号每秒切换多少次。时钟信号不分成较小的流水线段。流水线操作的目的是允许更快的时钟切换速度。因此,3.4GHz是指单个流水线阶段每秒执行指令时可以执行的任何工作的次数。执行指令的总工作是在多个周期内完成的,每个周期可能处于不同的流水线阶段。

您的问题也显示了对流水线技术如何运作的一些误解:

  

但是虽然管道有更多的吞吐量,但无论如何cpu可以做到3.4   每秒数十亿次循环。因此,它可以执行3.4亿/ 5   指令(如果一条指令需要5个周期),这意味着小于   单周期实现(3.4> 3.4 / 5)。我错过了什么?

在简单的情况下,单周期CPU和流水线CPU的吞吐量是相同的。流水线CPU的延迟更高,因为它需要更多周期(例如,在您的示例中为5)来执行单个指令。但是在管道满后,吞吐量可能与单周期非流水线CPU相同。因此,在使用您的示例的简单情况下,单周期CPU可在1秒内执行34亿条指令,而具有5级的流水线CPU可在1秒内执行34亿减去5条指令。从34亿减去5是可以忽略不计的差异,而除以5将是一个非常显着的差异。

还有一些需要注意的事情是,由于需要管道停顿的指令之间存在依赖关系,我所描述的简单情况并非如此。大多数现代CPU可以在每个周期执行多个指令。