在我的 Intel x86 Pentium 手册中,它说像 SAL/SHR 这样的 ADD 和移位需要 1/3 个时钟,而 JMP 和 MOV 需要 1 个时钟。一堆加法和移位会比一堆移动快 3 倍,这真的是真的吗?
我想我很困惑,因为网络上有显示“Pentium M”的“延迟”表,但没有一个时间是 1/3,尽管有一些是 1/2。这是因为我的书很旧而且在较新的 Pentium 上换档的速度与 JMP 相同吗?
在我的 Intel x86 Pentium 手册中,它说像 SAL/SHR 这样的 ADD 和移位需要 1/3 个时钟,而 JMP 和 MOV 需要 1 个时钟。一堆加法和移位会比一堆移动快 3 倍,这真的是真的吗?
我想我很困惑,因为网络上有显示“Pentium M”的“延迟”表,但没有一个时间是 1/3,尽管有一些是 1/2。这是因为我的书很旧而且在较新的 Pentium 上换档的速度与 JMP 相同吗?
不要将“延迟”与“互惠吞吐量”混淆。
你1/3
看到的不是延迟。这是互惠的吞吐量。处理器每个周期可以维持 3 个 ADD。(如果它们都是独立的)但是每个仍然需要至少1个周期才能执行。
如果您的延迟1
和倒数吞吐量为1/3
,则意味着处理器可以同时执行多达 3 个 ADD。但是每个仍然需要1个周期。
从历史上看,大多数 Intel 处理器(从 Pentium 开始?)都有 3 个主要执行单元,它们都可以执行基本操作,例如加法和移位。这就是为什么其中大多数是1/3
互惠的吞吐量。
寄存器到寄存器的 MOV 也应该是1/3
. 但是接触内存(即加载和存储)的 MOV 在历史上只有 1 个/周期。(最近在 Sandy Bridge 和后来,这已经增加了。)
假设这是关于最初的 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 运行)。