Difference between revisions of "Habanero"

From CSE231 Wiki
Jump to navigation Jump to search
Line 1: Line 1:
 
For Rice's official documentation on Habanero, refer to [http://pasiphae.cs.rice.edu/ this link.]
 
For Rice's official documentation on Habanero, refer to [http://pasiphae.cs.rice.edu/ this link.]
 +
 +
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/f17/apidocs/edu/wustl/cse231s/rice/habanero/Habanero.html CSE 231s thin wrapper of Habanero].
  
 
==Async, Finish==
 
==Async, Finish==
Line 6: Line 8:
 
These concepts are first covered in [https://edge.edx.org/courses/RiceX/COMP322/1T2014R/courseware/a900dd0655384de3b5ef01e508ea09d7/be41f5f2b11a4445aa4be174e94f1717/1 RiceX Topic 1.1].
 
These concepts are first covered in [https://edge.edx.org/courses/RiceX/COMP322/1T2014R/courseware/a900dd0655384de3b5ef01e508ea09d7/be41f5f2b11a4445aa4be174e94f1717/1 RiceX Topic 1.1].
  
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/s17/javadocs/edu/wustl/cse231s/rice/classic/HabaneroClassic.html#async-edu.rice.hj.api.HjSuspendable- async(body)] creates a new child task that can run before, after, or in parallel with all remaining statements of the parent task.
+
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/f17/apidocs/edu/wustl/cse231s/rice/habanero/Habanero.html#async-edu.rice.hj.api.HjSuspendable- async(body)] creates a new child task that can run before, after, or in parallel with all remaining statements of the parent task.
  
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/s17/javadocs/edu/wustl/cse231s/rice/classic/HabaneroClassic.html#finish-edu.rice.hj.api.HjSuspendable- finish(body)] executes body and waits for all child tasks to complete.
+
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/f17/apidocs/edu/wustl/cse231s/rice/habanero/Habanero.html#finish-edu.rice.hj.api.HjSuspendable- finish(body)] executes body and waits for all child tasks to complete.
  
 
==Future==
 
==Future==
Line 15: Line 17:
 
Futures are covered in [https://edge.edx.org/courses/RiceX/COMP322/1T2014R/courseware/a900dd0655384de3b5ef01e508ea09d7/9eacfea8754549a4bc42918149130a74/1 RiceX Topic 2.1].
 
Futures are covered in [https://edge.edx.org/courses/RiceX/COMP322/1T2014R/courseware/a900dd0655384de3b5ef01e508ea09d7/9eacfea8754549a4bc42918149130a74/1 RiceX Topic 2.1].
  
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/s17/javadocs/edu/wustl/cse231s/rice/classic/HabaneroClassic.html#future-edu.rice.hj.api.HjSuspendingCallable- future(body)] returns an instance of  [http://www.cs.rice.edu/~vs3/hjlib/doc/edu/rice/hj/api/HjFuture.html HjFuture].  Invoking the [http://www.cs.rice.edu/~vs3/hjlib/doc/edu/rice/hj/api/HjFuture.html#get-- get()] method on that instance waits for the task to complete.
+
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/f17/apidocs/edu/wustl/cse231s/rice/habanero/Habanero.html#future-edu.rice.hj.api.HjSuspendingCallable- future(body)] returns an instance of  [http://www.cs.rice.edu/~vs3/hjlib/doc/edu/rice/hj/api/HjFuture.html HjFuture].  Invoking the [http://www.cs.rice.edu/~vs3/hjlib/doc/edu/rice/hj/api/HjFuture.html#get-- get()] method on that instance waits for the task to complete.
  
 
==FinishAccumulator==
 
==FinishAccumulator==
Line 35: Line 37:
  
 
==Loops==
 
==Loops==
 +
 +
NOTE: CSE 231s is all exclusive max, all the time.  forall, forasync, and forseq are all exclusive max.
  
 
===forasync===
 
===forasync===
  
  <nowiki>forasync(0, size-1, (i)->{
+
  <nowiki>forasync(0, size, (i)->{
 
     ...
 
     ...
 
} );</nowiki>
 
} );</nowiki>
Line 53: Line 57:
 
===forall===
 
===forall===
  
  <nowiki>forall(0, size-1, (i)->{
+
  <nowiki>forall(0, size, (i)->{
 
     ...
 
     ...
 
} );</nowiki>
 
} );</nowiki>
Line 60: Line 64:
  
 
  <nowiki>finish(()-> {
 
  <nowiki>finish(()-> {
     forasync(0, size-1, (i)->{
+
     forasync(0, size, (i)->{
 
         ...
 
         ...
 
     } );
 
     } );
Line 67: Line 71:
 
===forseq===
 
===forseq===
  
  <nowiki>forseq(0, size-1, (i)->{
+
  <nowiki>forseq(0, size, (i)->{
 
     ...
 
     ...
 
} );</nowiki>
 
} );</nowiki>
Line 84: Line 88:
  
 
  <nowiki>int numTasks = numThreads();
 
  <nowiki>int numTasks = numThreads();
HjRegion1D iterSpace = newRectangularRegion1D(0, size - 1);
+
HjRegion1D iterSpace = newRectangularRegion1D(0, size);
forall(0,  numTasks-1, (groupId)-> {
+
forall(0,  numTasks, (groupId)-> {
 
HjRegion1D group = myGroup(groupId, iterSpace, numTasks);
 
HjRegion1D group = myGroup(groupId, iterSpace, numTasks);
 
forseq(group, (i) -> {
 
forseq(group, (i) -> {

Revision as of 05:02, 30 September 2017

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.

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

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

forasync

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

can be thought of as:

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

forall

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

is just forasync wrapped in a finish:

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

forseq

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

is equivalent to a standard for loop:

for( int i=0; i<size; 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);
forall(0,  numTasks, (groupId)-> {
	HjRegion1D group = myGroup(groupId, iterSpace, numTasks);
	forseq(group, (i) -> {
		...
	});
} );