monad-par-0.1: examples/partree/partree.hs
-- -*- haskell -*-
-- partree
-- parallel map over a tree
-----------------------------------------------------------------------------
module Main where
import System.Environment(getArgs)
import Control.Parallel
import Tree
main = do [arg1,arg2] <- getArgs
let
n = read arg1 :: Int -- size of tree in nodes
c = read arg2 :: Int -- work per node
res = partree c n
putStrLn ("partree " ++ unwords [arg1,arg2] ++ " = " ++ show res)
-- worker function to be mapped over the tree; heavily allocating!
bar :: Int -> Int -> Int
bar c n = tree_fold (\x y -> (x+y) `quot` 2) 0 t
where forest = [ let
l = take n (iterate (+i) i)
in
list2tree l
| i <- [1..c + n `mod` 15] ]
t = foldl1 (^:) forest
-- generate a tree with n nodes;
-- then map and fold 2 functions over it
partree :: Int -> Int -> Int
partree c n = (force_tree t) `seq` (tree_fold max 0 t)
where t = par_tree_map (bar c) (list2tree [1..n])