【问题标题】:Faster cpu wastes more time as compared to slower cpu与较慢的 cpu 相比,较快的 cpu 浪费更多的时间
【发布时间】:2016-01-04 16:31:17
【问题描述】:

假设我有一个程序,它有一个指令来添加两个数字,并且该操作需要 10 纳秒(常数,由门制造商强制执行)。
现在我有 3 个不同的处理器 A、B 和 C(其中 A
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 个周期。

【问题讨论】:

  • 这就像在问“如果我有一辆更快的汽车,但道路迫使汽车需要 1 小时才能行驶 - 更快的汽车会浪费更多的速度吗?”。这没有意义。时钟告诉 CPU 的各个部分工作,它是使芯片的一部分不领先于另一部分的鼓声。当时钟告诉他们时,事情就会改变。如果你只是说“CPU C 有更快的时钟,但是加起来需要 10nS”,那么它是如何更快的 CPU 呢?更快的时钟在做什么?您已将时钟与其工作断开连接。添加可能需要固定的十个周期,但不是固定的10nS
  • 我提到cpu C速度更快,因此时钟频率高,这意味着每个周期的时间较短,这里是7ns。现在说,加法需要恒定的 10ns,因此它不会在一个 cpu C 周期内完成,因此需要 2 个。
  • 顺便说一句,你的数学是错误的,2 个周期,每个周期 7ns 是 14 ns,浪费了 4 个。
  • 我说这没有意义。如果在处理器 A 和 B 和 C 上加法需要 10nS,为什么你说 C 更快?如果做加法需要相同的时间,它不会更快。指令与时钟周期相关,而不是时间。这就是更快的时钟如何使处理器更快 - 通过每秒执行更多指令。在你的世界里,加法神奇地需要一个固定的时间,而时钟什么也不做,谁知道会发生什么。例如处理器 A 加法“需要 10nS”,也“需要 1 个完整的 15nS 周期”,还“浪费 5nS”。这只是“浪费”,因为时钟没有做任何事情。
  • @Brut3Forc3 与时钟周期相关的指令是“标准”的,因为“处理”是由电压组成的,当时钟触发它们改变时,电压就会改变。在两个寄存器中添加数字需要已知数量的电压变化(多少取决于 CPU 设计),因此需要一定数量的时钟周期。您可以更快地运行时钟并更快地添加。说它需要多少 nS 是没有意义的,因为它随时钟速度而变化。如果您正在设计一个每 nS 具有固定指令的 CPU(为什么??)那么......为什么还要改变 CPU A、B、C 的时钟速度?

标签: performance cpu clock computer-architecture


【解决方案1】:

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


首先,我的以下假设是否正确 - 1. 加法运算需要处理器 A(慢速处理器)的 1 个完整周期,并浪费剩余的 5 ns 周期。 2. 加法运算需要处理器 B 的 1 个完整周期,没有浪费时间。 3. 加法运算需要处理器 C(快速处理器)的 2 个完整周期(20 ns),浪费了剩下的 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 的一个时钟周期有 15 纳秒,B 有 10 纳秒,C 有 7 纳秒。

三个处理器中哪个最快?

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


  1. ADD 指令是什么意思,它是否纯粹意味着仅 ADD(在寄存器中具有可用的操作数)还是意味着获取 操作数,解码指令,然后实际添加 数字。

获取操作数是由 MOV op 完成的。如果您尝试比较 ADD 操作的执行速度,则应按时间进行比较以仅执行 ADD 操作。另一方面,如果你想知道两个数字相加的速度有多快,那么它会涉及比简单的ADD更多的操作。但是,如果有帮助,所有 Original 8086/8088 instructions 的列表也可以在 Wikipedia 上找到。

  1. 根据上面关于 add 实际含义的上下文,add 需要多少个周期,一个或多个。

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

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

  1. 为什么时钟周期是一个标准,因为它可能因处理器而异。纳秒不应该是标准。至少它是固定的。

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

  • Time to execute an instruction,
  • Processor Speed,和
  • Clock cycles needed for an instruction

第三个可以由此推导出来。

当您说 ADD 占用的时钟周期为 x 并且您知道处理器速度为 y MHz 时,您可以计算出添加的时间是 x / y。此外,您可以将执行 ADD 的时间称为 z ns,并且您知道处理器速度与之前的 y MHz 相同,您可以计算y * z 执行 ADD 所需的周期。

【讨论】:

  • 我认为你没有抓住重点。 OP 意味着由于时序限制,加法电路必须至少花费 10ns。在处理器 A 和 B 中让它也需要两个周期是没有意义的,加法适合时钟周期。
  • 这意味着无论是什么类型的处理器,ADD op总是需要两个时钟周期。不管cpu多快多慢,这样对吗?
  • @harold:加法电路不需要时间。它需要时钟周期。这就是我在行中所说的 - “...您使用错误的术语来表达手术时间”.
  • @Brut3Forc3:是的。快慢与操作的时钟周期无关。
  • 请回答这个问题 - 我有两个非常基本的问题,但我仍然很困惑。 1. ADD 指令是什么意思,它纯粹是指仅 ADD(操作数在寄存器中可用)还是意味着获取操作数,解码指令,然后实际添加数字。 2. 根据上面关于 add 实际含义的上下文, add 需要多少个周期,一个或多个。每个人对这两个问题都有不同的看法,这让我非常困惑
【解决方案2】:

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

对于绝大多数操作而言,具有高时钟周期的处理器更快的常规假设

例如,更智能的处理器可能会执行需要 X ns 的“开销任务”。 “开销任务”可能会使重复操作更快,但实际上可能会导致一次性操作(例如添加 2 个数字)花费更长的时间。

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

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

【讨论】:

  • 对不起,但它的回答完全不符合我的问题。
【解决方案3】:

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

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

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

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

【讨论】:

  • @Brut3Forc3 - 通常是这样,但为了使其更适用于所有可能的 cpu/mcu 类型,我使用了时间单位。这些数字之间的比例在这里更为重要。
  • 所以基本上一个操作在一个周期内执行。但这里的操作意味着只是添加,即添加两个数字或一堆操作,如获取解码和执行组合在一条指令中。
  • @Brut3Forc3 - 取决于您添加的内容、寄存器寄存器或寄存器内存等。 - 使用指令流水线,甚至可以在单个周期内执行多个 ADD,或者至少使用一些重叠以达到平均超过一个指令/周期。
【解决方案4】:

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

FWIW,Netburst (Pentium 4) 有交错的加法器,它在一个“半周期”中计算下半部分,在下一个“半周期”中计算上半部分(以及第三个半周期中的标志,在某种意义上给出了整个加法延迟为 1.5)。它并没有完全脱离这个世界,尽管 Netburst 总的来说相当疯狂——它必须做很多奇怪的事情才能把频率提高到那么高。但是那些半周期并不是一半(它不是,AFAIK,在每个侧面都先进的逻辑,它只是使用了时钟乘法器),您也可以将它们视为非常快的真实周期,大多数其余逻辑(除了那个疯狂的 ALU)以半速运行。

【讨论】:

  • 找不到聊天了兄弟。请发个链接
【解决方案5】:

您关于“CPU 偶尔会浪费时钟周期”的广泛观点是有效的。但总的来说,在现实世界中,一个好的 CPU 之所以成为一个好的 CPU,部分原因在于它如何缓解这个问题。

现代 CPU 由许多不同的组件组成,实际上它们的操作都不会花费固定的时间。例如,如果数据立即可用,则 ADD 指令可能会在每个时钟周期 1 条指令“突发”......这反过来意味着“如果获取该数据所需的 CPU 子组件在指令之前立即可用'。所以取决于例如另一个子组件必须等待缓存提取,例如,实际上 ADD 可能需要 2 或 3 个周期。一个好的 CPU 会尝试重新排序传入的指令流,以在正确的时间最大化子组件的可用性。

因此,与另一个处理器相比,您很可能会遇到特定系列指令在一个处理器上“次优”的情况。处理器的整体性能当然不仅仅与原始时钟速度有关:它还与巧妙的逻辑有关,该逻辑围绕接收输入指令流并计算出哪些指令的哪些部分触发到芯片的哪些子组件什么时候。

但是...我认为任何现代芯片都包含这样的逻辑。 2GHz 和 3GHz 处理器都会经常“浪费”时钟周期,因为(简单地说)在 CPU 的一个子组件上执行的“快速”指令必须等待另一个“较慢”子组件的输出结果。但总体而言,您仍会期望 3GHz 处理器“更快地执行实际代码”。

【讨论】:

  • 我有两个非常基本的问题,我仍然很困惑。 1. ADD 指令是什么意思,它纯粹是指仅 ADD(操作数在寄存器中可用)还是意味着获取操作数,解码指令,然后实际添加数字。 2. 根据上面关于 add 实际含义的上下文, add 需要多少个周期,一个或多个。每个人对这两个问题都有不同的看法,这让我非常困惑。
  • 所以通常我们所说的“ADD 指令”包括“单行汇编程序”中包含的所有步骤(对于处理器而言,包括处理器在某些宏级别上识别为“指令”的特定字节序列)。至于“多少个周期”,答案是……“很复杂”。处理器通常会有许多子组件,每个子组件都可能会在每个时钟周期提前,并且给定的指令将需要一些与上下文相关的数量才能“提前”完成指令。
  • 所以总的来说,一条特定的指令将需要一些平均范围的周期。几乎不可能说“这条指令保证需要这么多周期”。 (至少,在现代通用 CPU 上是这样。在旧架构上,或在专门设计为“实时”控制器的处理器上,处理器很可能为您提供这么多周期的保证——每条指令。)
  • 但是不应该有一个严格的加法最短时间,例如加法肯定需要 20ns 并且不管 cpu 多快都不会少于这个时间。或者可以通过超频cpu来打破每一个界限!
  • 嗯,物理定律最终确实对事物设置了限制,是的。我不确定这个问题归结为“执行操作 X 的严格最短时间”,而是更一般的限制,即流动电子的不同路径可以在不相互干扰的情况下靠得更近。
【解决方案6】:

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

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

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

即使对于标量(每个周期单个问题)流水线,时钟速度也不是性能的唯一决定因素。当功耗、制造成本(与产量相关,根据可销售的箱子和面积进行调整)、上市时间(及其可变性/可预测性)、工作负载多样性以及更先进的架构和微架构技术时,设计选择变得更加复杂考虑。

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

【讨论】:

  • 先生,我请求您尽可能简单地回答这个问题,我有两个非常基本的问题,我仍然很困惑。 1. ADD 指令是什么意思,它纯粹是指仅 ADD(操作数在寄存器中可用)还是意味着获取操作数,解码指令,然后实际添加数字。 2. 根据上面关于 add 实际含义的上下文, add 需要多少个周期,一个或多个。每个人对这两个问题都有不同的看法,这让我非常困惑。
  • @Brut3Forc3 “由门制造商强制执行”暗示(对我而言)它指的是加法操作(即,将两个数字相加)而不是 ADD 指令,因为该操作更原始(与制造技术更紧密地联系在一起,尽管制造技术并不能固定附加延迟)。我假设这是在流水线处理器的上下文中,因此完全处理 ADD 指令所需的时间不太有用,因为其他指令可以在 ADD 仍在流水线中时开始处理。你的困惑是可以理解的,因为
  • 练习似乎没有表达清楚。 “操作”意味着加法本身(不是指令处理的其他方面),但“那个”将操作链接到“一个指令以添加两个数字”。如果练习是在非流水线处理器的上下文中进行的,我会倾向于(基于“那个”)假设 10ns 应用于整个指令,因为指令处理时间在非流水线处理器中没有重叠。
  • (对于非流水线设计,更快的时钟可能有助于逻辑重用 - 例如,使用半角加法器 - 减小大小或更接近地将指令处理时间与整数时钟周期匹配。)在练习中,这意味着 A 浪费 5ns 而 C 浪费 4ns(两个 7ns 周期来处理 ADD 指令)。可悲的是,计算机体系结构练习似乎缺乏清晰性。在试图简单地假设问题时,通常没有明确声明。
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
相关资源
最近更新 更多