这个问题适用于 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),但除此之外呢?