【问题标题】:Are shift op codes really 3 times faster than moves? Intel x86移位操作码真的比移动快 3 倍吗?英特尔 x86
【发布时间】:2012-09-26 18:59:56
【问题描述】:

在我的 Intel x86 Pentium 手册中,它说像 SAL/SHR 这样的 ADD 和移位需要 1/3 时钟,而 JMP 和 MOV 需要 1 个时钟。一堆 add 和 shift 比一堆 mov 快 3 倍,这真的是真的吗?

我想我很困惑,因为网络上有显示“Pentium M”的“延迟”表,但没有一个时间是 1/3,尽管有一些是 1/2。这是因为我的书比较旧,而且在较新的 Pentium 上换档速度与 JMP 相同?

【问题讨论】:

  • 1993 年的原始奔腾?从那以后有些事情发生了变化!
  • 这是我的书:marketplace.vintage-computer.com/…。这本书是 1995 年出版的《Intel Pentium Processor Family Developer's Manual Vol 3: Architecture and Programming Manual》。

标签: performance assembly x86


【解决方案1】:

不要将“延迟”与“互惠吞吐量”混淆。

  • 延迟是执行一个指令实例所需的周期数。
  • 互惠吞吐量是处理器每个周期可以承受的指令数。

您看到的1/3 不是延迟。这是互惠的吞吐量。处理器每个周期可以维持 3 个 ADD。 (如果它们都是独立的)但是每个仍然需要至少1个周期才能执行。

如果您有 1 的延迟和 1/3 的倒数吞吐量,这意味着处理器最多可以同时执行 3 个 ADD。但是每一个仍然需要1个周期。


从历史上看,大多数 Intel 处理器(从 Pentium 开始?)都有 3 个主要执行单元,它们都可以执行基本操作,例如加法和移位。这就是为什么其中大多数是1/3 互惠吞吐量。

Register-to-register MOV 也应该是1/3。但是接触内存(即加载和存储)的 MOV 在历史上只有 1 个/周期。 (最近与 Sandy Bridge 及以后的情况有所增加。)

【讨论】:

  • “从奔腾开始?”根据agner.org/optimize/instruction_tables.pdf 的说法,自 Pentium 以来,架构已经完全改变了好几次,尽管 Intel 处理器的所有变化都回到 Pentium M 似乎是相当进化的
【解决方案2】:

假设这是关于原始 Pentium(即,不是 Pentium Pro 或更新版本),1/3 并不意味着“三分之一”(或类似的东西)。这意味着该指令具有 1 个周期的吞吐量和 3 个周期的延迟(即每个周期可以开始一条指令,每个周期可以完成一条指令,但是该指令需要三个流水线阶段,因此在开始和结束之间存在三个周期的延迟)特定指令)。

最初的 Pentium 只有两个执行单元,没有乱序执行。在给定的时钟周期内,下一条指令将在 U 流水线中执行。如果满足正确的条件,之后的指令可以在 V 流水线中执行。在任何情况下,在任何给定周期内执行的指令都不会超过两条,在任何情况下,单个流水线中每个时钟执行的指令都不会超过一条。

后来的处理器(从 Pentium Pro 开始)添加了乱序指令调度,以及在单个周期内执行两条以上指令的能力(可能有更多的“正在运行”的指令,但仅限于每个周期淘汰三条指令) . Pentium IV 增加了在单个时钟周期内在同一个执行单元中执行 2 个极其简单的指令(寄存器到寄存器 AND、OR、NOT、ADD、SUB、单位移位)的能力(即,它有一个执行单元实际上以两倍于额定时钟速度运行,例如,在 2.8 GHz 处理器上,少量电路实际上以 5.6 GHz 运行)。

【讨论】:

  • 好的,你是说 1/3 意味着给定的 ADD/SHR 总是需要至少 3 个时钟来执行?如果是这样,这显然意味着 ADD/SHR 比 JMP/MOV 慢,我认为这是有道理的。
  • @TylerDurden:是的,差不多就是这样。我似乎对那个时候手册中的一个错字有一个模糊的记忆,虽然显示为 1/3,但应该是 1/2(即显示为三个周期延迟的实际上只有 2)。
猜你喜欢
  • 2011-09-18
  • 2011-04-29
  • 2016-08-31
  • 2012-02-25
  • 2013-11-05
  • 1970-01-01
  • 2023-03-06
  • 2014-04-02
  • 2012-11-03
相关资源
最近更新 更多