为什么英特尔的Haswell芯片允许FP乘法速度是加法运算速度的两倍?


35

我正在阅读有关堆栈溢出的一个非常有趣的问题:

整数乘法是否真的以与现代CPU上加法相同的速度完成?

评论之一说:

“在Haswell上,FP乘法吞吐量是FP add的两倍,这是毫无价值的。这是因为端口0和1都可以用于乘法,但是只有端口1可以用于加法。也就是说,您可以使用融合作弊-相加,因为两个端口都可以。”

为什么它们允许相加的次数是加法的两倍?


3
谢谢@DKNguyen!但是乘法比加法涉及更多的电子设备(实际上加法是乘法的最后一步,因此乘法所需的任何电路也将包括加法所需的任何东西),所以我不知道它如何占用更少的管芯面积!
user1271772

5
FP乘法加法。参见对数。
Janka

9
@Janka虽然FP乘法确实需要加指数,但是仍然有必要实际乘以尾数。存储的尾数不是对数。
Elliot Alderson

6
Skylake的FWIW的“纯附加”吞吐量翻了一番,因此这是Haswell / Broadwell时代的好奇心,而不是某种固有的东西。
哈罗德

4
@ user1271772是的,尽管它们是相同的端口:端口0和1的加法,以及端口0和1的乘法。在Skylake之前,只有端口1可以处理纯加法。这也扩展到了一些类似加法的运算,即最小/最大/比较执行实际转换的转换的μop(通常也有随机播放或加载μop)
harold

Answers:


37

如果不是正文,这可能会回答问题的标题:

浮点加法要求在将两个尾数相加之前对齐它们(取决于两个指​​数之间的差异),这可能需要在加法器之前进行大量可变的移位。然后可能需要对尾数加法的结果重新进行归一化,潜在地需要另一个较大的移位量才能正确格式化浮点结果。因此,两个尾数桶形移位器可能需要更多的选通延迟,更大的导线延迟或额外的周期,这些周期超过了紧凑压缩的进位保存加法器树乘法器前端的延迟。

为OP添加的内容:请注意,将2毫米和2公里的长度相加不是两个单位中的4个。这是因为需要在添加之前将一个或另一个度量转换为相同的比例或单位表示。这种转换本质上需要乘以10的幂。在浮点加法过程中通常需要发生同样的事情,因为浮点数是可变缩放整数的形式(例如,存在与之相关的单位或缩放因子,指数)。每个数字)。因此,在添加原始尾数位之前,您可能需要将数字之一按2的幂进行缩放,以使它们都代表相同的单位或比例。这种缩放本质上是2的幂的简单乘法形式。 因此,浮点加法需要乘法(其功率为2时,可以使用可变的移位或桶形移位器来完成,这可能需要相对于晶体管尺寸而言较长的导线,在深亚微米光刻电路中相对较慢)。如果两个数字大部分都被抵消了(因为一个几乎等于另一个的负数),那么可能需要重新调整加法结果并适当格式化结果。因此,由于数字格式的性质(IEEE浮点数),如果还需要2个乘法(前和后)步骤围绕表示相等单位或小数位数的原始固定(有限)个尾数位的二进制加法,则加法可能会很慢。 )。

新增了#2:此外,许多基准测试对FMACS(乘法累加)的权重要大于裸基准。在融合的MAC中,加数的对齐(移位)通常可以与乘法并行进行,尾数加法通常可以在最终进位传播之前包含在CSA树中。


评论不作进一步讨论;此对话已转移至聊天。得出的任何结论都应重新编辑成问题和/或任何答案。
戴夫·特威德

3
我在叫BS。当然,FP乘法运算中的实际乘法不可能难于两次桶移位。
user253751

5
给定项目约束和目标,“更难”,可能更快,并且值得优化是4件不同的事情。
hotpaw2

