Advice wanted on parallel processing

Colin Paul Adams colin at
Wed Mar 18 16:34:02 EDT 2009

>>>>> "Daniel" == Daniel Fischer < at> 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