每个时钟周期的浮点运算次数 - Intel

10

我已经寻找了一段时间,但似乎找不到一个官方的/确定的数字,它引用了一个Intel Xeon四核可以完成的单精度浮点运算/时钟周期的数量。 我有一个Intel Xeon四核E5530 CPU。

我希望利用它计算出CPU可以实现的最大理论FLOP/s。

MAX FLOPS =(#核心数)*(时钟频率(每秒钟的循环次数))*(#每个周期的FLOPS)

任何对指导我走向正确方向的内容都将是有用的。 我发现这个 FLOPS per cycle for sandy-bridge and haswell SSE2/AVX/AVX2

Intel Core 2和Nehalem:

每个周期4个DP FLOPs:2个宽SSE2加法+ 2个宽SSE2乘法

每个周期8个SP FLOPs:4个宽SSE加法+ 4个宽SSE乘法

但我不确定这些数字来自哪里。 它们是否假定了融合乘加(FMAD)操作?

编辑:使用此功能,我计算出DP中英特尔引用的正确DP算术吞吐量为38.4 GFLOP / s(在此处引用)。对于SP,我得到了双倍的速度,即76.8 GFLOP / s。 我很确定每个周期4个DP FLOP和8个SP FLOP是正确的,我只是想确认他们如何获得FLOPs / cycle值为4和8。


3
(8 SP FLOPs/cycle)(4个内核)(2.4 GHz)= 76.8 GFLOP/s。处理器可以在每个周期内执行加法和乘法指令,但它们不是融合的。 - Mysticial
你可能找不到官方数据,因为实际上并没有一个确定的数字——这取决于指令的混合情况以及它们之间的依赖性。理论最大值可能可以计算出来,但是在现实世界中很少有有用的程序(除了合成基准测试)能够恰好按照正确的顺序具有完全正确的指令混合,以达到那个最大值... - twalberg
1
如果您想知道如何达到最大的FLOP/s,可以查看以下链接:https://dev59.com/3eo6XIcBkEYKwwoYSCY1 链接是关于双精度计算的,但可以轻松修改为单精度计算。 - Mysticial
在实践中,人们经常希望能够加载/存储数据以及进行计算。因此,虽然了解峰值FLOPS的理论值很好,但如果无法快速读取数据以达到这个值,那么它就没有什么用处。更有用的指标还可以给出每个时钟周期可以获得的浮点加载/存储数量。例如,SB核心可以在每个时钟周期内加载4个双精度数并执行8个双精度操作(4个乘法和4个加法)。获得这个指标比仅仅进行计算更困难。 - Z boson
1个回答

11
Nehalem能够每个周期执行4个DP或8个SP的FLOP。这是通过使用SSE实现的,它可以处理打包的浮点值,每个寄存器中有2个DP和4个SP。为了实现每个周期4个DP或8个SP的FLOP,内核必须每个周期执行2个SSE指令。这是通过每个周期执行一个MULDP和一个ADDDP(或一个MULSP和一个ADDSP)来实现的。之所以可能是因为Nehalem具有用于SSE乘法和SSE加法的单独的执行单元,并且这些单元被流水线化,以使吞吐量为每个周期一个乘法和一个加法。在SP中,乘法在乘法流水线中持续4个周期,在DP中持续5个周期。无论是SP还是DP,加法都在流水线中持续3个周期。管道中的周期数称为延迟。要计算每个周期的峰值FLOP,您只需要知道吞吐量。因此,对于乘法器和加法器的吞吐量均为1个SSE向量指令/周期(2个执行单元),您在DP中拥有2 x 2 = 4 FLOP /周期,在SP中拥有2 x 4 = 8 FLOP /周期。要实际维持这种峰值吞吐量,需要考虑延迟(因此在管道中至少有与管道深度相同的独立操作),并且需要考虑能够足够快地提供数据。 Nehalem具有一种集成的内存控制器,可以从内存中获得非常高的带宽,如果数据预读器正确地预测数据的访问模式(顺序加载来自内存的数据是它可以预测的简单模式)。通常,内存带宽不足以维持所有核心以峰值FLOP /周期的速率获取数据,因此必须从缓存中重复使用数据才能维持峰值FLOP /周期。
您可以在以下文件的第105页8.9执行单元中找到有关独立执行单元数量及其吞吐量和延迟周期的详细信息。它指出,对于 Nehalem 处理器:
端口 0 上的浮点乘法器在单精度下的延迟为 4,在双精度和长双精度下的延迟为 5。浮点乘法器的吞吐量是每个时钟周期执行 1 次操作,除了 Core2 上的长双精度。浮点加法器连接到端口 1,延迟为 3,并完全流水线化。
要获得 8 SP FLOP / 每个时钟周期,您需要 4 SP ADD / 每个时钟周期 和 4 SP MUL / 每个时钟周期。 加法器和乘法器位于不同的执行单元上,并分别从不同的端口调度,每个端口可以使用 SSE packed(向量)指令(4x32bit=128bits)同时执行 4 个 SP 包装操作数。两者的吞吐量都是每个时钟周期执行 1 次操作。要获得这样的吞吐量,您需要考虑延迟... 在指令发出后多少个时钟周期之后才能使用结果...因此,您必须发布几个独立的指令以覆盖延迟。单精度乘法器的延迟为 4,加法器为 3。
您可以在英特尔优化手册中的表 C-15a 中找到 Nehalem 的这些吞吐量和延迟数字。 http://www.agner.org/optimize/microarchitecture.pdf http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接