x86 和 x64 处理器上 CPU 指令的延迟

ST3*_*ST3 18 cpu 64-bit latency assembly x86

我正在寻找一些表格或类似的东西,可以帮助我计算汇编代码的效率。

据我所知,位移需要 1 个 CPU 时钟,但我真的在看需要多少加法(减法应该相同),乘法以及如果我知道正在除法的值,如何大概计算除法时间。

我真的需要有关整数值的信息,但也欢迎浮动执行时间。

小智 16

通常,如果参数位于流水线各个阶段的寄存器中,则这些操作中的每一个都需要一个时钟周期来执行。

你说的延迟是什么意思?一个操作在 ALU 中花费了多少个周期?

您可能会发现此表很有用:http : //www.agner.org/optimize/instruction_tables.pdf

由于现代处理器是超标量并且可以乱序执行,因此每个周期的总指令数通常会超过 1。宏命令的参数是最重要的,但操作也很重要,因为除法比 XOR (<1周期延迟)。

许多 x86 指令可能需要多个周期才能完成某些复杂的阶段(例如,REP 命令或更糟的 MWAIT)。

  • 整数乘法在所有最新的 x86 CPU 上至少有 3c 延迟(在一些较旧的 CPU 上更高)。在许多 CPU 上,它是完全流水线化的,因此每个时钟的吞吐量为 1,但只有在进行三个独立的乘法运算时才能实现这一目标。(Haswell 上的 FP 乘法是 5c 延迟,0.5c 吞吐量,因此您需要 10 次飞行才能使吞吐量饱和)。除法(`div` 和`idiv`)甚至更糟:它是微编码的,延迟比`add` 或`shr` 高得多,甚至没有在任何CPU 上完全流水线化。所有这些都直接来自 Agner Fog 的说明表,因此您将其链接起来是一件好事。 (6认同)

Bri*_*uch 7

在乱序执行超标量管道的这些日子里,计算汇编代码的效率并不是最好的方法。它会因处理器类型而异。它会因之前和之后的指令而异(您可以添加额外的代码并使其有时运行得更快!)。一些操作(特别是除法)甚至在更老的更可预测的芯片上也可以有一定的执行时间范围。实际上,大量迭代的时间安排是唯一的出路。

  • 即使使用标量,有序实现分支错误预测和缓存未命中也会导致运行时发生变化。 (3认同)