3
@immibis:在Haswell之前,英特尔CPU具有1个SIMD FP添加单元(3个周期延迟)和1个SIMD FP mul单位(5个周期延迟)。因此加法比乘法快。(这就是为什么Haswell在为fma和mul添加2个FMA单元而不是像SKL那样在FMA单元上运行时保留一个单独的FP添加单元的原因)。而且,SIMD-int移位的延迟为1c,而SIMD-int mul的延迟为5c(在FMA单元中乘以有效乘数)。所以是的,移位比乘法便宜得多。add和mul均已完全流水线化,因此它们都需要一个单独的桶形移位器以标准化输出。
彼得·科德斯

22

在FP乘法中,指数处理被证明是简单的加法(出于完全相同的原因,对数域中的乘法仅仅是加法)。我希望您遇到了对数。

现在考虑以对数形式两个数字相加是多么困难...

浮点位于线性域和对数域之间的灰色区域,两者都有。每个FP编号包括一个尾数(线性)和一个(对数)指数。要确定尾数中每个位的含义,您首先必须查看指数(这只是一个比例因子)。

在FP加法中,指数处理通常需要对尾数进行两次桶形移位,其中每个桶形移位实际上是略微简化乘法的特殊情况。

(第一个移位将两个输入对齐为相同的2的幂,以便尾数位在每个操作数中具有相同的二进制权重。

十进制示例就足够了(尽管显然使用了二进制)...

(3103)+(1101)=(3103)+(0.0001103)

第二个重新缩放输出...

1100+(0.999100)=0.001100=1103

因此,自相矛盾的是,FP加法涉及非常相似的两个乘法,这些乘法必须顺序执行,并且它们之间的尾数加法。因此,报道的性能并不令人惊讶。


8
“考虑以对数形式将两个数字相加有多困难”非常有启发性。
彼得-

1
尽管幸运的是,浮点指数只是整数,所以您不必添加1.3 + 2.3 = 2.34之类的东西,这只是尾数的移动。
ilkkachu

1
每个周期可以进行两次乘法的原因是因为有两个乘法单元,而不是因为乘法单元比加法单元快(请参见pjc50答案中的图表)。您无法通过解释为什么您认为加法单元比乘法单元慢来回答这个问题。除此之外,到目前为止,其他答案都表明加法单元具有较低的延迟,这表明加法是更简单的操作。
user253751

2
@immibis:您的观察是正确的。但是问题是,“为什么会这样?为什么不存在两个加法单元,因为加法比mpy更简单/更便宜?” 答案的一部分是,“在FP中,这确实不简单”。其余的归结为经济学:鉴于实际支出,并且对预期的工作量进行了大量研究,第二个加法器并没有证明其在硅。我将保留其他答案以扩展该部分。
Brian Drummond

一些计算机科学家(例如Kahan(IEEE754 FP的体系结构)和Knuth)认为“尾数”是错误的词,因为它是线性的(不是对数的)。首选的现代术语是有意义的。 en.wikipedia.org/wiki/Significand#Use_of_%22mantissa%22。不过,“尾数”是一个看起来很酷的单词,只有较少的音节。
Peter Cordes

16

TL:DR:因为英特尔认为SSE ​​/ AVX FP增加延迟比吞吐量更重要,所以他们选择不在Haswell / Broadwell的FMA单元上运行它。


Haswell(SIMD)FP与FMA(融合乘加)在相同的执行单元上运行FP乘法,其中有两个,因为某些FP密集型代码可以使用FMA最多执行每条指令2个FLOP。与FMA和mulps早期CPU(Sandybridge / IvyBridge)相同的5个周期延迟。 Haswell想要2个FMA单元,并且让乘法运行没有任何缺点,因为它们的延迟时间与早期CPU中的专用乘法单元相同。

但是它将专用的SIMD FP添加单元从较早的CPU保留下来,仍然可以运行addps/ addpd具有3个周期的延迟。 我已经读到,可能的原因可能是大量FP添加的代码往往会成为其延迟而不是吞吐量的瓶颈。对于只有一个(向量)累加器的数组的幼稚求和,这确实是正确的,就像您经常从GCC自动向量化中获得的那样。但是我不知道英特尔是否公开证实了他们的理由。

Broadwell微架构是相同的(但加速mulps/mulpd到3C延迟,同时FMA留在5C)。也许他们能够先对FMA单元进行捷径操作,然后再对进行虚拟加法,然后得出乘积结果0.0,或者可能是完全不同的东西,这太简单了。 BDW主要是HSW的缩水,大多数变化很小。

在Skylake中,除div / sqrt和按位布尔值(例如,用于绝对值或取反)外,所有FP(包括加法器)都以4个周期的延迟和0.5c的吞吐量在FMA单元上运行。英特尔显然认为,为延迟较低的FP添加额外的硅片是不值得的,或者addps吞吐量不平衡是有问题的。而且标准化的延迟使得避免回写冲突(当在同一周期中准备好2个结果时)更容易在uop调度中避免。即简化了计划和/或完成端口。

因此,是的,英特尔确实在下一个主要的微体系结构修订版(Skylake)中对其进行了更改。 将FMA延迟减少1个周期,从而使专用SIMD FP添加单元的优势小得多,适用于受延迟限制的情况。

Skylake还显示出英特尔为AVX512做好准备的迹象,如果将单独的SIMD-FP加法器扩展到512位宽将占用更多的裸片面积。据报道,Skylake-X(带有AVX512)具有与常规Skylake客户端几乎相同的核心,除了更大的L2缓存和(在某些型号中)额外的512位FMA单元“固定”到端口5上。

在运行512位uops时,SKX将关闭端口1 SIMD ALU,但它需要一种随时执行的方法vaddps xmm/ymm/zmm。这使得在端口1上具有专用的FP ADD单元成为一个问题,并且是改变现有代码性能的另一个动机。

有趣的事实:除了Cascade Lake添加了一些新的AVX512指令外,Skylake,KabyLake,Coffee Lake甚至Cascade Lake的所有东西在微体系结构上都与Skylake相同。IPC保持不变。不过,较新的CPU具有更好的iGPU。冰湖(Sunny Cove微体系结构)是我们几年来第一次看到实际的新微体系结构(除了从未广泛发行的Cannon Lake)。


基于FMUL单元与FADD单元的复杂度的争论很有趣,但在这种情况下并不重要。 FMA单元包括所有必需的移位硬件,作为FMA 1的一部分进行FP加法。

注意:我的意思不是x87 fmul指令,我的意思是SSE / AVX SIMD /标量FP乘法ALU,支持32位单精度/ float64位double精度(53位有效数,也就是尾数)。例如mulps或的指令mulsdfmul在端口0的Haswell上,实际的80位x87 吞吐量仍然仅为1 /时钟。

现代的CPU拥有足够多的晶体管,在值得时以及在不引起物理距离传播延迟问题时,都会引发问题。特别是对于仅在某些时间处于活动状态的执行单元。参见https://en.wikipedia.org/wiki/Dark_silicon和此2011年会议论文:《黑硅与多核扩展的终结》。。这使CPU可以具有大量的FPU吞吐量和大量的整数吞吐量,但不能同时具有两者(因为这些不同的执行单元位于同一调度端口上,因此它们彼此竞争)。在许多没有限制内存带宽的经过精心调优的代码中,限制因素不是后端执行单元,而是前端指令吞吐量。(宽核非常昂贵)。另请参见http://www.lighterra.com/papers/modernmicroprocessors/


在Haswell之前

在HSW之前,像Nehalem和Sandybridge这样的Intel CPU在端口0上增加了SIMD FP,在端口1上增加了SIMD FP。因此,有独立的执行单元,并且吞吐量保持平衡。(https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

Haswell在英特尔CPU中引入了FMA支持(在AMD在推土机中引入FMA4的几年后,英特尔通过等到很晚才公开宣布他们将要实施3-operand FMA而非非4-operand FMA来伪造它们)。 -破坏性目的地FMA4)。有趣的事实:AMD堆驱动器仍然是第一个具有FMA3的x86 CPU,大约在2013年6月的Haswell之前

这需要对内部进行一些重大修改,以支持3个输入的单个uop。但是无论如何,英特尔全力以赴,并利用不断缩小的晶体管来装入两个256位SIMD FMA单元,使Haswell(及其后继产品)成为FP数学的野兽。

英特尔可能已经想到的性能目标是BLAS密集的matmul和矢量点积。这两项都可以主要使用FMA,不需要只是补充。

正如我之前提到的,某些主要执行或仅执行FP添加的工作负载在添加延迟(而非吞吐量)上成为瓶颈。


脚注11.0FMA 乘以,可以从字面上进行加法运算,但是延迟比addps指令差。这对于诸如对L1d缓存中的阵列进行热计算之类的工作负载很有用,其中FP增加吞吐量比延迟更重要。当然,这仅在您使用多个向量累加器隐藏时延并且在FP执行单元中保持10个FMA操作进行中(5c时延/0.5c吞吐量= 10个操作时延*带宽乘积)时才有帮助。 将FMA用于矢量点积时,您也需要这样做

请参阅David Kanter关于Sandybridge微体系结构的文章,其中包含框图,其中列出了哪个EU位于NHM,SnB和AMD Bulldozer系列的哪个端口上。(另请参见Agner Fog的指令表和asm优化微体系结构指南,以及https://uops.info/,该版本还对几代英特尔微体系结构上几乎每条指令的uops,端口和延迟/吞吐量进行了实验测试。)

也相关:https : //stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle


1
如果你想知道是否要相信我的话是:对堆栈溢出,我有黄金徽章,包括[cpu-architecture][performance][x86-64][assembly],和[sse]。我用C ++代码编写了一个答案,以比手写汇编更快地测试Collat​​z猜想-为什么?很多人认为很好。也是关于OoO流水线执行的。
Peter Cordes

“ BDW主要是HSW的缩水,大多数变化很小。” 听起来好像他们在第一次尝试时有意放弃了一些优化,可能是出于财务原因。
jpaugh

2
@jpaugh:请参阅en.wikipedia.org/wiki/Tick%E2%80%93tock_model-英特尔从2006年左右开始的计划(直到他们在10nm上遇到障碍)在新工艺上缩小了规模,但进行了其他小的改动,然后是新架构在已经测试过的过程中。请记住,开发正在酝酿中,并且有多个未来的设计在进行中:它们不会在开始下一个之前就完成一个。一直希望Broadwell只是在充分利用其14nm制造工艺的Skylake“ tock”之前成为“壁虱”,而不必担心调试工艺,而只是担心设计
Peter Cordes

我感谢链接。从本质上讲,您已经回应了我的观点,尽管其准确性比我可以召集的要高得多。
jpaugh

8

我将看一下这一部分:
“为什么它们允许使用 ... ...
TL; DR-因为他们是这样设计的。这是一项管理决定。当然,答案是尾数和移位器,但这是管理决策中要考虑的事情。

他们为什么这样设计?答案是制定规格是为了达到某些目标。这些目标包括性能和成本。性能并非针对运营,而是针对像《孤岛危机》中的FLOPS或FPS之类的基准。
这些基准测试将具有多种功能,其中一些功能可以同时处理。
如果设计人员认为拥有小部件A的两个功能比小部件B的两个功能要快得多,那么他们将使用小部件A。实现A的两个和B的两个将花费更多。

回顾当超标量和超级流水线(在多核之前)在商业芯片上首次普及时,它们就可以提高性能。奔腾有两个管道,没有向量联合。Haswell具有更多管道,向量单位,更深的管道,专用功能等。为什么没有全部两个?因为他们是这样设计的。


一个更相关的性能目标可能是BLAS密集基质和矢量点积。两者都可以大部分使用FMA,而无需添加。
彼得·科德斯

我从未在产品包装盒上见过BLAS密集的matmul和矢量点产品。没有在广告中看到这些。没有在产品评论中看到这些。(当然他们是很重要的,但工程如下管理,管理遵循营销,营销如下销售业务是由普通的人购买的。
MikeP

1
我看过CPU评测,其中包括基准测试程序Linpack。但是无论如何,正如您所说的(理论最大值),FLOPS确实得到了广告,如果高速缓存能够保持正常运行,这基本上是matmul性能的代理。我不确定SPECfp基准是否接近饱和HSW或SKL的FMA单元,但是SPEC基准很重要。并非所有的销售都是一次零售。有些是老练的购买者,例如决定何时升级的超级计算机集群购买者或公司服务器场。我认为这些销售的利润也更高。
彼得·科德斯

6

英特尔的这张图可能会有所帮助:

Haswell执行单元概述

看来他们已经给每个单元一个FMA(融合乘加),以及一个乘法和一个加法器。他们可能会或可能不会在下面共享硬件。

如果没有内部设计依据,为什么很难回答这个问题,但是紫色框中的文字为我们提供了“双峰FLOP”的提示:处理器将针对一组源自实际用例的基准。FMA在这些方面非常受欢迎,因为它是矩阵乘法的基本单位。裸添加不那么受欢迎。

正如已经指出的,您可以通过FMA指令使用两个端口进行加法运算,其中乘法参数为1,计算(A x 1)+B。这将比裸加法稍慢。


FP Multiply在FMA单元上运行。FP添加仅在端口1上的专用SIMD FP添加单元上以较低的延迟运行。它可能与该端口上的FMA单元共享一些晶体管,但是据我所读,我的印象是需要大量的额外空间才能提供此功能。
Peter Cordes

发布 更多详细信息的答案
彼得·科德斯

4

让我们看一下耗时的步骤:

加法:对齐指数(可能是大量的移位操作)。一个53位加法器。归一化(最多53位)。

乘法:一个庞大的加法器网络,可将53 x 53的一位乘积减少为两个106位数的总和。一个106位加法器。正常化。我要说的是,将位乘积减为两个数可以像最终加法器一样快。

如果您可以使乘法时间可变,那么您将具有以下优势:标准化大部分时间只会移位一位,并且您可以非常快速地检测到其他情况(非正规化输入或指数总和太小)。

另外,需要规范化的步骤非常普遍(将大小不相等的数字相加,将接近的数字相减)。因此,对于乘法而言,您可以负担得起一条快速道路,而对缓慢道路则承受巨大打击;另外,您不能。

PS。阅读注释:添加非规范化数字不会造成任何损失,这是有道理的:这仅意味着在为对齐指数而移位的位中,许多为零。非规范化的结果意味着您将停止移动以删除前导零,如果这样做会使指数太小。


实际上,英特尔CPU确实通过微码辅助来处理次正规乘法(输入或输出)。即常规FPU发出异常信号,而不是在这种情况下具有额外的流水线阶段。 Agner Fog说:Sandybridge 在我的测试中,处理下溢和非正规数的情况与处理普通浮点数的速度一样快,但不能进行乘法运算。 这就是为什么使用-ffast-math集合FTZ / DAZ(将反常态为0的反常态)进行编译而不是使用FP辅助的原因。
Peter Cordes

在Agner的微体系结构指南中,他说,当使用正常输入的操作产生次正常输出时,总是会受到惩罚。但是添加普通+次普通不会带来任何损失。因此,摘要审核可能不准确,或者总体指南不正确。阿格纳(Agner)说,骑士的着陆(至强披披)对mul / add上的任何次标准没有任何惩罚,只能分开。但是KNL的延迟add / mul / FMA(6c)比主流的Haswell(5c)/ SKL(4c)高。有趣的是,AMD Ryzen的处罚只有几个周期,而Bulldozer家族的处罚却很大。
彼得·科德斯

相比之下,GPU都是与吞吐量有关,而不是与延迟有关,因此,对于所有情况,即使对于次正常情况,GPU通常具有固定的延迟。像这样的准系统管道甚至可能都不是陷阱。
Peter Cordes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.