对于Intel Haswell上的XMM / YMM FP操作,可以使用FMA代替ADD吗?

时间:2015-03-04 17:52:04

标签: sse avx throughput flops fma

这个问题适用于Haswell上带有XMM / YMM寄存器的压缩单预备浮点运算。

所以根据Agner Fog汇总的 awesome awesome table,我知道MUL可以在p0和p1端口上完成(带有recp thruput of 0.5),而只有ADD仅在端口p1上完成(recp thruput为1)。我可以除了这个限制,但我也知道FMA可以在端口p0或p1上完成(recp吞吐量为0.5)。因此,当我的FMA可以使用p0或p1并同时执行ADD和MUL时,为什么普通ADD仅限于p1是令人困惑的。我误解了桌子吗?或者有人可以解释为什么会这样?

也就是说,如果我的读数是正确的,为什么英特尔不会仅使用FMA op作为普通MUL和普通ADD的基础,从而增加ADD和MUL的吞吐量。或者,什么会阻止我使用两个同时独立的FMA操作来模拟两个同时独立的ADD操作?做ADD-by-FMA有哪些处罚?显然,使用的寄存器数量更多(ADD为2 reg而AD-by-FMA为3 reg),但除此之外?

1 个答案:

答案 0 :(得分:5)

你并不是唯一一个对英特尔为何这样做感到困惑的人。 Agner Fog在他的micro-architecture手册中为Haswell写道:

  

奇怪的是,只有一个端口用于浮点加法,但有两个端口用于浮点乘法。

关于Agner的留言板he also writes

  

有两个执行单元用于浮点乘法和融合乘法和加法,但只有一个执行单元用于浮点加法。这种设计似乎不是最理想的,因为浮点代码通常包含比乘法更多的加法。

该主题继续提供有关该主题的更多信息,我建议您阅读,但我不会在这里引用。

他也在这里回答了这个问题 flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2

  

Haswell上的FMA指令的延迟为5,每个时钟的吞吐量为2。这意味着您必须保持10个并行操作才能获得最大吞吐量。例如,如果要添加一个非常长的f.p列表。数字,你必须将它分成十个部分,并使用十个累加器寄存器。

     

这确实可能,但谁会为一个特定的处理器进行如此奇怪的优化?

他的答案基本上回答了你的问题。您可以使用FMA将添加的吞吐量加倍。事实上,我在添加的吞吐量测试中这样做,确实看到它加倍。

总之,为了补充,如果您的计算是延迟限制,那么不要使用FMA使用ADD。但是如果它的吞吐量限制你可以尝试使用FMA(通过将乘数设置为1.0),但你可能不得不使用许多AVX寄存器来执行此操作。

我展开了10次以获得最大限度的loop-unrolling-to-achieve-maximum-throughput-with-ivy-bridge-and-haswell