我正在几台不同的计算机上测量用 C 语言编写的复杂信号处理算法的运行时间,这些计算机都运行 Linux。代码通过我自己的一些方法(使用 pthreads 库)和 FFTW 包提供的并行处理部分并行化。四台计算机中的三台显示,随着并行因子 P 从 1 增加到机器上的物理核心数,执行时间预计会减少。问题是其中一台机器表现出相反的行为:从 P=1 到 P=2 会导致执行时间增加。
四台机器上的代码相同,但硬件和操作系统不同。超线程已启用。所有机器都具有大容量 RAM。
toren:Ubuntu 18.04.5、4.15.0-122-generic、4 个物理核心、Xeon(R) CPU E3-1535M v5 @ 2.90GHz、gcc 版本 7.5
[email protected]>./ssca2_parallelism
P = 1 ssca2: elapsed PROGRAM TIME 1.025756e+01
P = 2 ssca2: elapsed PROGRAM TIME 7.500780e+00
P = 4 ssca2: elapsed PROGRAM TIME 6.246292e+00
P = 8 ssca2: elapsed PROGRAM TIME 5.483851e+00
P = 16 ssca2: elapsed PROGRAM TIME 7.457973e+00
P = 32 ssca2: elapsed PROGRAM TIME 8.497999e+00
P = 64 ssca2: elapsed PROGRAM TIME 1.035557e+01
十二:Fedora Core 31,5.8.15-101.fc31.x86_64,12 个物理核心,Xeon(R) CPU X5650 @ 2.67GHz,gcc 版本 9.3
[email protected]>./ssca2_parallelism
P = 1 ssca2: elapsed PROGRAM TIME 1.833605e+01
P = 2 ssca2: elapsed PROGRAM TIME 1.171951e+01
P = 4 ssca2: elapsed PROGRAM TIME 8.526402e+00
P = 8 ssca2: elapsed PROGRAM TIME 7.255262e+00
P = 16 ssca2: elapsed PROGRAM TIME 1.268390e+01
P = 32 ssca2: elapsed PROGRAM TIME 1.188247e+01
P = 64 ssca2: elapsed PROGRAM TIME 1.417718e+01
flash:Fedora Core 31,5.8.15-101.fc31.x86_64,28 个物理核心,Xeon(R) CPU E5-2697 v3 @ 2.60GHz,gcc 版本 9.3
[email protected]>./ssca2_parallelism
P = 1 ssca2: elapsed PROGRAM TIME 1.462457e+01
P = 2 ssca2: elapsed PROGRAM TIME 1.066421e+01
P = 4 ssca2: elapsed PROGRAM TIME 8.244503e+00
P = 8 ssca2: elapsed PROGRAM TIME 7.694590e+00
P = 16 ssca2: elapsed PROGRAM TIME 1.030944e+01
P = 32 ssca2: elapsed PROGRAM TIME 1.079129e+01
P = 64 ssca2: elapsed PROGRAM TIME 1.413906e+01
示例:Ubuntu 18.04.4、5.4.0-52-generic #57~18.04.1-Ubuntu、8 个物理核心、Xeon(R) W-3225 CPU @ 3.70GHz、gcc 版本 7.5
[email protected]>./ssca2_parallelism
P = 1 ssca2: elapsed PROGRAM TIME 8.891541e+00
P = 2 ssca2: elapsed PROGRAM TIME 1.006297e+01
P = 4 ssca2: elapsed PROGRAM TIME 8.619259e+00
P = 8 ssca2: elapsed PROGRAM TIME 7.233214e+00
P = 16 ssca2: elapsed PROGRAM TIME 7.765741e+00
P = 32 ssca2: elapsed PROGRAM TIME 8.301655e+00
P = 64 ssca2: elapsed PROGRAM TIME 1.114389e+01
我尝试将barra的内核恢复到4.15,但结果还是类似的。
每个代码都是相同的,我使用 gcc 在每个代码上进行编译,使用相同的 Makefile(编译器开关)。
有什么想法可以解释为什么巴拉鱼的行为与其他鱼不一样吗?
谢谢,
C
答案1
将 /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 中的 CPU 调速器设置从“powersave”更改为“performance”即可达到目的。