일부 Linux 시스템에서는 병렬 처리 이득이 좋지 않지만 다른 시스템에서는 좋음

일부 Linux 시스템에서는 병렬 처리 이득이 좋지 않지만 다른 시스템에서는 좋음

저는 모두 Linux를 실행하는 여러 컴퓨터에서 C로 작성된 복잡한 신호 처리 알고리즘의 런타임을 측정하고 있습니다. 코드는 pthreads 라이브러리를 사용하는 일부 방법과 FFTW 패키지에서 제공하는 병렬 처리를 통해 부분적으로 병렬화됩니다. 4대의 컴퓨터 중 3대는 병렬 처리 계수 P가 1에서 컴퓨터의 물리적 코어 수로 증가함에 따라 실행 시간이 감소할 것으로 예상됩니다. 문제는 머신 중 하나가 반대 동작을 보인다는 것입니다. 즉, P=1에서 P=2로 이동하면 실행 시간이 늘어납니다.

코드는 네 시스템에서 동일하지만 하드웨어와 OS는 그렇지 않습니다. 하이퍼스레딩이 켜져 있습니다. 모두 큰 RAM을 가지고 있습니다.

toren: Ubuntu 18.04.5, 4.15.0-122-일반, 물리적 코어 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

barra: Ubuntu 18.04.4, 5.4.0-52-일반 #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로 되돌려보았지만 결과는 비슷합니다.

코드는 각각 동일합니다. 동일한 Makefile(컴파일러 스위치)을 사용하여 gcc를 사용하여 각각을 컴파일합니다.

barra가 다른 사람들처럼 행동하지 않는 이유에 대한 아이디어가 있습니까?

감사해요,

답변1

/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor에서 CPU 거버너 설정을 "powersave"에서 "performance"로 변경하면 성공했습니다.

관련 정보