Print

Print


On May 12, 2010, at 3:34 PM, Steven Saul wrote:

> After looking at HeatBugs and the ThreadedDiffuser class, I was  
> wondering
> if there was a way to use ParallelSequence to split the processing of
> agents (in this case the actual heat bugs) in each time step.  For
> example, if you have 800 heatbugs in any given time step, a computer  
> with
> 8 cores would process 100 bugs on each core simultaneously in that  
> time
> step.

Sort of.  You just schedule a ParallelSequence on the schedule.  In
the ParallelSequence you put, say, eight RandomSequences.  Each of the  
RandomSequences
holds 1/8 of all your bugs.

However you have to be careful there.  Each HeatBug reads information,  
moves, and writes information. This presents opportunities for race  
conditions.  First, if one HeatBug is reading a location while another  
is writing the same location, you'll get messed up results.  Second,  
if two HeatBugs access the SparseGrid2D at the same time to move,  
they'll break the hash table.  This means that realistically you can  
only do the read portion of these operations in parallel.  So you'd  
have the parallel sequence call step() methods which do the reads and  
internal computation for each bug in parallel; but after that you'd  
have to schedule the bugs serially (as before, maybe in a later  
priority) to move themselves and then write to the heat array.

This is advanced threading stuff for people who are really familiar  
with the perils of threaded coding.  If the above paragraph causes you  
to say "huh?", then the answer is NO, you SHOULD NOT parallelize your  
agents.  :-)

Sean