CPU 时钟周期误解
CPU clock cycle misunderstanding
我不太了解CPU时钟,比如3.4Ghz。我知道这是每秒 34 亿个时钟周期。
所以这里如果机器使用单时钟周期指令,那么它每秒可以执行大约34亿条指令。
但在流水线中,基本上每条指令需要更多的周期,但每个周期长度比单个时钟周期短。
不过pipeline虽然吞吐量大,反正cpu每秒可以做34亿个循环。因此,它可以执行 3.4 billions/5 条指令(如果一条指令需要 5 个周期),这意味着少于单周期执行(3.4 > 3.4/5)。我错过了什么?
CPUclock如3.4Ghz是不是只是基于pipeline cycle,而不是基于single cycle实现?
一个典型的现代 CPU 可以同时执行许多不相关的指令(那些不依赖于相同资源的指令)。
要做到这一点,它通常会以模糊这样的基本结构结束:
所以,我们有一个指令流从左侧进入。我们有三个解码器,每个解码器每个时钟周期可以解码一条指令(但是可能会有限制,所以复杂的指令都必须通过一个解码器,另外两个解码器只能做简单的指令)。
指令从那里传递到重新排序缓冲区,该缓冲区保存 "scoreboard" 每条指令使用的资源以及影响该指令的资源(其中 "resource" 通常类似于 CPU 寄存器或标志寄存器中的标志。
电路然后比较这些记分板以确定相关性。例如,如果一条指令写入寄存器 0,而后一条指令从寄存器 0 读取,那么这些指令必须串行执行。在每个时钟,它都会尝试找到 N 个最旧的指令,这些指令不具有执行依赖性。
然后就是多个独立的执行单元。其中每一个基本上都是一个 "pure" 函数——它接受一些输入,对其进行指定的转换,然后产生一个输出。这使得根据需要复制它们变得容易,并且我们 want/can 负担得起的并行数量与 运行 一样多。这些通常是分组的,每个组都有一个端口。在每个时钟中,我们可以通过该端口向该组中的一个执行单元发送一条指令。一旦一条指令到达执行单元,可能需要一个以上的时钟才能完成。
一旦这些执行,我们就有一组退休单元获取结果,并按执行顺序将它们写回寄存器。同样,我们有多个单元,因此我们可以每个时钟退出多个指令。
注意:这张图试图在描述的解码器、退役单元和端口的粗略数量上表现得半真实,但它显示的是一个大概的想法——不同的 CPU 会有更多或更少的特定资源。尽管对于其中几乎任何一个,记分板单元中的解码指令数量都很低——实际数量更像是 50 条指令。
无论如何,指令的实际执行是其中最难衡量或推理的部分之一。端口数量为我们提供了在任何给定时钟中可以 start 执行的指令数量的硬性上限。解码器和退休单元的数量给出了每个时钟可以 started/finished 的指令数量的上限。执行本身......嗯,有很多执行单元,每个(至少可能)需要不同数量的时钟来执行一条指令。
对于如上所示的设计,每个时钟有 3 个指令的硬性上限。这是你可以解码或退休的最多。使用不同的设计,显然可以增加或减少(例如,使用 4 个解码器、4 个端口和 4 个退休单元,上限可以增加到 4)。
实际上,对于这种设计,您通常不会期望看到在大多数时钟周期内执行三个指令。指令之间存在足够的依赖关系,您可能期望长期平均值接近 2(并且更有可能略小于 2)。增加可用资源(更多的解码器、更多的退役单元等)几乎不会有多大帮助——您可能会达到每个时钟平均三个指令,但希望四个指令可能是不现实的。
正如其他人所指出的,现代 CPU 的运作方式的全部细节非常复杂。但是你的部分问题有一个简单的答案:
Does CPU clock such as 3.4Ghz just means for based on pipeline cycle,
not for based on single cycle implentation?
一个CPU的时钟频率是指时钟信号每秒切换多少次。时钟信号没有被分成更小的流水线段。流水线的目的是允许更快的时钟切换速度。所以3.4GHz是指在执行一条指令时,单个流水线级每秒可以完成它需要做的任何工作的次数。执行一条指令的总工作是在多个周期内完成的,每个周期可能处于不同的流水线阶段。
你的问题还表明了一些关于流水线工作原理的误解:
But although pipeline has more throughput, anyway cpu can do 3.4
billions cycle per second. So, it can execute 3.4 billions/5
instructions(if one instruction needs 5 cycles), which means less than
single cycle implementation(3.4 > 3.4/5). What am I missing?
在简单情况下,单个周期CPU 和流水线CPU 的吞吐量是相同的。流水线 CPU 的延迟更高,因为它需要更多的周期(即您的示例中的 5 个)来执行一条指令。但是在流水线满后,吞吐量可能与单周期非流水线相同CPU。因此,在使用您的示例的简单情况下,单周期 CPU 可以在 1 秒内执行 34 亿条指令,而具有 5 个阶段的流水线 CPU 可以在 1 秒内执行 34 亿减去 5 条指令。 34亿减去5相差无几,除以5相差很大
需要注意的其他几件事是,我描述的简单情况并非真实情况,因为指令之间的依赖关系需要流水线停顿。大多数现代 CPUs 可以在每个周期执行多个指令。
流水线
流水线不涉及比单个时钟周期短的周期。以下是流水线的工作原理:
我们有一项复杂的任务要做。我们将这项任务分解为多个阶段,每个阶段执行起来都相对简单。我们研究每个阶段的工作量,以确保每个阶段花费的时间与其他阶段大致相同。
对于处理器,我们做大致相同的事情——但在这种情况下,它不是 "install these fourteen bolts",而是像获取和解码指令、读取 ope运行ds、执行(通常这里有几个阶段),然后写回结果。
与汽车生产线一样,我们为流水线的每个阶段提供一套专门的工具,以准确(且仅)完成该阶段所需的工作。当我们完成对 car/instruction 的一个处理阶段后,它会进入下一阶段,而这个阶段会得到下一个 car/instruction 来处理。
在理想情况下,该过程(大致)如下所示:
福特制造一辆 N 型车(T 型车的前身)花了大约 12 个小时。主要得益于流水线生产线,制造一辆T型车只用了大约2个半小时。更重要的是,即使T型车从开始到完成需要2.5小时,那个时间被分解为不少于 84 个不连续的步骤,因此当一切 运行 顺利时,整个生产线可以每两分钟(大约)生产一辆汽车。
但这并不总是发生。如果一个阶段 运行 缺少零件,则必须等待其后的阶段。如果停顿时间很长,它会倒退,因此前面的阶段也必须等待。
同样的情况也可能发生在处理器流水线中。例如,当 b运行ch 发生时,处理器可能需要等待一段时间才能获取下一条指令。如果一条指令需要来自内存的 ope运行d,那也会导致暂停("pipeline bubble")。
为了防止流水线出现停顿,Henry Ford 雇人研究各个阶段,弄清楚每个阶段需要准备多少种零件,等等。我不确定,但我认为这是一个合理的猜测,可能有几个人被指定在不同的站点监视零件供应,并派人 运行 让仓库经理知道是否(无论什么原因)原因)特定阶段的零件供应看起来 运行 短缺,所以他们很快就会需要更多。
处理器做一些相同的事情——它们有像 b运行ch 预测器和预取器这样的东西,它们试图提前弄清楚正在执行的指令流需要什么,并且努力确保一切都在需要的时候准备就绪(例如,使用缓存来临时存储可能很快需要的东西)。
因此,就像 T 型车一样,每条指令从开始到结束执行需要相对较长的时间,但我们以更短的时间间隔完成另一个产品——理想情况下一个时钟一次(但请参阅我的另一个答案——现代设计通常每个时钟执行一条以上的指令。
我不太了解CPU时钟,比如3.4Ghz。我知道这是每秒 34 亿个时钟周期。
所以这里如果机器使用单时钟周期指令,那么它每秒可以执行大约34亿条指令。
但在流水线中,基本上每条指令需要更多的周期,但每个周期长度比单个时钟周期短。
不过pipeline虽然吞吐量大,反正cpu每秒可以做34亿个循环。因此,它可以执行 3.4 billions/5 条指令(如果一条指令需要 5 个周期),这意味着少于单周期执行(3.4 > 3.4/5)。我错过了什么?
CPUclock如3.4Ghz是不是只是基于pipeline cycle,而不是基于single cycle实现?
一个典型的现代 CPU 可以同时执行许多不相关的指令(那些不依赖于相同资源的指令)。
要做到这一点,它通常会以模糊这样的基本结构结束:
所以,我们有一个指令流从左侧进入。我们有三个解码器,每个解码器每个时钟周期可以解码一条指令(但是可能会有限制,所以复杂的指令都必须通过一个解码器,另外两个解码器只能做简单的指令)。
指令从那里传递到重新排序缓冲区,该缓冲区保存 "scoreboard" 每条指令使用的资源以及影响该指令的资源(其中 "resource" 通常类似于 CPU 寄存器或标志寄存器中的标志。
电路然后比较这些记分板以确定相关性。例如,如果一条指令写入寄存器 0,而后一条指令从寄存器 0 读取,那么这些指令必须串行执行。在每个时钟,它都会尝试找到 N 个最旧的指令,这些指令不具有执行依赖性。
然后就是多个独立的执行单元。其中每一个基本上都是一个 "pure" 函数——它接受一些输入,对其进行指定的转换,然后产生一个输出。这使得根据需要复制它们变得容易,并且我们 want/can 负担得起的并行数量与 运行 一样多。这些通常是分组的,每个组都有一个端口。在每个时钟中,我们可以通过该端口向该组中的一个执行单元发送一条指令。一旦一条指令到达执行单元,可能需要一个以上的时钟才能完成。
一旦这些执行,我们就有一组退休单元获取结果,并按执行顺序将它们写回寄存器。同样,我们有多个单元,因此我们可以每个时钟退出多个指令。
注意:这张图试图在描述的解码器、退役单元和端口的粗略数量上表现得半真实,但它显示的是一个大概的想法——不同的 CPU 会有更多或更少的特定资源。尽管对于其中几乎任何一个,记分板单元中的解码指令数量都很低——实际数量更像是 50 条指令。
无论如何,指令的实际执行是其中最难衡量或推理的部分之一。端口数量为我们提供了在任何给定时钟中可以 start 执行的指令数量的硬性上限。解码器和退休单元的数量给出了每个时钟可以 started/finished 的指令数量的上限。执行本身......嗯,有很多执行单元,每个(至少可能)需要不同数量的时钟来执行一条指令。
对于如上所示的设计,每个时钟有 3 个指令的硬性上限。这是你可以解码或退休的最多。使用不同的设计,显然可以增加或减少(例如,使用 4 个解码器、4 个端口和 4 个退休单元,上限可以增加到 4)。
实际上,对于这种设计,您通常不会期望看到在大多数时钟周期内执行三个指令。指令之间存在足够的依赖关系,您可能期望长期平均值接近 2(并且更有可能略小于 2)。增加可用资源(更多的解码器、更多的退役单元等)几乎不会有多大帮助——您可能会达到每个时钟平均三个指令,但希望四个指令可能是不现实的。
正如其他人所指出的,现代 CPU 的运作方式的全部细节非常复杂。但是你的部分问题有一个简单的答案:
Does CPU clock such as 3.4Ghz just means for based on pipeline cycle, not for based on single cycle implentation?
一个CPU的时钟频率是指时钟信号每秒切换多少次。时钟信号没有被分成更小的流水线段。流水线的目的是允许更快的时钟切换速度。所以3.4GHz是指在执行一条指令时,单个流水线级每秒可以完成它需要做的任何工作的次数。执行一条指令的总工作是在多个周期内完成的,每个周期可能处于不同的流水线阶段。
你的问题还表明了一些关于流水线工作原理的误解:
But although pipeline has more throughput, anyway cpu can do 3.4 billions cycle per second. So, it can execute 3.4 billions/5 instructions(if one instruction needs 5 cycles), which means less than single cycle implementation(3.4 > 3.4/5). What am I missing?
在简单情况下,单个周期CPU 和流水线CPU 的吞吐量是相同的。流水线 CPU 的延迟更高,因为它需要更多的周期(即您的示例中的 5 个)来执行一条指令。但是在流水线满后,吞吐量可能与单周期非流水线相同CPU。因此,在使用您的示例的简单情况下,单周期 CPU 可以在 1 秒内执行 34 亿条指令,而具有 5 个阶段的流水线 CPU 可以在 1 秒内执行 34 亿减去 5 条指令。 34亿减去5相差无几,除以5相差很大
需要注意的其他几件事是,我描述的简单情况并非真实情况,因为指令之间的依赖关系需要流水线停顿。大多数现代 CPUs 可以在每个周期执行多个指令。
流水线
流水线不涉及比单个时钟周期短的周期。以下是流水线的工作原理:
我们有一项复杂的任务要做。我们将这项任务分解为多个阶段,每个阶段执行起来都相对简单。我们研究每个阶段的工作量,以确保每个阶段花费的时间与其他阶段大致相同。
对于处理器,我们做大致相同的事情——但在这种情况下,它不是 "install these fourteen bolts",而是像获取和解码指令、读取 ope运行ds、执行(通常这里有几个阶段),然后写回结果。
与汽车生产线一样,我们为流水线的每个阶段提供一套专门的工具,以准确(且仅)完成该阶段所需的工作。当我们完成对 car/instruction 的一个处理阶段后,它会进入下一阶段,而这个阶段会得到下一个 car/instruction 来处理。
在理想情况下,该过程(大致)如下所示:
福特制造一辆 N 型车(T 型车的前身)花了大约 12 个小时。主要得益于流水线生产线,制造一辆T型车只用了大约2个半小时。更重要的是,即使T型车从开始到完成需要2.5小时,那个时间被分解为不少于 84 个不连续的步骤,因此当一切 运行 顺利时,整个生产线可以每两分钟(大约)生产一辆汽车。
但这并不总是发生。如果一个阶段 运行 缺少零件,则必须等待其后的阶段。如果停顿时间很长,它会倒退,因此前面的阶段也必须等待。
同样的情况也可能发生在处理器流水线中。例如,当 b运行ch 发生时,处理器可能需要等待一段时间才能获取下一条指令。如果一条指令需要来自内存的 ope运行d,那也会导致暂停("pipeline bubble")。
为了防止流水线出现停顿,Henry Ford 雇人研究各个阶段,弄清楚每个阶段需要准备多少种零件,等等。我不确定,但我认为这是一个合理的猜测,可能有几个人被指定在不同的站点监视零件供应,并派人 运行 让仓库经理知道是否(无论什么原因)原因)特定阶段的零件供应看起来 运行 短缺,所以他们很快就会需要更多。
处理器做一些相同的事情——它们有像 b运行ch 预测器和预取器这样的东西,它们试图提前弄清楚正在执行的指令流需要什么,并且努力确保一切都在需要的时候准备就绪(例如,使用缓存来临时存储可能很快需要的东西)。
因此,就像 T 型车一样,每条指令从开始到结束执行需要相对较长的时间,但我们以更短的时间间隔完成另一个产品——理想情况下一个时钟一次(但请参阅我的另一个答案——现代设计通常每个时钟执行一条以上的指令。