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

cod*_*imp 5 sse avx flops throughput fma

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

因此,根据Agner Fog 提供的令人敬畏的,令人敬畏的 ,我知道MUL可以在端口p0和p1上完成(recp thruput为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,而FMA为ADD为3 reg),但除此之外?

Z b*_*son 5

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

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

在Agner的留言板上,他也写道

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

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

他还在这个答案中讨论了这个问题,这里 每个周期都是针对sand-bridge-and-haswell-sse2-avx-avx2

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

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

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

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

我展开了10次以获得最大的吞吐量在这里循环展开到达到最大吞吐量 - 常春藤 - 桥 - 并且 - haswell