Habanero
Contents
Async, Finish
Async and finish make up the fundamental building blocks of task-level parallelism in Habanero.
These concepts are first covered in RiceX Topic 1.1.
async(body) creates a new child task that can run before, after, or in parallel with all remaining statements of the parent task.
finish(body) executes body and waits for all child tasks to complete.
Future
A future is a tasks that return a value.
Futures are covered in RiceX Topic 2.1.
future(body) returns an instance of HjFuture. Invoking the get() method on that instance waits for the task to complete.
FinishAccumulator
Finish Accumulators provide a convenient way to keep track of a count (for example: the number of solutions in the n-queens problem) or perform a reduction as in the MapReduce_Assignment.
FinishAccumulators are covered in RiceX Topic 2.3.
FinishAccumulator Creation
There are several ways to create the different forms of accumulators, but the two that come up in CSE231s are:
newIntegerFinishAccumulator( NumberReductionOperator.SUM )
and
newReducerFinishAccumulator(Reducer<T> reducer)
FinishAccumulator Registration
finish(register(accumulators), body)
Loops
forasync
forasync(0, size-1, (i)->{ ... } );
can be thought of as:
for( int _i=0; _i<size; _i++ ) { final int i = _i; async( ()->{ ... }); }
forall
forall(0, size-1, (i)->{} );
is just forasync wrapped in a finish:
finish(()-> { forasync(0, size-1, (i)->{} ); });
chunked
the chunked() option to the forasync, forall, forasync2d, and forall2d splits up the work in a way that the runtime system sees fit.
grouped
more precise control over how the work is split up via support for grouping.
int numTasks = numThreads(); HjRegion1D iterSpace = newRectangularRegion1D(0, size - 1); forall(0, numTasks-1, (groupId)-> { HjRegion1D group = myGroup(groupId, iterSpace, numTasks); forseq(group, (i) -> { ... }); } );