2017-05-14 1 views
2

하스켈에서 병렬 계산을 수행하는 데 문제가 있습니다. 방금 병렬 및 비 병렬 형태로 매우 간단한 계산을 시도했지만 비 병렬 방식은 몇 초 더 빨랐습니다. 내가 뭔가 잘못하고 있는거야? 왜 이것이 사실일까요? 미리 감사드립니다.파가 효과 없음


이 내 테스트 코드의 병렬 버전 :

-- par.hs 
import Control.Parallel 
a = sum [1, 3 .. 99999999] 
b = sum [2, 4 .. 100000000] 
main = (a `par` b) `pseq` print (a + b) 

이이 평행하지 않은 버전입니다 : 없음

-- nopar.hs 
a = sum [1, 3 .. 99999999] 
b = sum [2, 4 .. 100000000] 
main = print (a + b) 

하지만 난 그것을 시도 할 때, 병렬화가 있었다, 심지어 부정적인 효과 :

➜ ghc par.hs 
[1 of 1] Compiling Main    (par.hs, par.o) 
Linking par ... 
➜ ghc nopar.hs 
[1 of 1] Compiling Main    (nopar.hs, nopar.o) 
Linking nopar ... 
➜ time ./par 
5000000050000000 
./par 35.02s user 12.83s system 92% cpu 51.501 total 
➜ time ./nopar 
5000000050000000 
./nopar 31.33s user 6.44s system 98% cpu 38.441 total 
+0

방금 ​​숫자를 합산 한 것입니다. 차이를보기에는 너무 사소한 것 같습니다. – Carcigenicate

+1

GHC에'-threaded' 플래그를 추가하여 실제로 여러 시스템 스레드를 사용할 수있는 RTS를 사용하도록하십시오. – Carl

+0

@Carcigenicate 분명히 30 초의 단일 스레드를 사용하기에 충분합니다. 두 개의 스레드를 사용하여 반으로 줄일 수 있다고 가정하는 것이 합리적입니다. – amalloy

답변

4

IIUC, @Carl 및 @Zeta 주소이에 의한 의견의 조합 : 여기에 기본적으로 Real World Haskell

에서 일부 발췌 이유

$ ghc -threaded -O2 par.hs && time ./par 
50000005000000 

real 0m2.303s 
user 0m2.124s 
sys  0m0.176s 

$ ghc par.hs && ./par +RTS -N2 
Linking par ... 
par: the flag -N2 requires the program to be built with -threaded 
par: 
par: Usage: <prog> <args> [+RTS <rtsopts> | -RTS <args>] ... --RTS <args> 
par: 
par: +RTS Indicates run time system options follow 
par: -RTS Indicates program arguments follow 
par: --RTS Indicates that ALL subsequent arguments will be given to the 
par:   program (including any of these RTS flags) 

$ ghc -threaded -O2 par.hs && time ./par +RTS -N2 
50000005000000 

real 0m1.572s 
user 0m2.816s 
sys  0m0.296s 

보고는, GHC는 하나를 사용하는 프로그램을 생성 심지어 우리가 명시 적으로 동시 코드를 작성할 때조차도. 다중 코어를 사용하려면 명시 적으로 선택해야합니다. 우리는 실행 가능한 프로그램을 생성 할 때 링크 타임에 이것을 선택합니다. ... -threaded 옵션을 컴파일러에 전달하면 프로그램과 스레드 런타임 라이브러리가 연결됩니다.

우리는 우리의 프로그램의 명령 줄에서 GHC의 런타임 시스템에 옵션을 전달할 수 있습니다

. 코드를 제어하기 전에 런타임은 특수 명령 행 옵션 + RTS에 대한 프로그램의 인수를 스캔합니다. ... 스레드 런타임은 -N 옵션을 허용합니다. 이것은 GHC의 런타임 시스템이 사용해야하는 코어의 수를 지정하는 하나의 인수를 취합니다.

관련 문제