我已经找了很长一段时间了,似乎找不到一个官方/决定性的数字来引用Intel Xeon四核可以完成的单精度浮点运算/时钟周期的数量。我有一个英特尔至强四核E5530 CPU。
我希望用它来计算我的CPU可以达到的最大理论FLOP/s。
MAX FLOPS=(#内核数量)*(时钟频率(周期/秒))*(#FLOPS/周期)
任何能给我指明正确方向的东西都是有用的。我发现了这个沙桥和haswell SSE2/AVX/AVX2 每个周期的FLOPS
英特尔酷睿2和Nehalem:
4 DP FLOP/周期:双向SSE2加法+双向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/周期值的。
Nehalem能够执行4 DP或8 SP FLOP/周期。这是使用SSE实现的,SSE对压缩浮点值进行操作,DP中的2/寄存器和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×4=8 FLOP/循环。要真正维持此峰值吞吐量,您需要考虑延迟(因此,管道中的独立操作数至少与管道深度一样多),并且您需要考虑数据足够快。Nehalem有一个集成存储器控制器,能够从存储器获得非常高的带宽,如果数据预取器正确地预测数据的访问模式(从存储器顺序加载是一种可以预测的琐碎模式),它就可以实现这一点。通常,没有足够的内存带宽来维持以峰值FLOP/周期向所有内核提供数据,因此需要对缓存中的数据进行一定程度的重用,以维持峰值FLOP//周期。
以下是有关独立执行单元数量及其吞吐量和周期延迟的详细信息。
参见本文件的第105页8.9执行单位
http://www.agner.org/optimize/microarchitecture.pdf
上面说尼哈莱姆
端口0上的浮点乘法器的单精度延迟为4,双精度和长双精度延迟为5。浮点乘法器的吞吐量为每个时钟周期1次运算,但核心2上的长双精度除外。浮点加法器连接到端口1。它的延迟为3,并且是完全流水线式的。
为了获得8 SP FLOP/周期,您需要4 SP ADD/周期和4 SP MUL/周期。加法器和乘法器位于单独的执行单元上,并从单独的端口进行调度,每个端口都可以使用SSE压缩(矢量)指令(4x32bit=128bits)同时在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