每个周期的浮点运算 - 英特尔

时间:2014-04-21 18:45:10

标签: cpu intel cpu-architecture flops nehalem

我一直在寻找相当长一段时间,似乎无法找到一个官方/结论性数字引用英特尔至强四核可以完成的单精度浮点运算/时钟周期的数量。我有一个Intel Xeon quadcore 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 FLOP /周期:2宽SSE2加+ 2宽SSE2乘法

     

8 SP FLOP /周期:4宽SSE加法+ 4宽SSE乘法

但我不确定这些数据的位置。他们是假设融合乘法加法(FMAD)操作吗?

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

1 个答案:

答案 0 :(得分:7)

Nehalem能够执行4 DP或8 SP FLOP /循环。这是使用SSE完成的,SSE在压缩浮点值上运行,2 /在DP中寄存器,在SP中为4 /寄存器。为了实现4 DP FLOP /周期或8 SP FLOP /周期,内核必须在每个周期执行2个SSE指令。这是通过每个周期执行MULDP和ADDDP(或MULSP和ADDSP)来实现的。这是可能的原因是因为Nehalem具有用于SSE乘法和SSE加法的单独执行单元,并且这些单元是流水线的,因此throughput是每个周期一个乘法和一个加法。乘法在乘法器流水线中处于SP中的4个周期和DP中的5个周期。添加物在管道中连续3个循环,与SP / DP无关。管道中的循环数称为latency。要计算峰值FLOP /周期,您需要知道的是吞吐量。因此,对于乘法器和加法器(2个执行单元),吞吐量为1个SSE向量指令/周期,DP中的2 x 2 = 4 FLOP /周期,SP中为2 x 4 = 8 FLOP /周期。要实际维持此峰值吞吐量,您需要考虑延迟(因此您在管道中至少有与管道深度一样多的独立操作),并且您需要考虑能够足够快地提供数据。 Nehalem有一个集成的内存控制器,能够从内存中获得非常高的带宽,如果数据预取器正确预测数据的访问模式(从内存顺序加载是一个可以预期的微不足道的模式),它可以实现。通常,没有足够的存储器带宽来维持在峰值FLOP /周期内向所有内核提供数据,因此需要从缓存中重复使用一些数据以维持峰值FLOP /周期。

详细介绍了在哪里可以找到有关独立执行单元数量及其吞吐量和周期延迟的信息。

请参阅本文档的第105页 8.9执行单元

http://www.agner.org/optimize/microarchitecture.pdf

它说Nehalem

  

端口0上的浮点乘法器对于单精度具有4的延迟,对于双精度和长双精度具有5的延迟。除了Core2上的长双精度之外,浮点乘法器的吞吐量是每个时钟周期1个操作。浮点加法器连接到端口1.它的延迟为3,完全流水线化。

为了获得8 SP FLOP /周期,您需要4 SP ADD /周期和4 SP MUL /周期。加法器和乘法器位于不同的执行单元上,并从不同的端口分派,每个端口可以使用SSE打包(向量)指令(4x32bit = 128位)同时在4个SP打包操作数上执行。两者都具有每个时钟周期1次操作的吞吐量。为了获得吞吐量,您需要考虑延迟...在您使用结果之前指令发布后的周期数。因此您必须发出几个独立的指令来弥补延迟。单精度乘数的延迟为4,加法器为3。

您可以在英特尔优化指南中找到相同的Nehalem吞吐量和延迟数,表C-15a

http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html