乘以1.0比通常的乘法花费更少的时间

时间:2015-03-31 07:07:36

标签: optimization x86 processor

如果乘法的一个操作数恰好是1.0,那么x86(64)处理器是否会优化乘法?

PS:我不是指编译器优化1.0的常量乘法。

1 个答案:

答案 0 :(得分:2)

这不是我在文档中提到的关于英特尔或AMD CPU的指令延迟或微体系结构的内容。

我怀疑它不会发生,因为可变延迟会干扰流水线执行单元。 (在同一时钟周期内来自同一执行单元的多个结果=额外的复杂性)。此外,可能还有其他逻辑位(uop调度/排队,结果转发网络)围绕每个具有已知延迟的uop设计。 (除了分区/ sqrt等特殊情况)。

IIRC,一位分析师,也许是Agner Fog或大卫坎特,他建议一些uops可能有2个周期延迟来实现,而是需要3个周期来匹配其执行端口可以处理的其他uop。因此,对于英特尔CPU设计来说,操作的持续延迟似乎是一个大问题,因为它值得使操作变慢。

请注意,我们这里只讨论延迟。如果你的乘法不是循环携带的依赖链的一部分,或者你有足够的独立乘法,你可以保持乘数每个时钟进行一次操作。

Haswell CPU可以维持每个时钟2个FP向量乘法的吞吐量。 (256个向量的4个双倍或8个浮点数)。延迟= 5个时钟周期,无论输入如何,结果都准备就绪。或每个时钟1个向量整数乘法。 (向量乘法ALU在端口0上。向量FP乘法器在端口0和端口1上。)

尽可能避免倍增,导致长依赖链。 (通常会出现整数乘法来计算循环索引。当你编写循环以将计数器递增16而不是将i++乘以16作为数组索引时,编译器会做得更好。)