我正在尝试为正在运行模拟的超级计算机中的节点构建屋顶线模型。该节点具有 2 个 Intel Xeon E5-2650 v2 (Ivy Bridge) 8 核 2.6 GHz 处理器(每个节点 16 个内核),总共 64GB RAM(每个 4GB)。Intel Xeon E5-2650 的最大内存带宽在此处显示为 59.7 GB/s。
实现的 GFLOPS = 最大内存带宽 x 算术强度。
最大 GFLOPS = 核数 x 时钟频率(以 GHz 为单位) x ops/cycle。
我的代码的算术强度为 1/3,并使用双精度浮点。
以下是我计算不同类型程序的峰值 GFLOP 的计算方法:
顺序程序(单核)无矢量化:
- 1x2.6x1(我假设没有矢量化,我们只能实现 1 个操作/周期?)= 2.6 GFLOPs
带有矢量化 (SSE) 的顺序程序(单核):
- 1x2.6x8 = 20.8 GFLOP
具有矢量化 (SSE) 功能的一台 Xeon 上的所有内核:
- 8x2.6x8 = 166.4 GFLOP
所有内核都带有矢量化 (SSE) 的两个 Xeon:
- 2x 8x2.6x8 = 332.8 GFLOP
在上面显示的不同类型的程序之间,程序可用的内存带宽如何变化?我知道 1 Xeon E5-2650 的最大内存带宽是 59.7 GB/s,但是这可以在单核上实现吗?使用 2 个 Xeon E2650 会变成 119.4 GB/s 吗?
所获得的 GFLOP(使用峰值带宽 x 算术强度)也会是:
不带矢量化的顺序程序:
- 59.7 * 1/3 = 19.9 GFLOPs,但是因为我们的屋顶线是 2.6 GFLOPs,我们被限制为 2.6 GFLOPs?
带有矢量化的顺序程序:
- 59.7 * 1/3 = 19.9 GFLOP。这是可以实现的,因为我们的屋顶线是 20.8 GFLOPs。
一个带有矢量化的 Xeon(使用所有 8 个内核):
- 59.7 * 1/3 = 19.9 GFLOP。我对此表示怀疑,因为我们的并行程序肯定能够比顺序程序产生更多的内存请求,而且顺序程序肯定不会使内存系统饱和?
两个具有矢量化功能的 Xeon(共 16 个内核):
- 119.4 * 1/3 = 39.8 GFLOP。
我觉得所达到的 GFLOP 有问题,我是不是在某个地方犯了错误?