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


14

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

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

我确实需要有关整数值的信息,但是也欢迎使用浮点执行时间。


Answers:


10

通常,如果自变量位于流水线各个阶段的寄存器中,则每个操作也需要一个时钟周期来执行。

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

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

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

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


3
在所有最近的x86 CPU上,整数乘法至少有3c的延迟(在某些较旧的CPU上,延迟至少是3c)。在许多CPU上,它是完全流水线化的,因此吞吐量为每个时钟1,但是只有在飞行中有三个独立的乘法时,才能实现该目标。(在Haswell上FP乘以5c延迟,0.5c吞吐率,因此需要10个飞行中的吞吐率才能达到饱和)。司(dividiv)更是雪上加霜:它的微代码,以及很多高延迟小于add或者shr,甚至不会完全在任何CPU流水线。所有这些都直接来自Agner Fog的说明表,因此将其链接起来是一件好事。
彼得·科德斯


7

在当今乱序执行的超级标量管道中,计算汇编代码的效率并不是最好的方法。根据处理器类型的不同而不同。前后的说明会有所不同(您可以添加额外的代码,有时使其运行得更快!)。某些操作(尤其是除法)甚至在较旧且更可预测的芯片上也可能具有一定的执行时间范围。实际上,进行大量迭代的时间是唯一的方法。


我知道,但是我不需要真正的项目,而是一种有趣的编程项目。
2013年

无论您是真正需要它还是娱乐它,都不会改变该处理器系列的答案。您是否考虑过改用更具确定性的处理器,例如Propeller芯片?
Brian Knoblauch 2013年

3
即使使用标量,按顺序实现分支预测错误和高速缓存未命中也会导致运行时间发生变化。
保罗·克莱顿

对于纯粹受CPU约束的东西(没有高速缓存未命中,没有分支错误预测),对CPU行为的了解足够详细,以至于静态分析通常可以准确地预测出某个特定循环(例如Intel Haswell)每次循环需要多少个周期。例如,在查看SO编译器生成的asm时,我可以解释一下为什么分支版本的运行速度比OP的Sandybridge CPU上的CMOV版本快1.5倍,而在我的Skylake上却要快得多。
彼得·科德斯

如果出于性能原因手动编写asm,则查找Intel和AMD CPU的延迟和吞吐量瓶颈实际上很有用。但是,这很困难,有时对AMD最佳的选择对英特尔而言并非最佳。
彼得·科德斯

4

您可以在intel软件开发人员手册中找到有关intel cpu的信息。例如,对于整数加法,等待时间为1个周期,对于整数乘法,等待时间为3个周期。

我不知道乘法,但是我希望加法总是需要一个周期。


一个周期,除非它是“空闲”的(当管道正确排列时并行)或由于高速缓存未命中而花费更长的时间。:-)
Brian Knoblauch

2
当前(2018年),此信息可在文档248966“英特尔®64和IA-32体系结构优化参考手册”中名为“指令延迟和吞吐量”的附录C中找到,该页面也链接在答案中
stefanct
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.