Advice wanted on parallel processing
Colin Paul Adams
colin at colina.demon.co.uk
Wed Mar 18 16:34:02 EDT 2009
>>>>> "Daniel" == Daniel Fischer <daniel.is.fischer at web.de> writes:
Daniel> generate_moves_for_piece produces a list. rwhnf forces
Daniel> this list enough to see if it's [] or (_:_) (rwhnf x = x
Daniel> `seq` ()), that doesn't get enough work done in each
Daniel> thread to compensate the overhead. Try using rnf after
Daniel> writing an NFData instance for Move.
Daniel> If e.g.
Daniel> data Move = Move {from :: Position, to :: Position}
Daniel> , the instance would be
Daniel> instance NFData Move where rnf (Move f t) = rnf f `seq`
Daniel> rnf t `seq` ()
It made no difference to the timings whatsoever.
Anyway, at that point I decided to revert to the first rule of
performance tuning, and profiled the program for time. The move
generator was using less than 3% of the cpu time, so that was clearly
a waste of time on my part.
The one routine that stood out was this one (about 35% CPU time, with
0% attributed to children):
-- | Value of one rank of the board
rank_value :: (Int, Array Int Square) -> Int
rank_value (rank_coord, rank') = sum (map (cell_value rank_coord)
(assocs rank'))
The array has 12 elements.
So I tried changing the map to parMap rnf. This gave timings of:
>> -N1 93 seconds -N2 105 seconds -N3 206 seconds
at which point I decided I hadn't got a clue what was going on.
--
Colin Adams
Preston Lancashire
More information about the Glasgow-haskell-users
mailing list