移位操作码真的比移动指令快3倍吗?英特尔x86

3
在我的Intel x86 Pentium手册中,它说ADD和SAL/SHR等移位操作需要1/3的时钟周期,而JMP和MOV等操作需要1个时钟周期。一堆加法和移位操作真的比一堆MOV操作快3倍吗?
我感到困惑的原因是网上有一个“Pentium M”的“延迟时间”表格,没有一个时间是1/3,尽管有几个是1/2。这是因为我的书已经过时了,在更新的Pentium处理器上,移位操作与JMP的速度相同吗?

1
原始的 Pentium 处理器是从 1993 年开始推出的,但现在已经有很多变化了! - Bo Persson
2个回答

10
不要将“延迟”与“倒数吞吐量”混淆。
- “延迟”是指执行一条指令需要多少个周期。 - “倒数吞吐量”是指处理器可以维持多少个指令在一个周期内执行。
你看到的“1/3”并不是指延迟,而是倒数吞吐量。如果这些操作之间互相独立,那么处理器可以每个周期执行3次ADD操作。但每个ADD操作至少需要1个周期才能完成。
如果延迟为“1”,倒数吞吐量为“1/3”,则处理器可以同时执行最多3个ADD操作。但每个操作仍然需要1个周期。
历史上,大多数英特尔处理器(自Pentium以来)都有3个主要执行单元,可以执行基本操作,如加法和移位。这就是为什么大多数操作的倒数吞吐量为“1/3”。
寄存器到寄存器的MOV操作也应该是“1/3”。但是触及内存的MOV操作(即加载和存储)历史上只有1个周期。(最近随着Sandy Bridge和以后的处理器,这已经得到改善。)

“自从Pentium以来?”自 Pentium 以来,架构已经完全改变了好几次,尽管根据http://www.agner.org/optimize/instruction_tables.pdf的说法,回溯到 Pentium M 的所有更改似乎都是相对进化的。 - Pascal Cuoq

3
假设这是关于原始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更慢,我想这是有道理的。 - Tyler Durden
@TylerDurden:是的,基本上就是这样。我似乎有一个模糊的记忆,在那个时候手册上有一个打字错误,显示的是1/3,实际应该是1/2(也就是说,所谓的三个周期延迟实际上只有两个)。 - Jerry Coffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接