X86 Broadwell上的吞吐量FMA和乘法



我怀疑最后一个英特尔体系结构会像执行FMA一样执行助记符MUL,但添加了null(在broadWell体系结构上)。

详细地说,我目前正在执行四元多项式(Pi)的乘积,遵循该模式。

P1*P2*P3*P4 

每个多项式Pi(x)=a+bX+cX^2都由两个连续的CCD_ 3来估计。然而,当我测量问题的吞吐量时,数字非常低。根据Agner Fog Agner Fog242页的表,FMAMUL的吞吐量为0.5。吞吐量的定义:是[周期]中执行新的相同助记符的时间。

所以我应该在FMAMUL之间得到一个惩罚,但我的测量是平滑的。我怀疑幕后的处理器用带有零加法的FMA替换了MUL,或者至少使用了FPU中电路的相同部分,这解释了我的结果。

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

所以我应该在FMA和MUL 之间得到一个惩罚

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

Agner表中的实际"吞吐量"数字主要用于总结或指示任何异常情况,通常不直接有用,尤其是对于像vmulpsvfma...ps这样的高效单uop指令。请参阅预测现代超标量处理器上操作的延迟需要考虑哪些因素,以及如何手动计算它们?有关如何根据延迟、后端端口瓶颈和前端uop吞吐量瓶颈预测多条指令块的性能的更多详细信息。

然而,我的测量是平滑的。我怀疑引擎盖下的处理器通过带有零加法的FMA交换MUL,或者至少使用FPU中电路的相同部分,这解释了我的结果。

啊,我不明白。你刚才说你认为MUL和FMA应该相互冲突,但现在你说你认为在FMA部队上运行MUL可以解释什么??


我怀疑最后一个英特尔体系结构像FMA一样执行助记符MUL,但添加了null(在broadWell体系结构上)。

几乎所有必须规范化FP结果的FP运算(FP加法除外)都在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输入到add输入中,或者类似的东西。

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


我目前正在执行四元多项式(Pi)的乘积,遵循该模式。P1*P2*P3*P4

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

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

这将使你在每个多项式3个周期时陷入瓶颈,每个多项式的独立计算(2x FMA)将为并行发生的多个倍数创建输入。在这种情况下,Broadwell是您理想的CPU,它有3个循环倍数,而Haswell有5个循环,Skylake有4个循环。

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

了解为什么mulss在Haswell上只需要3个周期,与Agner';s指令表?了解有关使用多个累加器展开以隐藏FP延迟的更多信息

最新更新