X86 英特尔&x27;的控制指令和移动指令延迟是多少;什么是新的体系结构?

X86 英特尔&x27;的控制指令和移动指令延迟是多少;什么是新的体系结构?,x86,intel,machine-code,micro-architecture,X86,Intel,Machine Code,Micro Architecture,我正在看(第759页)。我正在寻找哈斯韦尔和天湖建筑MOV、PUSH、JMP、CALL指令在该表中故意省略。没有给出延迟信息。为什么呢?不过,第776页给出了Atom处理器的指令延迟 有趣的是,来自英特尔的指令有MOV、PUSH和CALL指令延迟 Agner's为MOV和PUSH提供延迟,但跳过控制指令,如JMP和CALL。知道为什么吗?简单的回答是,对于控制指令和许多类型的独立mov指令,延迟实际上并不是一个有意义的指标 在你提到的评论中: 我参考的是英特尔的控制指令手册。我 控制指令的平均延

我正在看(第759页)。我正在寻找哈斯韦尔和天湖建筑<代码>MOV、PUSH、JMP、CALL指令在该表中故意省略。没有给出延迟信息。为什么呢?不过,第776页给出了Atom处理器的指令延迟

有趣的是,来自英特尔的指令有
MOV
PUSH
CALL
指令延迟


Agner's为
MOV
PUSH
提供延迟,但跳过控制指令,如
JMP
CALL
。知道为什么吗?

简单的回答是,对于控制指令和许多类型的独立mov指令,延迟实际上并不是一个有意义的指标

在你提到的评论中:

我参考的是英特尔的控制指令手册。我 控制指令的平均延迟是指 一段时间内失效的指令数的数据,然后 花时间/(指令数量)

当我们谈论一条指令的延迟时,我们通常指的是从其输入产生结果所花费的时间,而不是在给定的时间段内产生多少结果。这是9个月生一个孩子(潜伏期)和在一个城市一个月生100个孩子(一个月)之间的区别

测量延迟的通常方法是将一系列指令链接在一起,其中一条指令的输出用作下一条指令的输入。因为它们是依赖的,所以您会得到一个延迟度量,因为它们是串行执行的。例如,如果要测量
add
的延迟,可以使用如下序列:

add eax, eax
add eax, eax
add eax, eax
...
注意输出寄存器eax如何在输入中反馈到下一个
add

现在,控制流指令没有可以反馈到其输入中的明显的显式“输出”。它们的输出是指令流中的一个变化,但不清楚如何将其反馈到下一条指令中。此外,控制流的整个机制通常被解耦成一个分支预测引擎,该引擎在控制流指令执行之前很久就尝试正确地引导前端,当涉及到延迟时,进一步搅乱了局面

您最多可以讨论这些结构的吞吐量:现代Intel通常每个周期可以执行两个分支,最多可以执行一个分支

mov
指令进出内存时也会遇到同样的问题。在这里,输出和输入是明确的,但它们位于不同的域(寄存器与内存)。因此,您不必将存储指令的输出馈送到后续的存储指令中,因为存储有“内存”输出,但有“寄存器”输入。您可以做的是将同一位置上的加载和存储指令对链接在一起,并获得这对指令的组合延迟:在现代Intel上,这通常运行3到7个周期,具体取决于寻址模式和其他因素

特别是负载,你可以使用负载(登记域)的结果来计算下一个负载,给你一个加载地址延迟的负载(有些人称这个负载为使用,但我认为这是混乱的),通常在现代英特尔上通常是4个周期。对于复杂寻址模式或向量加载,每个需要额外的一个周期

对于寄存器到寄存器的移动,延迟通常为零个周期(由于mov消除),或者当mov无法消除时为1个周期


这些问题可能就是为什么在英特尔指南中,甚至在Agner等其他指南中,您都看不到这些结构的延迟数字的原因。

分支预测+推测执行使得延迟的概念对于控制指令来说毫无意义。没有数据依赖性。从什么到什么的延迟?如果在
调用
中表示从RSP到RSP的延迟,堆栈引擎将其设为0。好的,这对于控制指令是有意义的。然而,对于控制指令,可以给出更长时间段内的平均延迟以及一些吞吐量值。我知道在某种意义上,这也是有限的信息。但我希望控制指令有一些延迟数据。Agner Fog有控制指令的吞吐量和uop计数,但延迟将毫无意义。我不知道你认为“较长时间内的平均延迟”是什么意思。很抱歉我的无知评论(我已将其删除)。关于延迟,我错了。感谢您对这个问题的看法。不用担心,延迟和吞吐量之间的这种划分已经变得更加重要,因为CPU基于数据流并行执行多条指令,而不是过去一次执行一条指令,其中延迟和吞吐量是相反的吞吐量是一样的。load-use latency描述了更一般的情况,其中address->data latency是依赖链的一部分,加载的数据用作其他加载的输入。e、 g.
imul-rax,rdx,1234
/
imul-rcx,[rax]
/。。。依赖于rcx的东西。立即使用加载结果作为地址(也称为指针跟踪)只是测量加载使用延迟的一种方便方法。