dob*_*bus 37 cpu process computer-architecture
由于 PC 的 INTEL 8086 处理器和 Apple 的 Rockwell 6502 处理器之间的差异,Megahertz Myth 成为一种促销策略。8086 的运行频率为 4.77MHz,而 6502 的运行频率为 1MHz。然而,6502 上的指令需要更少的周期;事实上,它的运行速度比 8086 快得多。 为什么有些指令需要更少的周期?为什么6502需要更少周期的指令不能与8086的快速循环处理器结合?
维基百科关于每周期指令(IPC)的文章说
控制 IPC
的因素可以通过高 IPC 和低时钟速度实现给定的每秒指令水平……或者通过低 IPC 和高时钟速度实现。
为什么不能同时拥有高指令周期和高时钟速度?
也许这与时钟周期是什么有关?维基百科提到电路同步?不确定那是什么意思。
或者这可能与管道的工作方式有关?我不确定为什么短管道中的指令与长管道中的指令不同。
任何见解都会很棒!只是想了解神话背后的架构。谢谢!
参考:
soa*_*dos 21
较短的流水线意味着更快的时钟速度,但可能会降低吞吐量。另外,请参阅底部的答案 #2 和 3(我保证它们很短)。
这里有几件事情需要考虑:
一个非常简化的管道(现代英特尔芯片中发生的事情非常复杂)有几个阶段:
获取 -> 解码 -> 内存访问 -> 执行 -> 回写 -> 程序计数器更新
在每个 -> 都会产生时间成本。此外,每一个滴答声(时钟周期),一切都从一个阶段移动到下一个阶段,所以你最慢的阶段变成了所有阶段的速度(让它们的长度尽可能相似确实是值得的)。
假设您有 5 条指令,并且您想执行它们(图片来自维基百科,此处未完成 PC 更新)。它看起来像这样:

尽管每条指令需要 5 个时钟周期才能完成,但每个周期都会有一条完成的指令从流水线中出来。如果每个阶段花费的时间是 40 ns,中间位花费 15 ns(使用我上面的六阶段流水线),则需要 40 * 6 + 5 * 15 = 315 ns 才能输出第一条指令。
相比之下,如果我要完全消除管道(但保持其他所有内容相同),则只需 240 ns 即可输出第一条指令。(这种获取“第一条”指令的速度差异称为延迟。它通常不如吞吐量重要,吞吐量是每秒的指令数)。
但真正不同的是,在流水线示例中,我每 60 ns 完成一个新指令(在第一个指令之后)。在非流水线中,每次需要 240。这表明管道擅长提高吞吐量。
更进一步,似乎在内存访问阶段,我将需要一个加法单元(进行地址计算)。这意味着如果有一条指令不使用该循环的 mem 阶段,那么我可以做另一个添加。因此,我可以一次在一个处理器上执行两个执行阶段(其中一个处于内存访问阶段)(调度是一场噩梦,但我们不要去那里。此外,PC 更新阶段还需要一个附加单元跳跃的情况下,所以我可以在一个滴答声中完成三个加法执行状态)。通过拥有流水线,可以设计成两条(或更多)指令可以使用不同的阶段(或跳跃阶段等),从而节省宝贵的时间。
请注意,为了做到这一点,处理器做了很多“魔术”(乱序执行、分支预测等等),但这允许多条指令比没有流水线的情况更快(注意流水线太long 非常难以管理,并且仅通过在阶段之间等待会产生更高的成本)。另一面是,如果流水线太长,可能会获得疯狂的时钟速度,但会失去许多原始优势(可以在多个地方存在相同类型的逻辑,并且可以同时使用) )。
SIMD(单指令多数据)处理器(与大多数 GPU 一样)在许多位信息上做了大量工作,但它们需要更长的时间来完成。读取所有值需要更长的时间(意味着更慢的时钟,尽管在某种程度上通过更宽的总线来偏移)但您可以一次完成更多的指令(每个周期更有效的指令)。
因为您可以“欺骗”并人为地延长周期数,以便您每个周期可以执行两条指令(只需将时钟速度减半)。也可以每两个刻度只做一些事情而不是一个(提供 2 倍的时钟速度,但不改变指令一秒)。
我过于简单化了这一点,但要记住的重要一点是,这些术语是将苹果与橙子进行比较。“周期”不是所有处理器都相同的单一统一度量单位,就像“秒”是时间的统一度量。相反,一个循环代表了某个工作单元,它的定义有些随意,但受管道设计的复杂性和物理的限制。
在许多情况下,在一个周期内完成大量工作可以让您清理整个管道。如果成功,这意味着您的下一个周期将无法优化,因为您必须再次填充管道,这可能需要一些时间。
我可以设计一个非常简单的处理器,每个周期处理一个 RISC 指令的一个阶段,如果这是我的 CPU 的基础,我可能会实现非常非常高的每秒周期数,因为构成“a循环”。
细节涉及很多我不太了解的物理和电气工程,但请记住,仅通过向处理器添加输入电压并希望获得最佳效果并不能实现时钟速率。至少,热剖面是另一个必要的关注点。
这是一个非常简单(可能过于简单化)的解释:假设您有一项特定的工作要做,比如将两个 32 位数字相加。你可以采取两种方法。您可以将其拆分为大量非常小的步骤,也可以将其拆分为少量的非常大的步骤。
例如,您可以只说“将两个数字相加”。现在你只有一步了。但该步骤有多个部分,需要更长的时间才能完成。所以你每个周期有很多指令——在这种情况下是一个。但是您的时钟速度不能很高,因为在那个周期中您有很多事情要做。
您也可以说,“将第一个数字取出到寄存器中。然后取出第二个数字。然后添加最低有效位。然后将第二个最低有效位与之前的进位相加。然后添加第三个最低有效位...... 。然后添加最高有效位。如果有进位,设置溢出标志。然后将结果写入内存。” 现在你有大量的步骤。但每一步都可能快得离谱。因此,每个周期的指令很少(在这种情况下为 1/36 左右)。但是您的时钟速度可能非常高,因为每个周期只有很少的工作要做。
为了同时拥有高指令周期和高时钟速度,您必须将复杂指令划分为极少数非常简单的步骤。但这无法完成,因为指令很复杂。
实际的具体权衡和周期数有很大不同,因为现代 CPU 是流水线式的并且指令重叠。但基本思想是正确的。