与较慢的 cpu 相比,更快的 cpu 浪费更多的时间

Faster cpu wastes more time as compared to slower cpu

假设我有一个程序,其中有一条指令将两个数字相加,并且该操作需要 10 纳秒(常数,由门制造商强制执行)。
现在我有 3 个不同的处理器 A、B 和 C(其中 A< B < C 就时钟周期而言)。

A​​的一个时钟周期有15纳秒,B有10纳秒,C有7纳秒。

首先,我的以下假设是否正确 -
1. 添加操作需要处理器 A(慢速处理器)的 1 个完整周期,并浪费该周期剩余的 5 ns。
2. 添加操作占用处理器 B 的 1 个完整周期,没有浪费时间。
3. 添加操作需要处理器 C(快速处理器)的 2 个完整周期(20 ns)浪费剩余的 20-14=7 ns。

如果上述假设是正确的,那么这是否与具有高时钟周期的处理器更快的常规假设相矛盾。
这里最快的处理器 C 实际上需要 2 个周期并浪费 7ns而较慢的处理器 A 只需要 1 个周期。

我不是专家,但我想说...

通常假设具有高时钟周期的处理器对于绝大多数操作来说速度更快

例如,更智能的处理器可能会执行需要 X ns 的 "overhead task"。 "overhead task" 可能会使重复操作更快,但实际上可能会导致 one-off 操作(例如添加 2 个数字)花费更长的时间。

现在,如果同一个处理器执行相同的操作 100 万次,它应该比速度较慢的智能处理器快得多。

希望我的想法有所帮助。欢迎您对我的想法提出反馈意见。

为什么速度更快的处理器比速度慢的处理器需要更多的周期来完成相同的操作?

更重要的是:现代处理器使用Instruction pipelining,因此在一个时钟周期内执行多个操作。

另外,我不明白你所说的'wasting 5ns',频率决定了时钟速度,因此执行所需的时间1个时钟。当然,例如 cpu 可能必须等待 I/O,但这适用于所有 cpu。

现代 cpu 的另一个重要方面是 L1、L2 和 L3 缓存以及多核系统中这些缓存的架构。例如:如果寄存器访问需要 1 个时间单位,则 L1 缓存访问将花费大约 2 个时间单位,而正常的内存访问将花费 50 到 100 个时间单位(而硬盘访问将花费数千个..)。

这实际上几乎是正确的,除了在处理器 B 上采用 2 个周期意味着 14ns,因此 10ns 就足够了,下一个周期在结果已经 "stable" 后 4ns 开始(尽管您可能需要如果你把它切碎,需要一些额外的时间来锁定部分结果)。这并没有那么矛盾,设置你的频率 "too high" 可能需要 trade-offs 这样的。您可能会做的另一件事是使用更多不同的电路或多米诺骨牌逻辑将加法的实际延迟再次降低到一个周期。更有可能的是,您不会一开始就将加法设置为 2 个周期。在这种情况下效果不是很好,至少不是为了加法。你可以做到,是的,基本上你必须 "round up" 电路花费的时间达到整数个周期。您还可以在按位运算中看到这一点,它比加法花费的时间更少,但仍然需要一个完整的周期。在机器 C 上,您可能仍然可以在单个周期中进行按位运算,对于某些工作负载,它甚至可能值得像这样拆分加法。

FWIW,Netburst(奔腾 4)有交错的加法器,它在一个 "half-cycle" 中计算下半部分,在下一个周期中计算上半部分(以及第三个半周期中的标志,在某种意义上给出了整体增加了 1.5 的延迟)。它并没有完全脱离这个世界,尽管 Netburst 总体上相当疯狂 - 它必须做很多奇怪的事情才能将频率提高到那么高。但是那些 half-cycles 不是一半(据我所知,它不是在每个侧翼上推进的逻辑,它只是使用了一个时钟倍频器),你也可以将它们视为非常快的真实周期,其余大部分逻辑(除了那个疯狂的 ALU)运行 半速。

您的笼统观点 'a CPU will occasionally waste clock cycles' 是正确的。但总的来说,在现实世界中,好的 CPU 之所以成为好的 CPU,部分原因在于它如何缓解这个问题。

现代 CPU 由许多不同的组件组成,none 其操作最终将在实践中花费恒定的时间。例如,如果数据立即可用,则 ADD 指令可能 'burst' 每个时钟周期 1 条指令……这反过来意味着 'if the CPU subcomponents required to fetch that data were immediately available prior to the instruction'。所以取决于是否另一个子组件必须等待缓存获取,例如,ADD 实际上可能需要 2 或 3 个周期。好的 CPU 会尝试 re-order 传入的指令流,以在正确的时间最大化子组件的可用性。

因此,您很可能会遇到这样的情况,即与另一个处理器相比,一个处理器上的特定指令系列 'suboptimal'。处理器的整体性能当然不仅仅与原始时钟速度有关:它与围绕输入指令流并计算出哪些指令的哪些部分触发芯片的哪些子组件的智能逻辑同样重要什么时候.

但是...我认为任何现代芯片都包含这样的逻辑。 2GHz 和 3GHz 处理器都会定期 "waste" 时钟周期,因为(简单地说)在 CPU 的一个子组件上执行的 "fast" 指令必须等待输出结果来自另一个 "slower" 子组件。但总体而言,您仍会期望 3GHz 处理器达到 "execute real code faster".

