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

Performance 移位操作码真的比移动快3倍吗?英特尔x86,performance,assembly,x86,Performance,Assembly,X86,在我的英特尔x86奔腾手册中,它说像SAL/SHR这样的加法和移位需要1/3个时钟,而像JMP和MOV这样需要1个时钟。这真的是真的吗?一组加法和移位的速度是一组MOV的3倍 我想我是倍感困惑,因为网络上有一张“延迟”表显示“奔腾M”,并且没有一个计时是1/3,尽管有一些是1/2。这是因为我的书很旧,在新的奔腾上,shift的速度与JMP相同吗?不要混淆“延迟”和“交互吞吐量” Latency是执行一个指令实例所需的周期数 交互吞吐量是处理器每个周期可以支持的指令数 您看到的1/3不是延迟。

在我的英特尔x86奔腾手册中,它说像SAL/SHR这样的加法和移位需要1/3个时钟,而像JMP和MOV这样需要1个时钟。这真的是真的吗?一组加法和移位的速度是一组MOV的3倍

我想我是倍感困惑,因为网络上有一张“延迟”表显示“奔腾M”,并且没有一个计时是1/3,尽管有一些是1/2。这是因为我的书很旧,在新的奔腾上,shift的速度与JMP相同吗?

不要混淆“延迟”和“交互吞吐量”

  • Latency是执行一个指令实例所需的周期数
  • 交互吞吐量是处理器每个周期可以支持的指令数
您看到的
1/3
不是延迟。这是倒数吞吐量。处理器每周期可支持3次加法。(如果它们都是独立的)但每一个仍然需要至少1个周期来执行

如果延迟
1
和反向吞吐量
1/3
,这意味着处理器最多可以同时执行3次加法。但每一个仍然需要1个周期


从历史上看,大多数英特尔处理器(从奔腾开始)都有3个主要执行单元,它们都可以执行添加和移位等基本操作。这就是为什么大多数都是
1/3
交互吞吐量的原因


寄存器到寄存器MOV也应为
1/3
。但触摸记忆(即加载和存储)的MOV历史上仅为1/周期。(最近在Sandy Bridge和更高版本中,这一比例有所增加。)

假设这是关于原始奔腾(即,不是奔腾Pro或更高版本),那么
1/3
并不意味着“三分之一”(或类似的东西)。这意味着指令具有1个周期的吞吐量和3个周期的延迟(即,每个周期可以启动一条指令,每个周期可以完成一条指令,但指令需要三个管道阶段,因此在启动和完成特定指令之间有三个周期的延迟)

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


后来的处理器(从奔腾Pro开始)增加了无序指令调度,以及在一个周期内执行两条以上指令的能力(可以有相当多的“正在运行”,但限制为每个周期三条指令失效)。奔腾IV增加了在一个时钟周期内在同一个执行单元中执行两条极其简单的指令(寄存器到寄存器和,或不,添加,子,单位移位)的能力(也就是说,它有一个执行单元,其实际运行速度是额定时钟速度的两倍,因此,例如,在2.8 GHz处理器上,少量电路实际运行速度为5.6 GHz)。

1993年的原始奔腾?此后有些事情发生了变化!这是我的书:。这本书是“英特尔奔腾处理器系列开发人员手册第3卷:体系结构和编程手册”"1995年。好的,那么你是说1/3意味着一个给定的ADD/SHR总是需要至少3个时钟来执行?如果是这样,这显然意味着ADD/SHR比JMP/MOV慢,我认为这是有道理的。@Tylerduden:是的,差不多是这样。我似乎对当时手册中的一个打字错误有模糊的记忆,其中something显示为1/3,本应为1/2(即,显示为三个周期的延迟实际上仅为2)。“自奔腾以来?”体系结构自奔腾以来发生了几次彻底的变化,尽管英特尔处理器中所有回到奔腾M的变化似乎都是渐进式的