From 4884824ae42145fbdc3b723fd3459cd108cc91d1 Mon Sep 17 00:00:00 2001 From: Sebastian Fischer Date: Tue, 7 Apr 2009 16:04:20 +0200 Subject: [PATCH] implemented search using explicit parallelism instead of cuncurrency. --- Control/Concurrent/ParallelTreeSearch.hs | 40 ++++++------------------ parallel-tree-search.cabal | 2 +- 2 files changed, 10 insertions(+), 32 deletions(-) diff --git a/Control/Concurrent/ParallelTreeSearch.hs b/Control/Concurrent/ParallelTreeSearch.hs index 98cde79..93326c7 100644 --- a/Control/Concurrent/ParallelTreeSearch.hs +++ b/Control/Concurrent/ParallelTreeSearch.hs @@ -10,37 +10,15 @@ -- This Haskell library provides an implementation of parallel search -- based on the search tree provided by the package tree-monad. -- -module Control.Concurrent.ParallelTreeSearch ( parallelTreeSearch ) where +module Control.Concurrent.ParallelTreeSearch ( parSearch ) where -import Control.Monad import Control.Monad.SearchTree +import Control.Parallel -import Control.Concurrent - --- | Enumerate the leaves of a @SearchTree@ in parallel. -parallelTreeSearch :: Int -- ^ number of threads to use - -> SearchTree a -- ^ tree to search - -> IO [a] -- ^ lazy list of leaves -parallelTreeSearch threadCount tree = - do ctr <- newMVar 1 - res <- newChan - queue <- newChan - writeChan queue tree - sequence (replicate threadCount (forkIO (search ctr res queue))) - liftM (foldr (\mx xs -> maybe [] (:xs) mx) []) (getChanContents res) - -search :: MVar Int -> Chan (Maybe a) -> Chan (SearchTree a) -> IO () -search ctr res queue = process =<< readChan queue - where - process None = finished - process (One x) = do writeChan res (Just x); finished - process (Choice l r) = do modifyMVar_ ctr (return.succ) - writeChan queue l - writeChan queue r - search ctr res queue - - finished = do count <- modifyMVar ctr ((\n -> return (n,n)).pred) - if count == 0 then writeChan res Nothing - else search ctr res queue - - +-- | Enumerate the leaves of a @SearchTree@ using parallel depth-first search. +parSearch :: SearchTree a -- ^ tree to search + -> [a] -- ^ lazy list of leaves +parSearch None = [] +parSearch (One x) = [x] +parSearch (Choice l r) = rs `par` (parSearch l ++ rs) + where rs = parSearch r diff --git a/parallel-tree-search.cabal b/parallel-tree-search.cabal index d627701..24f983e 100644 --- a/parallel-tree-search.cabal +++ b/parallel-tree-search.cabal @@ -1,5 +1,5 @@ Name: parallel-tree-search -Version: 0.3 +Version: 0.4 Cabal-Version: >= 1.6 Synopsis: Parallel Tree Search Description: