我对Sandy Bridge和Haswell每个核心每个周期可以完成多少次失败感到困惑。正如我对SSE的理解,SSE应该是每个核心每个周期4个触发器,AVX/AVX2应该是每个内核每个周期8个触发器。
这似乎在这里得到了验证,如何实现每个循环理论上最多4个FLOP?,在这里,SandyBridge CPU规格。
然而,下面的链接似乎表明Sandy bridge每个核心每个周期可以进行16次浮点运算,Haswell每个核心每个循环可以进行32次浮点运算http://www.extremetech.com/computing/136219-intels-haswell-is-an-unprecedented-threat-to-nvidia-amd.
有人能向我解释一下吗?
编辑:我现在明白我为什么困惑了。我认为FLOP这个术语只是指单个浮点(SP)。我现在看到了在"我如何实现每个循环4个FLOP的理论最大值?"?实际上是在双浮点(DP)上,因此它们对于SSE实现4个DP FLOP/周期,对于AVX实现8个DP FLOp/周期。在SP上重新进行这些测试会很有趣。
以下是一些最新处理器微体系结构的理论最大FLOP计数(每个核),并解释如何实现这些计数。
通常,要计算此查找,请查找FMA指令的吞吐量,例如https://agner.org/optimize/或任何其他微基准标记结果,并乘以(FMAs per clock) * (vector elements / instruction) * 2 (FLOPs / FMA)
请注意,在实际代码中实现这一点需要非常仔细的调优(如循环展开),几乎零缓存未命中,并且在其他上没有瓶颈。现代CPU具有如此高的FMA吞吐量,以至于没有太多空间用于其他指令存储结果或向其提供输入。例如,对于大多数x86 CPU来说,每个时钟2个SIMD负载也是限制,因此点积将在每1个FMA 2个负载上成为瓶颈。然而,经过仔细调整的密集矩阵乘法可以接近于实现这些数字。
如果你的工作量包括任何无法签订FMA的ADD/SUB或MUL,那么理论上的最大值并不是你工作量的合适目标。Haswell/Broadwell每时钟有2个SIMD FP乘法(在FMA单元上),但每时钟只有1个SIMD FP-加法(在延迟较低的单独矢量FP加法单元上)。Skylake放弃了单独的SIMD FP加法器,对于任何矢量宽度,以4c的延迟、每时钟2的吞吐量运行相同的add/mul/fma。
英特尔
请注意,最近微体系结构的赛扬/奔腾版本不支持AVX或FMA指令,仅支持SSE4.2。
英特尔酷睿2和Nehalem(SSE/SSE2):
- 4个DP FLOP/循环:双向SSE2加法+双向SSE2乘法
- 8 SP FLOP/周期:4侧SSE加法+4侧SSE-乘法
Intel Sandy Bridge/Ivy Bridge(AVX1):
- 8 DP FLOP/周期:4路AVX加法+4路AVX乘法
- 16 SP FLOP/周期:8宽AVX加法+8宽AVX乘法
Intel Haswell/Broadwell/Skylake/Kaby Lake/Coffee/。。。(AVX+FMA3):
- 16个DP FLOP/cycle:两个4侧FMA(融合乘加)指令
- 32 SP FLOP/cycle:两条8宽FMA(融合乘加)指令
- (使用256位矢量指令可以降低某些CPU的最大turbo时钟速度。)
Intel Skylake-X/Skylake EP/Cascade Lake/等(AVX512F),带有1 FMA单元:一些Xeon青铜/银
- 16个DP FLOP/cycle:一个8宽FMA(融合乘加)指令
- 32 SP FLOP/周期:一条16宽FMA(融合乘法-加法)指令
- 与较窄的256位指令的计算吞吐量相同,但对于较宽的加载/存储、一些不在FMA单元上运行的矢量运算(如逐位运算)和较宽的混洗,AVX512仍然可以实现加速
- (在飞行中有512位矢量指令会关闭端口1上的矢量ALU。此外,降低了涡轮增压器的最大时钟速度,因此"周期"在性能计算中不是常数。)
Intel Skylake-X/Skylake EP/Cascade Lake/etc(AVX512F),带有2个FMA单元:至强金/白金和i7/i9高端台式机(HEDT)芯片。
- 32 DP FLOP/cycle:两条8宽FMA(融合乘加)指令
- 64 SP FLOP/cycle:两条16宽FMA(融合乘加)指令
- (在飞行中有512位矢量指令会关闭端口1上的矢量ALU。还降低了涡轮增压器的最大时钟速度。)
未来:Intel Cooper Lake(Cascade Lake的继任者)预计将推出Brain Float,这是一种用于神经网络工作负载的float16格式,支持实际的SIMD计算,而目前的F16C扩展仅支持转换为float32的加载/存储。与相同硬件上的单精度相比,这应该使FLOP/周期吞吐量翻一番。
目前的英特尔芯片只有在iGPU的标准float16上直接进行实际计算。
AMD
AMD K10:
- 4个DP FLOP/循环:双向SSE2加法+双向SSE2乘法
- 8 SP FLOP/周期:4侧SSE加法+4侧SSE-乘法
AMD推土机/打桩机/蒸汽机/挖掘机,每个模块(两个核心):
- 8个DP FLOP/周期:4侧FMA
- 16 SP FLOP/周期:8宽FMA
AMD Ryzen
- 8个DP FLOP/周期:4侧FMA
- 16 SP FLOP/周期:8宽FMA
x86低功耗
Intel Atom(Bonnell/45nm,Saltwell/32nm,Silvermont/22nm):
- 1.5 DP FLOP/周期:标量SSE2加法+标量SSE2乘法每隔一个周期
- 6个SP FLOP/周期:每隔一个周期进行4次SSE加法+4次SSE-乘法
AMD山猫:
- 1.5 DP FLOP/周期:标量SSE2加法+标量SSE2乘法每隔一个周期
- 4个SP FLOP/周期:每隔一个周期进行4次SSE加法+每隔一个循环进行4次SE乘法
AMD捷豹:
- 3个DP FLOP/周期:每隔一个周期进行4次AVX加法+四个周期进行四次AVX乘法
- 8 SP FLOP/周期:每隔一个周期8宽AVX加法+每隔一个循环8宽AVX乘法
ARM
ARM Cortex-A9:
- 1.5 DP FLOP/周期:标量加法+标量乘法每隔一个周期
- 4 SP FLOP/周期:每隔一个周期进行4次NEON加法运算+每隔一个循环进行4次NE乘法运算
ARM Cortex-A5:
- 2 DP FLOP/cycle:标量FMA或标量乘加
- 8 SP FLOP/周期:4侧NEONv2 FMA或4侧NEON乘加
高通Krait:
- 2 DP FLOP/cycle:标量FMA或标量乘加
- 8 SP FLOP/周期:4侧NEONv2 FMA或4侧NEON乘加
IBM POWER
IBM PowerPC A2(蓝色基因/Q),每个核心:
- 8个DP FLOP/周期:每个周期4路QPX FMA
- SP元素扩展到DP,并在相同的单元上进行处理
IBM PowerPC A2(Blue Gene/Q),每个线程:
- 4个DP FLOP/周期:每隔一个周期进行4侧QPX FMA
- SP元素扩展到DP,并在相同的单元上进行处理
英特尔MIC/至强Phi
Intel Xeon Phi(Knights Corner),每核:
- 16 DP FLOP/周期:每个周期8宽FMA
- 32 SP FLOP/周期:每个周期16个宽FMA
Intel Xeon Phi(Knights Corner),每个线程:
- 8个DP FLOP/周期:每隔一个周期8个宽FMA
- 16 SP FLOP/周期:每隔一个周期16个宽FMA
Intel Xeon Phi(Knights Landing),每核:
- 32 DP FLOP/周期:每个周期两个8宽FMA
- 64 SP FLOP/周期:每个周期两个16宽FMA
IBM Blue Gene/Q和Intel Xeon Phi(Knights Corner)之所以有每个线程和每个内核的数据,是因为当每个内核运行多个线程时,这些内核的指令发布率更高。
Haswell的加法吞吐量低于乘法和FMA吞吐量。有两个乘法/FMA单元,但只有一个f.p.加法单元。如果您的代码主要包含加法,那么您必须用1.0的乘数替换FMA指令的加法,以获得最大吞吐量。
Haswell上的FMA指令的延迟为5,吞吐量为每个时钟2。这意味着您必须保持10个并行操作才能获得最大吞吐量。例如,如果你想添加一个很长的f.p.数字列表,你必须将其分成十部分,并使用十个累加器寄存器。
这确实是可能的,但谁会对一个特定的处理器进行如此奇怪的优化呢?