我怀疑最后一个Intel体系结构像MUL
一样执行助记符FMA
,但是添加了空值(在BroadWell体系结构上)。
详细地说,我目前正在按照模式执行量子多项式(Pi)的乘积。
P1*P2*P3*P4
每个多项式Pi(x)= a + bX + cX ^ 2由两个连续的FMA
求值。但是,当我测量问题的吞吐量时,数字非常低。紧随Agner Fog表Agner Fog的第242页之后,FMA
和MUL
的吞吐量为0.5。吞吐量的定义:是[周期]中执行新的相同助记符的时间。
所以我应该在FMA
和MUL
之间受到惩罚,但是我的测量很顺利。我怀疑引擎盖下的处理器将MUL
换成FMA
并加上空加号,或者至少使用FPU中电路的相同部分来解释我的结果。
我可能是完全错误的,但是如果硬件工程师可以确认或确认。
答案 0 :(得分:2)
所以我应该在FMA和MUL之间受到惩罚
是的,应该从Agner Fog的表中查看一条指令在哪个执行端口上运行。 这通常是所有您需要计算一系列不同指令的吞吐量的条件。 (在诸如Broadwell之类的现代主流x86 CPU上,除div / sqrt之外的所有执行单元都是完全流水线化的(可以在每个时钟周期启动一个新的uop),因此,只有一些奇怪的微编码指令(如loop
)的吞吐量比您要少。希望通过查看他们的uops /端口。)
Agner表中的实际“吞吐量”数字主要用作摘要或任何怪异的指示,通常对于具有vmulps
或vfma...ps
之类的高效单-uup指令通常不是直接有用的。有关如何根据延迟,后端端口瓶颈和前端uop吞吐量瓶颈来预测多条指令块的性能的更多详细信息,请参见What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?。
但是我的测量很顺利。我怀疑引擎盖下的处理器会被FMA替换为MUL,并添加零值,或者至少使用FPU中电路的相同部分来解释我的结果。
嗯,我不明白。您只是说您认为MUL和FMA应该相互冲突,但是现在您说的是,您认为在FMA单元上运行MUL可以解释某些情况?
我怀疑最后一个Intel架构像FMA一样执行助记符MUL,但添加了空值(在BroadWell架构上)。
几乎所有必须标准化FP结果的FP操作(FP add除外)都在Broadwell的FMA单元上运行。 但是mul和add在Broadwell上有3个周期的延迟,而实际FMA有5个周期的延迟,因此显然FMA单元有不同的配置。 MUL / FMA的吞吐量相同,但Broadwell的延迟不同。
(与删除了单独的添加单元的Skylake不同,mul / add都具有与FMA完全相同的4c延迟/0.5c吞吐量)。
在Broadwell中,具有与FMA不同的延迟的MUL是不寻常的;多数都以相同的性能运行它们的CPU,大概只是将0.0
馈入add输入或类似的东西。
SIMD整数乘法还使用FMA单位中的乘法器,整数移位也是如此。大量的东西使用了它,但是在Skylake-X中尤其有意义的是,他们将尽可能多地利用这些晶体管,而不是拥有更多的512位宽的SIMD执行单元。
我目前正在按照该模式执行四次多项式(Pi)的乘积。
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延迟。