2012-01-26 7 views
7

Haskell'i öğreniyorum ve paralel olarak yürütmek için kod yazmayı deniyorum, ancak Haskell her zaman sırayla çalıştırıyor. Ve ben -N2 çalışma zamanı bayrağı ile yürüttüğümde, bu bayrağı çıkarırsam, yürütmek için daha fazla zaman alır. İşteParalel çalışmak için "fib" yazıyor: -N2 daha yavaş mı?

kodudur:

ben yanlış yaptığım
import Control.Parallel 
import Control.Parallel.Strategies 

fib :: Int -> Int 
fib 1 = 1 
fib 0 = 1 
fib n = fib (n - 1) + fib (n - 2) 

fib2 :: Int -> Int 
fib2 n = a `par` (b `pseq` (a+b)) 
    where a = fib n 
      b = fib n + 1 

fib3 :: Int -> Int 
fib3 n = runEval $ do 
       a <- rpar (fib n) 
       b <- rpar (fib n + 1) 
       rseq a 
       rseq b 
       return (a+b) 

main = do putStrLn (show (fib3 40)) 

? Bu örneği Windows 7'de Intel Core i5 ve Linux on Atom üzerinde denedim. İşte

benim konsol oturumundan oturum edilir:

ghc -rtsopts -threaded -O2 test.hs 
[1 of 1] Compiling Main    (test.hs, test.o) 

test +RTS -s 
331160283 
      64,496 bytes allocated in the heap 
      2,024 bytes copied during GC 
      42,888 bytes maximum residency (1 sample(s)) 
      22,648 bytes maximum slop 
       1 MB total memory in use (0 MB lost due to fragmentation) 

    Generation 0:  0 collections,  0 parallel, 0.00s, 0.00s elapsed 
    Generation 1:  1 collections,  0 parallel, 0.00s, 0.00s elapsed 

    Parallel GC work balance: nan (0/0, ideal 1) 

         MUT time (elapsed)  GC time (elapsed) 
    Task 0 (worker) : 0.00s ( 6.59s)  0.00s ( 0.00s) 
    Task 1 (worker) : 0.00s ( 0.00s)  0.00s ( 0.00s) 
    Task 2 (bound) : 6.33s ( 6.59s)  0.00s ( 0.00s) 

    SPARKS: 2 (0 converted, 0 pruned) 

    INIT time 0.00s ( 0.00s elapsed) 
    MUT time 6.33s ( 6.59s elapsed) 
    GC time 0.00s ( 0.00s elapsed) 
    EXIT time 0.00s ( 0.00s elapsed) 
    Total time 6.33s ( 6.59s elapsed) 

    %GC time  0.0% (0.0% elapsed) 

    Alloc rate 10,191 bytes per MUT second 

    Productivity 100.0% of total user, 96.0% of total elapsed 

gc_alloc_block_sync: 0 
whitehole_spin: 0 
gen[0].sync_large_objects: 0 
gen[1].sync_large_objects: 0 


test +RTS -N2 -s 
331160283 
      72,688 bytes allocated in the heap 
      5,644 bytes copied during GC 
      28,300 bytes maximum residency (1 sample(s)) 
      24,948 bytes maximum slop 
       2 MB total memory in use (0 MB lost due to fragmentation) 

    Generation 0:  1 collections,  0 parallel, 0.00s, 0.00s elapsed 
    Generation 1:  1 collections,  1 parallel, 0.00s, 0.01s elapsed 

    Parallel GC work balance: 1.51 (937/621, ideal 2) 

         MUT time (elapsed)  GC time (elapsed) 
    Task 0 (worker) : 0.00s ( 9.29s)  0.00s ( 0.00s) 
    Task 1 (worker) : 4.53s ( 9.29s)  0.00s ( 0.00s) 
    Task 2 (bound) : 5.84s ( 9.29s)  0.00s ( 0.01s) 
    Task 3 (worker) : 0.00s ( 9.29s)  0.00s ( 0.00s) 

    SPARKS: 2 (1 converted, 0 pruned) 

    INIT time 0.00s ( 0.00s elapsed) 
    MUT time 10.38s ( 9.29s elapsed) 
    GC time 0.00s ( 0.01s elapsed) 
    EXIT time 0.00s ( 0.00s elapsed) 
    Total time 10.38s ( 9.30s elapsed) 

    %GC time  0.0% (0.1% elapsed) 

    Alloc rate 7,006 bytes per MUT second 

    Productivity 100.0% of total user, 111.6% of total elapsed 

gc_alloc_block_sync: 0 
whitehole_spin: 0 
gen[0].sync_large_objects: 0 
gen[1].sync_large_objects: 0 
+0

http://www.haskell.org/ghc/docs/6.6/html/users_guide/lang-parallel.html –

+2

'da biraz farklı bir "nfib" var. Yeniden üretilemiyor (Core i5, linux), gerçek zamanlı 2.75 -Nk' olmadan s, -N2' ile 1.48s. Hangi GHC sürümü ve hangi derleyici seçeneklerini kullandınız? –

+0

Oturumumu Windows 7 (Pentium D) ve Haskell Platform 2011.4.0.0 altında oturumuma ekliyorum. Derleyici bayrakları şunlardır: ghc -rtsopts -09 test.hs – KolKir

cevap

4

Cevabın GHC hiçbir tahsisi yapar, böylece yalan fonksiyonunu optimize etmek ve hiçbir tahsisat sorunlara neden yapmak hesaplamaları olacak "olduğunu düşünüyorum zamanlayıcı geçmez çünkü RTS çalıştırmak ve yapılacak yük dengeleme bu discussion group yılında Simon yazdığı gibi " (paralellik için gerekli olan). Ayrıca iyi tutorial bulundu.