[Haskell-cafe] Re: Re[2]: Parallel combinator, performance advice
Neil Mitchell
ndmitchell at gmail.com
Tue Apr 7 11:33:25 EDT 2009
Hi
Sebastian:
> How about using unsafeInterleaveIO to get a lazy suspension of the result of each action,
> and then using par to spark off each of them? If that works you can reuse the existing
> task-parallel system of GHC to do the heavily lifting for you, instead of having to write your
> own.
par is likely to spark all the computations, and then switch between
them - which will mean I've got more than N things running in
parallel.
> i think the only way to solve this problem is to create one more
> thread each time. let's see: on every call to para you need to alloc
> one thread to wait for jobs completion. so on each nested call to para
> you have minus one worker thread. finally you will eat them all!
>
> so you need to make fork: one thread should serve jobs and another one
> wait for completion of this jobs bucket. and with killItself flag you
> will finish superfluous thread JIT
You are right, your previous solution was running at N-1 threads if
the order was a little unlucky. I've attached a new version which I
think gives you N threads always executing at full potential. It's
basically your idea from the last post, with the main logic being:
parallel_ (x1:xs) = do
sem <- newQSem $ 1 - length xs
forM_ xs $ \x ->
writeChan queue (x >> signalQSem sem, False)
x1
addWorker
waitQSem sem
writeChan queue (signalQSem sem, True)
waitQSem sem
Where the second flag being True = kill, as you suggested. I think
I've got the semaphore logic right - anyone want to see if I missed
something?
With this new version running 1000000 items takes ~1 second, instead
of ~10 seconds before, so an order of magnitude improvement, and
greater fairness. Very nice, thanks for all the help!
Thanks
Neil
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Parallel3.hs
Type: application/octet-stream
Size: 1462 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20090407/72ac00a2/Parallel3.obj
More information about the Haskell-Cafe
mailing list