我在这里查看了Agner Fog的指令表,特别是沙桥案例,有一件事引起了我的注意。如果您查看DIV指令,您可以看到,例如,r64DIV指令最多可以解码56个uops!我的问题是:这是真的吗?还是我发了一封电报
这是一件我甚至都没有想到的事情。我一直认为,2个寄存器的整数除法只在1个uop中解码。并认为uop被派往0港(例如在Sandy Bridge(。
我认为这里发生的是:uop被发送到Port0,它稍后完成一些循环。但是,由于采用了流水线,每个周期可以向该端口发送1个div uop(或另一个需要port0的uop(。但这完全打破了我的计划:56个不同的uop需要在56个不同周期中调度,占用56个ROB条目才能只进行1个整数除法
并非所有这些uop都在端口0上的实际除法器单元上运行。似乎只有签名的idiv
是Skylake上的许多uop;仅";33个单位。也许有符号的idiv r64
采用绝对值来使用较窄的HW除法器单元进行扩展精度除法,就像您对软件扩展精度所做的那样?(为什么在x86-64 GCC上__int128_t比long-long快?(
并且CCD_ 4/CCD_;仅";10个uop,可能只有1或2个在端口0上需要实际的除法单元,其他的在其他端口上做IDK。请注意,Skylake配置文件结果中显示的arith.divider_active
的计数在试用分区代码中显示,在Windows上32位的div r64
运行速度比在Linux上64位的快2倍-CCD_7的小输入几乎无法使实际的端口0分配器保持活动时间比div r32
长,但其他开销使其慢得多。
FP除法实际上是单个uop,因为FP-div性能在一些真实世界的算法中很重要。(特别是一个divpd
对周围代码前端吞吐量的影响(。参见浮点除法与浮点乘法
另请参阅FP和整数除法是否在x86 CPU上竞争相同的吞吐量资源?-冰湖改进了分流器HW。
另请参阅澄清其他误解的评论中的讨论。
相关:
- 为什么除法比乘法更贵?从根本上讲,分裂是难以处理的
我想我已经读到,现代除法器单元通常是用迭代而非完全流水线的部分构建的,然后是2个牛顿-拉夫逊步骤,这些步骤是流水线的。这就是在现代CPU上部分流水线化除法的方式:下一个可以在当前CPU进入执行单元的Newton-Raphson流水线部分后立即开始。