LINUX.ORG.RU

Haskell и parMap


0

0

Простая программка. Считает влоб (совсем влоб) x^(x*x) mod 1000 для списка чисел

import Data.List
import Control.Parallel
import Control.Parallel.Strategies

proc :: Int -> Int
proc x = foldl' f 1 [1..x*x]
where f z l = (z*x) `mod` 1000

xs = [1..1000]

main = print (parMap rwhnf proc xs)


Пробовал запускать с разными параметрами в духе:
./main +RTS -N1 -RTS
./main +RTS -N2 -RTS
./main +RTS -N2 -g2 -RTS

Машина с двумя ядрами, но в среднем, чем больше указываю N, тем пропорционально медленнее работает (быстрее всего -N1)
top показывает, что вроде бы работают оба ядра.

Подскажите пожалуйста, в чем может быть проблема?

ЗЫ компилирую с помощью ghc 6.10.1:
ghc --make main.hs -O2 -threaded


★★★★★

Re: Haskell и parMap

MigMit:~ MigMit$ cat test.hs
module Main where
import Data.List
import Control.Parallel
import Control.Parallel.Strategies

proc :: Int -> Int
proc x = foldl' f 1 [1..x*x]
where f z l = (z*x) `mod` 1000

xs = [1..1000]

main = print (parMap rwhnf proc xs)
MigMit:~ MigMit$ time ./test +RTS -N1
[...куча говна поскипана...]

real 0m20.981s
user 0m20.355s
sys 0m0.289s
MigMit:~ MigMit$ time ./test +RTS -N2
[...куча говна поскипана...]

real 0m12.513s
user 0m21.197s
sys 0m0.943s

Ускорение почти вдвое, как и должно было быть.

Miguel ★★★★★ ()
Ответ на: Re: Haskell и parMap от Miguel

Re: Haskell и parMap

$ ghc --make -threaded main.hs

$ time ./main +RTS -N1 -RTS real 0m37.792s user 0m37.582s sys 0m0.184s

$ time ./main +RTS -N2 -RTS real 0m33.844s user 0m18.361s sys 0m0.512s

Вот как user оказался меньше real я не скажу, но вот так вот оно.... ЗЫ. мб дело вовсе не в хаскеле, а в моей системе?

Waterlaz ★★★★★ ()
Ответ на: Re: Haskell и parMap от Miguel

Re: Haskell и parMap

Хм.. запустил на другой машине:

real 0m31.882s user 0m31.622s sys 0m0.155s

real 0m21.207s user 0m35.003s sys 0m1.359s

Не идельно, но хоть в 1,5 раза прирост дает.

Waterlaz ★★★★★ ()

Re: Haskell и parMap

Ну и тогда уж в догонку. Это нормально, что с увеличением числа потоков так сильно падает скорость выполнения?
 $ time ./main +RTS -N4 -RTS

real	0m36.440s
user	0m50.314s
sys	0m2.629s

Waterlaz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.