
On 04/12/09 11:51, Patrick Caldon wrote:
I'm looking for the "right" concurrency library/semantics for what should be a reasonably simple problem.
I have a little simulator:
runWorldSim :: MTGen -> SimState -> IO SimState
it takes about a second to run on a PC. It's functional except it whacks the rng, which needs IO. I run 5-10 of these jobs, and then use:
mergeWorld :: [SimState] -> SimState
to pick the best features of the runs and build another possible world (state). Then I use this new world to run another 5-10 jobs and so on. I run this through ~20000 iterations.
It's an obvious place for parallelism.
If you can get rid of the need for IO then you can use Control.Parallel to evaluate pure functions instead. If you only use IO for the random numbers then you can either keep a StdGen in your SimState or else use a "State StdGen" monad. Since your random number use is presumably already in monadic IO you could probably switch to a state monad fairly trivially. Paul.