[Haskell-cafe] multithreading speedup
Stefan O'Rear
stefanor at cox.net
Fri Apr 13 18:33:44 EDT 2007
On Sat, Apr 14, 2007 at 12:27:10AM +0200, Fawzi Mohamed wrote:
> I was trying to speed up a program that I wrote and so I thought
> about using multiple threads.
> I have a quite easy parallel program and I did the following
>
> do
> subRes <- MVar.newMVar []
> putStrLn "starting threads"
> subV <- flip mapM [0 .. (nThreads - 1)] $
> ( \i -> do
> subR <- MVar.newEmptyMVar
> let writeRes r = do { MVar.putMVar subR r }
> forkOS (do
> let r=eval (startData !! i)
> writeRes $! r
> putStr $ "writtenRes")
> return subR
> )
> putStrLn "started threads"
> toFold <- mapM MVar.takeMVar subV
> putStrLn "about to fold"
> return $ foldl1 mergeRes toFold
>
> I know that the threads really calculate what I want, and as soon as
> they are finished I get the result.
> The problem is that I have no speed up, the time is basically the sum
> of the time for the two threads.
> I thought that ghc now would take advantage of the two cpus if I
> compiled with -threaded.
> Am I wrong, do I need some special flag, a newer version of the
> compiler (I have 6.6.20070129), or it is just normal?
./MyProgram +RTS -N2
where N is your CPU count.
(that said, DO NOT USE THREADS IF AT ALL POSSIBLE, they are ugly and
cause heisenbugs, if you want paralelism `par` from Control.Parallel
is to be preferred if at all possible since it is deterministic)
Stefan
More information about the Haskell-Cafe
mailing list