From CSE231 Wiki
Revision as of 00:20, 30 September 2017 by Cosgroved (talk | contribs) (Loops)
Jump to: navigation, search

For Rice's official documentation on Habanero, refer to this link.

CSE 231s thin wrapper of Habanero.

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.


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.


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 )


newReducerFinishAccumulator(Reducer<T> reducer)

FinishAccumulator Registration

finish(register(accumulators), body)


WARNING: CSE 231s is all exclusive max, all the time. forall, forasync, and forseq are all exclusive max.


forasync(0, size, (i)->{
} );

can be thought of as:

for( int _i=0; _i<size; _i++ ) {
    final int i = _i;
    async( ()->{


forall(0, size, (i)->{
} );

is just forasync wrapped in a finish:

finish(()-> {
    forasync(0, size, (i)->{
    } );


forseq(0, size, (i)->{
} );

is equivalent to a standard for loop:

for( int i=0; i<size; i++ ) {


the chunked() option to the forasync, forall, forasync2d, and forall2d splits up the work in a way that the runtime system sees fit.


more precise control over how the work is split up via support for grouping.

int numTasks = numThreads();
HjRegion1D iterSpace = newRectangularRegion1D(0, size);
forall(0,  numTasks, (groupId)-> {
	HjRegion1D group = myGroup(groupId, iterSpace, numTasks);
	forseq(group, (i) -> {
} );