Assembly 整数DIV指令的uops

Assembly 整数DIV指令的uops,assembly,x86,x86-64,cpu-architecture,micro-architecture,Assembly,X86,X86 64,Cpu Architecture,Micro Architecture,我在看Agner Fog的说明书,特别是sandy bridge的案例,有一件事引起了我的注意。如果您查看DIV指令,您可以看到,例如,r64 DIV指令最多可以解码56个uops!我的问题是:这是真的还是我发了一封信解释了? 这件事我都没想到。我一直认为2个寄存器的整数除法只需1个uop就能解码。并认为uop已发送到端口0(例如在Sandy Bridge中) 我认为这里发生的事情是:uop被发送到端口0,并且它在一些周期之后完成。但是,由于采用了管道,每个周期都可以向该端口发送1个div uo

我在看Agner Fog的说明书,特别是sandy bridge的案例,有一件事引起了我的注意。如果您查看DIV指令,您可以看到,例如,r64 DIV指令最多可以解码56个uops!我的问题是:这是真的还是我发了一封信解释了?

这件事我都没想到。我一直认为2个寄存器的整数除法只需1个uop就能解码。并认为uop已发送到端口0(例如在Sandy Bridge中)


我认为这里发生的事情是:uop被发送到端口0,并且它在一些周期之后完成。但是,由于采用了管道,每个周期都可以向该端口发送1个div uop(或需要端口0的另一个uop)。但这完全打破了我的计划:56个不同的UOP需要在56个不同的周期中调度,占用56个ROB条目只执行1个整数除法?

并非所有这些UOP都在端口0的实际除法器单元上运行。似乎只有签名的
idiv
是Skylake上的许多UOP,
div r64
是“仅”33 UOP。也许signed
idiv r64
采用绝对值,使用更窄的硬件除法器单元进行扩展精度除法,就像您对软件扩展精度所做的那样?()

idiv
/
div r32
是“仅”10个UOP,其中可能只有1或2个在端口0上需要实际的分频单元,其他的在其他端口上做IDK什么。请注意-
div r64
上的Skylake配置文件结果中显示的
arith.divider\u active
计数,使用较小的输入几乎不会使实际端口0 divider保持活动状态的时间超过
div r32
,但其他开销使其速度慢得多

FP division实际上是单uop,因为FP div的性能在一些实际算法中很重要。(特别是一个
divpd
对周围代码前端吞吐量的影响)。看

另请参见-冰湖改善了分隔器HW


另请参见注释中的讨论,以澄清其他误解

相关的:

  • 从根本上说,很难实现分裂

我想我已经读过,现代分频器单元通常是由一个迭代的非完全流水线部分构建的,然后是2个牛顿-拉斐逊步骤,这些步骤是流水线的。这就是除法在现代CPU上部分管道化的方式:下一个除法可以在当前除法进入执行单元的Newton-Raphson管道化部分后立即开始;这段对话已经结束。