-- -*- 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])