On 05/03/2010 13:45, Neil Brown wrote:
Simon Marlow wrote:
import Control.Concurrent
import Control.Concurrent.CML
import Control.Monad

main :: IO ()
main = do let numChoices = 2
cs <- replicateM numChoices channel
mapM_ forkIO [replicateM_ (100000 `div` numChoices) $ sync $ transmit
c () | c <- cs]
replicateM_ 100000 $ sync $ choose [receive c (const True) | c <- cs]

Good grief. Can I get a copy of this program? It might be something
simple that we can fix. Just having lots of threads shouldn't be a
performance problem per se, we have benchmarks that create millions of
threads without any problems.
That's all the code you need, along with the cml package from Hackage.
Put the above few lines into GoodGrief.hs (the reply has munged the
indentation slightly), and do:

cabal install cml
ghc --make -threaded GoodGrief.hs
./GoodGrief +RTS -s

That got me the listed results on GHC 6.12.1 (I did use -threaded but
not -N as I was on a single-core machine; I believe the same problem
occurs without -threaded). The problem is in the CML library that the
above code uses.

Yes, I see what the problem is. Removing a thread from the queue attached to an MVar is a O(n) operation, and in this case you have thousands of threads attached to MVars and the system wants to clean them all up before exiting, hence things go O(n^2). Threads only need to be removed from the queue when

 - they are the target of throwTo from another thread

 - the system is shutting down, and deleting threads

 - the thread is unreachable and needs to be woken up to be sent
   the BlockedIndefinitelyOnMVar exception (this is probably why
   you sometimes get the 60s GC just after your benchmark has
   finished, but before shutdown).

So as it happens Simon PJ and I were discussing some changes yesterday that will eventually make removing a thread from a queue an O(1) operation. Hopefully 6.14.1 will be better in this regard.

Cheers,
        Simon
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to