【发布时间】:2020-02-13 18:11:20
【问题描述】:
我们知道英特尔 CPU 在端口 0 上的非完全流水线除法执行单元上执行整数除法和 FP div / sqrt。我们从IACA output、其他已发布的资料和实验测试中了解到这一点。 (例如https://agner.org/optimize/)
但是对于 FP 和整数是否有独立的分隔符(仅竞争通过端口 0 进行调度),或者 如果一个是整数而另一个是FP?
英特尔 CPU(与 AMD 不同)将整数除法解码为多个微指令(例如10 for div r32 在 Skylake 上。
AMD CPU 同样在一个执行端口上有分频器,但我对它们了解不多,也没有一个可以测试。 AMD 整数除法仅解码为几个微指令(写入 RDX 和 RAX),而不是微编码。 AMD 的实验可能更容易解释,没有大量 uops 飞来飞去成为 int 和 fp div 之间争用的可能原因。
进一步阅读:
- 半相关:Radix divider internals
- Floating point division vs floating point multiplication - 各种 Intel 和 AMD CPU 上的 FP div/sqrt 与乘法/FMA 吞吐量。
-
Trial-division code runs 2x faster as 32-bit on Windows than 64-bit on Linux - Intel 的 64 位整数除法要慢很多。解码更多微指令(SKL 上 36 对 10),甚至不会使
arith.divider_active性能计数器饱和。
【问题讨论】:
-
(剧透警告:答案似乎是 FP 和整数除法 确实 在 Skylake 上竞争。将整理我的快速测试并稍后将其作为答案发布。)
标签: performance assembly x86 intel cpu-architecture