X86 Broadwell 上的吞吐量 FMA 和乘法

Throughput FMA and multiplication on X86 Broadwell

我怀疑最后一个英特尔架构像 FMA 一样执行助记符 MUL 但有一个空添加(在 broadWell 架构上)。

具体来说,我目前正在按照模式执行二次多项式 (Pi) 的乘积。

P1*P2*P3*P4 

每个多项式 Pi(x) = a + bX +cX^2 由两个连续 FMA 计算。但是,当我测量我的问题的吞吐量时,数字非常低。根据 Agner Fog Agner Fog 第 242 页的 Table,FMAMUL 的吞吐量为 0.5。吞吐量的定义:是[cycle]中执行一次新的相同助记词的时间。

所以我应该在 FMAMUL 之间受到惩罚,但是我的测量很顺利。我怀疑引擎盖下的处理器将 MUL 替换为 FMA 并添加了空值,或者至少在 FPU 中使用了相同的电路部分,这解释了我的结果。

我可能完全错了,但如果硬件工程师可以确认或证实。

So I should get a penalty between the FMA and the MUL

是的,从 Agner Fog 的表中,您应该查看指令 运行s 在哪个执行端口上。 这就是 通常您需要计算一系列不同 指令的吞吐量。 (在像 Broadwell 这样的现代主流 x86 CPUs 上,除了 div/sqrt 之外的所有执行单元都是完全流水线化的(每个时钟周期都可以启动一个新的 uop),所以只有一些奇怪的微编码指令,比如 loop吞吐量比您从查看它们的 uops / 端口时预期的要少。)

Agner 表中的实际 "throughput" 数字主要用作任何怪异的总结或指示,通常不会直接有用,特别是对于有效的单指令,如 vmulpsvfma...ps.有关如何根据延迟、后端端口瓶颈和前端 uop 吞吐量瓶颈预测多指令块性能的更多详细信息,请参阅 What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?

however my measurement is smooth. I suspect the processor under the hood swap the MUL by a FMA with a null addition, or at least use an identical part of the circuit in the FPU, which explain my results.

咦,没看懂。您刚刚说您认为 MUL 和 FMA 应该相互冲突,但现在您说您认为 运行在 FMA 单元上使用 MUL 可以解释一些事情??


I am suspecting last Intel architecture to perform the mnemonic MUL like a FMA but with a null addition (on broadWell architecture).

几乎每个 FP 操作都必须在 Broadwell 的 FMA 单元上规范化 FP 结果(FP add 除外)运行s。 但是 mul 和 add 在 Broadwell 上有 3 个周期的延迟,而实际的 FMA 有 5 个周期的延迟,所以显然 FMA 单元的配置不同。 MUL/FMA 吞吐量相同,但 Broadwell 上的延迟不同。

(与丢弃单独添加单元的 Skylake 不同,mul/add 两者都具有与 FMA 完全相同的 4c 延迟/0.5c 吞吐量)。

在 Broadwell 中具有与 FMA 不同延迟的 MUL 是不寻常的;大多数 CPU 都有 运行 它们具有相同的性能,大概只是将 0.0 馈入添加输入,或类似的东西。

SIMD 整数乘法也使用 FMA 单元中的乘数,整数移位也是如此。很多东西都在使用它,但特别是在 Skylake-X 中,他们会尽可能多地利用这些晶体管,而不是拥有更多 512 位宽的 SIMD 执行单元。


I am currently performing product of Quatric polynomials (Pi), following the pattern. P1*P2*P3*P4

你对结果做了什么?你只做 4 人一组吗?你如何处理每组的结果?

或者您是在一个巨大的乘法链中乘以 许多 二次多项式,创建一个乘法依赖链?

这会在每个多项式 3 个循环时成为瓶颈,每个多项式的独立计算 (2x FMA) 为并行发生的乘积创建输入。在这种情况下,Broadwell 是您的理想选择 CPU,其中 3 个周期乘数与 Haswell 中的 5 个周期和 Skylake 中的 4 个周期相比较。

但是如果你可以假装 FP 数学是关联的并且有不同的临时结果,你可以 运行 2、3 或 4 个乘法链(或更多)并在最后组合,使用展开循环多个向量。例如(P1*P3*P5*... ) * (P2*P4*P6*...),作为清理的一部分,在循环外进行最后的乘法运算。

有关使用多个累加器展开以隐藏 FP 延迟的更多信息,请参阅