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

use*_*341 7 cpu intel cpu-architecture flops nehalem

我一直在寻找相当长一段时间,似乎无法找到一个官方/结论性的数字引用英特尔至强四核可以完成的单精度浮点运算/时钟周期的数量.我有一个Intel Xeon quadcore E5530 CPU.

我希望用它来计算我的CPU可以达到的最大理论FLOP/s.

MAX FLOPS =(#内核数)*(时钟频率(周期/秒))*(#FLOPS /周期)

任何指向我正确方向的东西都会有用.我已经发现每个循环的这个 FLOPS用于沙桥和haswell SSE2/AVX/AVX2

英特尔酷睿2和Nehalem:

4 DP FLOP /周期:2宽SSE2加+ 2宽SSE2乘法

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

但我不确定这些数据在哪里被发现.他们是假设融合乘法加法(FMAD)操作吗?

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

amd*_*mdn 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.

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

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