无论如何,处理器 C 是最快的。每个周期需要 7 ns,因此执行的周期比 A 和 B 多。电路不够快不是 C 的错。如果您以在 1 ns 内给出结果的方式实现加法电路,则所有处理器将在 1 个时钟周期内给出答案(即 C 将在 7ns 内给出答案,B 在 10ns 内给出答案,A 在 15ns 内给出答案)。


Firstly am I correct on my following assumptions- 1. Add operation takes 1 complete cycle of processor A(slow processor) and wastes rest of 5 ns of the cycle. 2. Add operation takes 1 complete cycle of processor B wasting no time. 3. Add operation takes 2 complete cycles(20 ns) of processor C(fast processor) wasting rest of the 20-7=13 ns.

没有。这是因为您使用不完整的数据来表示操作的时间。测量在 时钟周期 中完成特定处理器上的操作所花费的时间,而不是像您在此处所做的那样 纳秒 。当您说 ADD op 需要 10 ns 并且您没有提及您测量 ADD op 时间的处理器时,时间测量在ns 没有意义。

所以当你说 ADD 运算在所有三个处理器上都需要 2 个时钟周期时,那么你已经标准化了测量。标准化测量可以翻译为:

  • A 加法所花费的时间 = 2 个时钟周期 * 每个周期 15 ns = 30 ns
  • B 加法所花费的时间 = 2 个时钟周期 * 每个周期 10 ns = 20 ns
  • C 加法所花费的时间 = 2 个时钟周期 * 每个周期 07 ns = 14 ns

如果你没有注意到,当你说:

A's one clock cycle has 15 nanosec, B has 10 nanosec and C has 7 nanosec.

三个处理器中哪个最快?

答:C最快。它的一个周期在 7ns 内完成。这意味着它在一秒内完成 109/7 (~= 1.4 * 108) 个周期,而 B 完成 109/10 (= 108) 在一秒内循环,相比之下 A 仅完成 109/一秒内 15 (~= 0.6 * 108) 个周期。


  1. What does a ADD instruction mean, does it purely mean only and only ADD(with operands available at the registers) or does it mean getting the operands, decoding the instruction and then actually adding the numbers.

获取操作数由MOV op完成。如果你想比较 ADD 操作的完成速度,应该按时间比较只执行 ADD 操作。另一方面,如果您想要了解两个数字相加的速度有多快,那么它将涉及比简单的 ADD 更多的操作。但是,如果有帮助,所有 Original 8086/8088 instructions 的列表也可以在维基百科上找到。

  1. Based on the above context to what add actually means, how many cycles does add take, one or more than one.

这将取决于处理器,因为每个处理器的加法器实现方式可能不同。有很多方法可以生成两个数字的加法。再次引用 Wikipedia - 全加器可以用许多不同的方式实现,例如使用自定义 transistor-level 电路或由其他门组成。

此外,指令中可能存在流水线,这会导致数字相加的并行化,从而节省大量时间。

  1. Why is clock cycle a standard since it can vary with processor to processor. Shouldn't nanosec be the standard. Atleast its fixed.

如果您想知道处理器执行一条指令所花费的时间,时钟周期和处理器速度可以是标准。从中选择任意两个:

  • Time to execute an instruction,
  • Processor Speed,以及
  • Clock cycles needed for an instruction.

第三个可以推导出来

当你说 ADD 占用的时钟周期是 x 并且你知道处理器速度是 yMHz,可以计算出ADD的时间为x / y。此外,您可以提及执行 ADD 的时间为 z ns 并且您知道处理器速度相同 y MHz 如前所述,您可以计算执行 ADD 所需的周期为 y * z.

首先,如果执行加法的10ns时间不包括流水线开销(时钟偏移和锁存延迟),那么处理器B不能在一个10ns时钟周期内完成加法(有这些开销),但是处理器A可以,处理器 C 仍然可以在两个周期内完成。

其次,如果加法本身是流水线的(或其他功能单元可用),则后续的non-dependent操作可以在下一个循环中开始执行。 (如果加法是width-pipelined/staggered(如中提到的)那么即使是依赖加法,逻辑运算和左移也可以在一个循环后开始。但是,如果练习限制加法时间,大概也禁止其他优化来简化练习。)如果相关操作不是特别常见,那么处理器 C 的更快时钟将导致更高的性能。 (例如,如果依赖停顿每四个周期发生一次,那么,忽略其他影响,处理器 C 可以每五个 7ns 周期(35 ns;前三个指令在执行中重叠)完成四个指令,而处理器 B 为 40ns(假设添加时序包括流水线开销。​​)(注意:您的假设 3 不正确,处理器 C 的两个周期为 14ns。)

第三,时钟周期中的额外时间可用于支持更复杂的操作(例如,将一个操作数预移一个小的立即值,甚至添加三个数字——carry-save 加法器的延迟相对较小),从其他流水线阶段窃取工作(可能减少流水线阶段的数量,这通常会减少分支预测错误的惩罚),或者通过使用更简单的逻辑来减少面积或功耗。此外,额外的时间可用于支持更大(或关联性更强)的高速缓存,并具有固定的周期延迟,从而降低未命中率。这些因素可以补偿处理器 A 中 5ns 的 "waste"。

即使对于标量(每个周期单个问题)管道时钟速度也不是性能的唯一决定因素。当功率、制造成本(与产量相关,根据可销售箱和面积调整)、time-to-market(及其 variability/predictability)、工作负载多样性以及更高级的架构和微架构时,设计选择变得更加复杂技术被考虑。

时钟频率决定性能的错误假设甚至还有一个名字:Megahertz myth