performance - X86 Broadwell 上的吞吐量 FMA 和乘法

标签 performance assembly x86 fpu fma

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

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

P1*P2*P3*P4 

每个多项式 Pi(x) = a + bX +cX^2 均由两个连续的 FMA 计算。然而,当我测量问题的吞吐量时,数字非常低。跟随阿格纳·雾的 table Agner Fog第 242 页,FMAMUL 的吞吐量为 0.5。吞吐量的定义:是在[周期]内执行一个新的相同助记词的时间。

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

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

最佳答案

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

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

Agner 表中的实际“吞吐量”数字主要用于总结或指示任何奇怪的情况,通常不直接有用,特别是对于像 vmulpsvfma 这样的高效单微指令指令...ps。请参阅What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?了解有关如何预测多指令 block 在延迟、后端端口瓶颈和前端 uop 吞吐量瓶颈方面的性能的更多详细信息。

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 结果的 FP 操作(FP add 除外)都在 Broadwell 的 FMA 单元上运行。 但是 mul 和 add 在 Broadwell 上有 3 个周期延迟,而实际的 FMA 有 5 个周期延迟,因此显然 FMA 单元有不同的配置。 MUL/FMA 的吞吐量相同,但 Broadwell 上的延迟不同。

(与 Skylake 不同,Skylake 取消了单独的加法单元,并且 mul/add 都具有与 FMA 完全相同的 4c 延迟/0.5c 吞吐量)。

在 Broadwell 中,MUL 的延迟时间与 FMA 不同是不寻常的;大多数运行它们的 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*...),最后的乘法在循环外部作为清理的一部分。

参见Why does mulss take only 3 cycles on Haswell, different from Agner's instruction tables?了解有关使用多个累加器展开以隐藏 FP 延迟的更多信息。

关于performance - X86 Broadwell 上的吞吐量 FMA 和乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54659245/

相关文章:

gcc - 为什么for循环比预期多1条指令?

c - 汇编语言是如何工作的?

assembly - 无法将 8 位地址移动到 16 位寄存器

c++ - 周期性 FPS 下降的可能原因?

java - 如何在不使用线性搜索的情况下有效地在字典中搜索单词java : Reducing Search Space

windows - 如何在 Windows 上的 x86-64 架构上的程序集中注册结构化异常处理程序?

c - rcx 是否总是指向进程入口点的 PEB?

multithreading - Julia 1.5.2性能问题

python - 如何使用 bool 行的二维数组来过滤另一个二维数组?

assembly - 如何在 GNU 汇编程序中使用字符串文字作为直接操作数(并将其移动到地址)?