5

这个问题适用于 Haswell 上带有 XMM/YMM 寄存器的打包单精度浮点运算。

因此,根据 Agner Fog 整理的令人敬畏的、令人敬畏的 ,我知道 MUL 可以在端口 p0 和 p1 上完成(recp thruput 为 0.5),而仅 ADD 仅在端口 p1 上完成(recp thruput 为 1 )。我可以排除这个限制,但我也知道 FMA 可以在端口 p0 或 p1 上完成(recp thruput 为 0.5)。因此,当 FMA 可以使用 p0 或 p1 并且它同时执行 ADD 和 MUL 时,为什么普通的 ADD 将仅限于 p1,这让我感到困惑。我误解了这张桌子吗?或者有人可以解释为什么会这样吗?

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

4

1 回答 1

5

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

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

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

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

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

他还在这个答案中讨论了它 flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2

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

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

他在那里的回答基本上回答了你的问题。您可以使用 FMA 将加法的吞吐量提高一倍。事实上,我在我的吞吐量测试中这样做了,并且确实看到它翻了一番。

总之,另外,如果您的计算受延迟限制,则不要使用 FMA 使用 ADD。但如果它受吞吐量限制,您可以尝试使用 FMA(通过将乘数设置为 1.0),但您可能必须使用许多 AVX 寄存器来执行此操作。

我在这里展开 10 次以获得最大吞吐量loop-unrolling-to-achieve-maximum-throughput-with-ivy-bridge-and-haswell

于 2015-03-05T08:58:43.767 回答