在某些 Linux 機器上並行處理增益較差,而在其他機器上則良好

在某些 Linux 機器上並行處理增益較差,而在其他機器上則良好

我正在測量在幾台不同的電腦上用 C 編寫的複雜訊號處理演算法的運行時間,所有電腦都運行 Linux。我自己使用 pthreads 庫的一些方法以及 FFTW 套件提供的平行處理對程式碼進行了部分並行化。隨著平行係數 P 從 1 增加到機器上物理核心的數量,四台電腦中的三台顯示出預期的執行時間減少。問題是其中一台機器表現出相反的行為:從 P=1 到 P=2 會導致執行時間增加。

四台機器上的程式碼是相同的,但硬體和作業系統不同。超線程已開啟。全部都有大內存。

版本: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

12 個: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

快閃記憶體: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」就可以了。

相關內容