![为什么不能同时拥有高每周期指令数和高时钟速度?](https://linux22.com/image/1321608/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E5%90%8C%E6%97%B6%E6%8B%A5%E6%9C%89%E9%AB%98%E6%AF%8F%E5%91%A8%E6%9C%9F%E6%8C%87%E4%BB%A4%E6%95%B0%E5%92%8C%E9%AB%98%E6%97%B6%E9%92%9F%E9%80%9F%E5%BA%A6%EF%BC%9F.png)
由于 PC 的 INTEL 8086 处理器与 Apple 的 Rockwell 6502 处理器之间存在差异,兆赫神话成为一种促销策略。8086 的运行速度为 4.77MHz,而 6502 的运行速度为 1MHz。但是,6502 上的指令所需的周期更少;事实上,少了很多,以至于它的运行速度比 8086 更快。 为什么有些指令需要更少的周期?为什么需要更少周期的 6502 指令不能与 8086 的快速周期处理器相结合?
维基百科关于每周期指令数 (IPC) 的文章说
控制 IPC 的因素
可以通过高 IPC 和低时钟速度来实现给定级别的每秒指令数...或者通过低 IPC 和高时钟速度来实现。
为什么不能同时拥有高每周期指令数和高时钟速度?
也许这与时钟周期有关?维基百科提到了电路同步?不确定那是什么意思。
或者这可能与管道的工作方式有关?我不确定为什么短管道中的指令与长管道中的指令不同。
任何见解都很好!只是想了解神话背后的架构。谢谢!
参考:
答案1
总结
管道越短意味着时钟速度越快,但可能会降低吞吐量。另外,请参阅底部的答案 #2 和 3(我保证它们很短)。
较长的版本:
这里有几点需要考虑:
- 并非所有指令都需要相同的时间
- 并非所有指令都依赖于之前立即(甚至十或二十个)指令所执行的操作
一个非常简化的管道(现代英特尔芯片中发生的事情非常复杂)有几个阶段:
获取 -> 解码 -> 内存访问 -> 执行 -> 写回 -> 程序计数器更新
每次 -> 都会产生时间成本。此外,每个时钟周期,所有内容都会从一个阶段移动到下一个阶段,因此最慢的阶段将成为所有阶段的速度(让它们的长度尽可能相似确实很有价值)。
假设您有 5 条指令,并且想要执行它们(图片取自维基百科,此处 PC 更新尚未完成)。它看起来会像这样:
尽管每条指令需要 5 个时钟周期才能完成,但每个周期都会有一条完成的指令从流水线中输出。如果每个阶段所需的时间为 40 纳秒,中间位所需的时间为 15 纳秒(使用我上面的六阶段流水线),则需要 40 * 6 + 5 * 15 = 315 纳秒才能输出第一条指令。
相比之下,如果我完全消除管道(但其他所有条件保持不变),则只需 240 纳秒即可发出第一条指令。(发出“第一条”指令的速度差异称为延迟。它通常不如吞吐量(即每秒的指令数)重要)。
但真正的不同之处在于,在流水线示例中,我每 60 纳秒完成一条新指令(在第一条指令之后)。在非流水线示例中,每次需要 240 纳秒。这表明流水线有利于提高吞吐量。
更进一步说,似乎在内存访问阶段,我需要一个加法单元(进行地址计算)。这意味着,如果循环中有一条指令不使用内存阶段,那么我可以再做一次加法。因此,我可以在单个时钟周期内在一个处理器上执行两个执行阶段(其中一个在内存访问阶段)(调度是一场噩梦,但我们不必去那里。此外,在发生跳转的情况下,PC 更新阶段也需要一个加法单元,因此我可以在一个时钟周期内执行三个加法执行状态)。通过使用管道,可以设计两个(或更多)指令可以使用不同的阶段(或跳跃阶段等),从而节省宝贵的时间。
请注意,为了做到这一点,处理器做了很多“魔法”(无序执行,分支预测以及更多),但这允许多条指令以比没有流水线时更快的速度输出(请注意,太长的流水线很难管理,并且仅在阶段之间等待就会产生更高的成本)。另一方面,如果将流水线弄得太长,您可以获得疯狂的时钟速度,但会失去许多原有的好处(拥有可以存在于多个位置并同时使用的同类型逻辑)。
答案#2:
SIMD(单指令多数据)处理器(如大多数 GPU)对许多信息位进行大量工作,但需要更长的时间来完成。读取所有值需要更长的时间(意味着时钟更慢,尽管这在一定程度上可以通过更宽的总线来弥补),但您可以一次完成更多指令(每个周期更有效的指令)。
答案#3:
因为您可以“作弊”人为地延长周期数,这样您就可以在每个周期执行两条指令(只需将时钟速度减半)。也可以每两个滴答而不是一个滴答执行某项操作(时钟速度增加 2 倍,但每秒的指令数不变)。
答案2
我把这个概念过于简单化了,但需要记住的重点是,这些术语是将苹果和橘子进行比较。“周期”并不是一个统一的度量单位,它在所有处理器上都是一样的,就像“秒”是时间的统一度量单位一样。相反,周期代表一个特定的工作单元,它的定义有些随意,但受管道设计的复杂性和物理特性的限制。
在许多情况下,在一个周期内完成大量工作可以让你清除整个管道。如果成功,这意味着你的下一个周期将无法优化,因为你必须再次填充管道,这可能需要一些时间。
我可以设计一个非常简单的处理器,每个周期处理一个 RISC 指令的一个阶段,如果这是我的 CPU 的基础,那么我可能可以实现非常非常高的每秒周期数,因为构成“一个周期”的复杂性降低了。
细节涉及很多我不太了解的物理学和电子工程,但请记住,时钟速率不是通过简单地向处理器添加输入电压并希望获得最佳效果来实现的。至少,热分布是另一个必要的考虑因素。
答案3
这是一个非常简单(也许过于简单化)的解释:假设您有一项特定的任务要做,比如将两个 32 位数相加。您可以采取两种方法。您可以将其拆分成大量非常小的步骤,也可以将其拆分成少量非常大的步骤。
例如,您可以直接说“将两个数字相加”。现在您只需要一个步骤。但该步骤包含多个部分,需要更长的时间来完成。因此,您每个周期的指令数较多——在本例中为一条。但您的时钟速度不能很高,因为您有一个很多在那个循环中要做的事情。
您也可以这样说:“将第一个数字放入寄存器。然后取出第二个数字。然后添加最低有效位。然后将第二最低有效位与之前的进位相加。然后添加第三最低有效位……然后添加最高有效位。如果有进位,则设置溢出标志。然后将结果写入内存。”现在您有大量步骤。但每一步都可能快得离谱。因此,每个周期的指令很少(在这种情况下为 1/36 左右)。但您的时钟速度可以非常高,因为每个周期只有很少的位要执行。
为了同时实现高指令执行率和高时钟速度,你必须将复杂的指令分成非常少的几个非常简单的步骤。但是这无法实现,因为指令非常复杂。
由于现代 CPU 是流水线式的并且指令重叠,因此实际的具体权衡和周期数有很大差异。但基本思想是正确的。
答案4
您的计算机完成特定任务所需的时间并不取决于计算机的时钟速度......而是取决于计算单元的设计和制造方式。
时钟速度实际上是 CPU 设计师做出的(或多或少)任意决定,有时是出于好的理由(效率),有时是出于不好的理由(广告)。
假设给定的 CPU 具有需要 1 到 100 纳秒 (ns) 才能完成的混合指令。您可以将时钟速率设置为 1“刻度”为 100 ns (10 MHz),这意味着每条指令都将在 1 刻度内完成。但是,如果指令执行时间均匀分布,这意味着您的计算单元将在 50% 的时间内处于空闲状态(平均执行速度为 50ns,而刻度的其他 50ns 则处于空闲状态)。另一方面,如果您将刻度设置为 10ns,则指令的范围将在 1 到 10 个刻度之间,但单元在下一条指令开始之前绝不会空闲超过 9ns,平均空闲时间为 5ns。这意味着您的平均空闲时间从 50%(每 100 个中的 50ns 的平均值)下降到 9%(因为平均执行时间现在是 55ns(平均执行 50ns + 平均空闲 5ns))。
在开发过程中,CPU 将被设计为以一定的速度运行,这取决于 CPU 实际能够执行的工作量。如果你提高或降低时钟速度,你实际上并没有改变 CPU 可以完成的工作量,你只是在干扰它的效率比。
(在您抱怨 CPU 超频之前:这为您带来了两个好处,可带来实际速度提升:快速执行指令(耗时不到 1 个周期)可缩短执行时间,并且所有指令的空闲时间都更少。这两项实际上都可以增加计算机可以执行的工作量,但您会发现,在基准测试中,将 CPU 超频 X% 并不总是等于工作量增加 X%。)
总结
CPU 一秒钟可以完成 X 项工作。如果使用 H 时钟速度和 I IPC,则 I=X/H。更改 H 不会更改 X,但会对 I 产生相反的影响。