我正在运行一些科学(并行)代码,并希望获得一些性能分析测量。我想在理论上(峰值)性能的 flops/s 方面获得代码的“效率”。
我运行了一个简单的矩阵乘法示例(可以在网络上找到的 PAPI_flops.c)并使用 PAPI 测量计数获得测量结果。我使用的 HPC 系统(56 Gb/s 互连)有这个 cpuinfo:
processor : 39
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
stepping : 4
microcode : 1064
cpu MHz : 1200.000
cache size : 25600 KB
physical id : 1
siblings : 20
core id : 12
cpu cores : 10
apicid : 57
initial apicid : 57
fpu : yes
fpu_exception : yes
cpuid level : 13
设 A 和 B 为 1000x1000 矩阵,带有随机浮点数。对于串行过程,我将 A 乘以 B 后得到以下指标:
Real_time: 3.340896
Proc_time: 3.344447
Total flpins: 2837232042
MFLOPS: 848.341187
现在,据我了解,理论上的峰值性能将是#cores x clock x FLOPs/cycle。我相信上面的处理器可以做 4 FLOPs/cycle,所以如果我假设我有一个单核 2.8 GHz 处理器,理论性能大约是 11200 MFLOPS。这会给我大约7%的效率......
那是极低的效率。850 MFLOPS 对我来说似乎是一个相当不错的高性能速率。我在这里做错了什么,还是像矩阵乘法这样简单的事情?