Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance X86 Broadwell上的吞吐量FMA和乘法_Performance_Assembly_X86_Fpu_Fma - Fatal编程技术网

Performance X86 Broadwell上的吞吐量FMA和乘法

Performance X86 Broadwell上的吞吐量FMA和乘法,performance,assembly,x86,fpu,fma,Performance,Assembly,X86,Fpu,Fma,我怀疑上一个英特尔体系结构执行的助记符MUL与FMA类似,但添加了空值(在broadWell体系结构上) 具体来说,我目前正在执行四元多项式的乘积(Pi),遵循该模式 P1*P2*P3*P4 每个多项式Pi(x)=a+bX+cX^2由两个连续的FMA计算。然而,当我测量问题的吞吐量时,数字非常低。根据Agner Fog第242页的表格,aFMA和MUL的吞吐量为0.5。吞吐量的定义:是以[周期]为单位执行新的相同助记符的时间 所以我应该在FMA和MUL之间得到一个惩罚,但是我的测量是平滑的。

我怀疑上一个英特尔体系结构执行的助记符
MUL
FMA
类似,但添加了空值(在broadWell体系结构上)

具体来说,我目前正在执行四元多项式的乘积(Pi),遵循该模式

P1*P2*P3*P4 
每个多项式Pi(x)=a+bX+cX^2由两个连续的
FMA
计算。然而,当我测量问题的吞吐量时,数字非常低。根据Agner Fog第242页的表格,a
FMA
MUL
的吞吐量为0.5。吞吐量的定义:是以[周期]为单位执行新的相同助记符的时间

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

我可能完全错了,但如果硬件工程师能够确认,我可能会感到虚弱

所以我应该得到FMA和MUL之间的处罚

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

Agner表格中的实际“吞吐量”数字主要用于总结或指示任何奇怪之处,通常不直接用于有效的单uop指令,如
vmulps
vfma…ps
。有关如何根据延迟、后端端口瓶颈和前端uop吞吐量瓶颈预测多条指令块性能的更多详细信息,请参阅

然而,我的测量是平稳的。我怀疑机罩下的处理器通过带有空加法的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不同,Skylake丢弃了单独的add单元,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人一组的测试吗?你如何处理每组的结果

或者你将许多量子多项式相乘在一个巨大的乘法链中,从而创建一个MULP依赖链

这将使您在每个多项式3个周期时遇到瓶颈,每个多项式的独立计算(2x FMA)将为并行发生的mulp创建输入。在这种情况下,Broadwell是您理想的CPU,3个周期的mulps与Haswell中的5个周期和Skylake中的4个周期相比

但是,如果可以假设FP math是关联的,并且具有不同的临时结果,则可以运行2、3或4个乘法链(甚至更多),并在最后使用具有多个向量的展开循环进行合并。e、 g.
(P1*P3*P5*…);(P2*P4*P6*…)
,最后的乘法在循环外,作为清理的一部分


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

这似乎是可能的。注意,这是一个倒数吞吐量;倒数吞吐量为0.5表示每个周期可以输入两个fma。您的问题是重复出现,您需要等待结果以开始新的op。因此,计算的是延迟,而不是操作员吞吐量,add、mult或fma的吞吐量约为4-5。您可以通过计算(P1*P2)*(P3*P4)(或在编译器上使用-fassociality math)稍微提高并行性和吞吐量。我已经有了-fassociality math,我只是想了解
MUL
是否可以被视为
FMA
。我在ASM方面还不错,但我完全不知道2 FPUWAHO中的ops是如何执行的!这是一个很好的答案,需要一些时间来消化。cu&谢谢,如果出现以下情况,我还不清楚什么。让我们考虑一个独立的FMA和MUL,一个带有单个FPU(简化)的英特尔处理器,两个助记符是不同的,但是在相同的硬件上执行:FMA单元。FPU将执行FMA,然后MUL执行8个周期的延迟,还是处理器将管道化MUL,因为这两个助记符在FMA上执行