[Haskell-cafe] Parallelise now! Was: Re: Possible Improvements
Don Stewart
dons at galois.com
Mon Dec 3 05:20:19 EST 2007
dons:
> Strict in the elements, lazy in the spine:
>
> data Tree = Leaf !Int | Node Tree !Int Tree
>
> $ time ./A 25
> 49
> ./A 25 14.41s user 0.03s system 99% cpu 14.442 total
> ^^^^^^
> 3056K heap use.
And, finally, we can get a little speedup again over the basic
element-strict, -funboxed-strict-fields tree by parallelising
some of the traversals. Nothing great, but I didn't try very hard:
Serial code:
{-# OPTIONS -O2 -funbox-strict-fields #-}
import System.Environment
data Tree = Leaf !Int | Node Tree !Int Tree
main = do
n <- getArgs >>= readIO . head
let t = make (n*2) n
print (check t)
make :: Int -> Int -> Tree
make i 0 = Node (Leaf 0) i (Leaf 0)
make i d = Node (make (i2-1) d2) i (make i2 d2)
where i2 = 2*i
d2 = d-1
check :: Tree -> Int
check (Leaf _) = 0
check (Node l i r) = i + check l - check r
Running:
$ time ./A 28
55
./A 28 24.39s user 0.03s system 99% cpu 24.424 total
Ok. Now, parallelise that recursive call in 'check':
check :: Tree -> Int
check (Leaf _) = 0
check (Node l i r) = lp `par` (rp `pseq` i + lp - rp) -- <--
where lp = check l
rp = check r
Super-simple strategy -- will register too many sparks, but what the heh...
$ time ./B 28 +RTS -N2
55
./B 28 +RTS -N2 31.81s user 0.14s system 147% cpu 21.700 total
Pretty good for a naive strategy, and only one branch, on one line had to be modified.
Control.Parallel, yay!
-- Don
More information about the Haskell-Cafe
mailing list