[Haskell-cafe] Uses forkOS all CPUS on-board?

Dusan Kolar kolar at fit.vutbr.cz
Wed Nov 23 09:51:49 EST 2005


Hello haskellers,

  in past few days, a lot of stuff on concurrency went through
the conference. I'm trying to use posted things and my own.
They work, even in a context switching regime, but I can't
exploit all the CPU's on my computer. Always is "active"
just one thread and, thus, the computation is even slower
than having a sequential version. Below, you can find
my code - it computes nothing useful, it's been simplified
to test parallelism, nothing else. Where's my error?

  Regards

    Dusan


import Control.Concurrent

-- computes nothing too much useful, but takes a long time ;-)
sumAllSums [] = 0
sumAllSums l@(_:xs) = sumlist 0 l + sumAllSums xs
    where sumlist res [] = res
          sumlist sr  (v:vs) = sumlist (sr+v) vs


main = do
  putStrLn "Starting..."
  mv1 <- newEmptyMVar
  mv2 <- newEmptyMVar
  t1 <- forkOS $ mkSum1 mv1
  t2 <- forkOS $ mkSum2 mv2
  tt mv1 mv2
  forkOS $ do killThread t1
              killThread t2
  putStrLn "Done!"
  where
    mkSum1 mv = do
      let res = sumAllSums [1..10000]
      let ms1 = "Sum1: " ++ show res
      seq (length ms1) (putMVar mv ms1)
    mkSum2 mv = do
      let res = sumAllSums [1..10001]
      let ms2 = "Sum2: " ++ show res
      seq (length ms2) (putMVar mv ms2)
    tt mv1 mv2 = do
      yield
      mr1 <- tryTakeMVar mv1
      case mr1 of
        Just r1 -> do
          yield
          putStrLn r1
          yield
          r2 <- takeMVar mv2
          putStrLn r2
        Nothing -> do
          mr2 <- tryTakeMVar mv2
          case mr2 of
            Just r2 -> do
              yield
              putStrLn r2
              yield
              r1 <- takeMVar mv1
              putStrLn r1
            Nothing -> tt mv1 mv2
  



More information about the Haskell-Cafe mailing list