Difference between revisions of "LeggedRaces"

From CSE231 Wiki
Jump to navigation Jump to search
Line 18: Line 18:
 
: [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Phaser.html#arriveAndAwaitAdvance-- arriveAndAwaitAdvance]
 
: [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Phaser.html#arriveAndAwaitAdvance-- arriveAndAwaitAdvance]
 
: [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Phaser.html#arriveAndDeregister-- arriveAndDeregister] (note: not required for this studio, but good to know about.)
 
: [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Phaser.html#arriveAndDeregister-- arriveAndDeregister] (note: not required for this studio, but good to know about.)
 +
 +
=Questions To Ask Yourself=
 +
# What are my tasks?
 +
# What work does each task need to do?
 +
# Upon what does each task depend?  That is: what does it have to wait for to proceed?
  
 
=Code To Implement=
 
=Code To Implement=

Revision as of 18:10, 8 March 2018

Motivation

In a legged race, a group of people must try to move forward as quickly as possible with their legs tied to each other. In other words, the group can only be as quick as its slowest link and they must try to move in unison. In many ways, this concept mirrors parallel phasers. In this studio, you will use phasers and forall loops in order to simulate a legged race.

Background

Code To Use

Java For Loop

Java For Each Loop

forall

Guide to the Java Phaser

class Phaser

bulkRegister
arriveAndAwaitAdvance
arriveAndDeregister (note: not required for this studio, but good to know about.)

Questions To Ask Yourself

  1. What are my tasks?
  2. What work does each task need to do?
  3. Upon what does each task depend? That is: what does it have to wait for to proceed?

Code To Implement

You will have to implement four separate approaches to this problem: sequential, forall, forall_phased (which just uses next() barriers), and forall_phased_point_to_point (which uses an array of phasers to signal and wait). For each of these implementations, you must just complete the takeSteps method.

SequentialLeggedRace

class: SequentialLeggedRace.java Java.png
methods: takeSteps
package: leggedrace.studio
source folder: student/src/main/java

method: public void takeSteps(Participant[] participants, int stepCount) Sequential.svg (sequential implementation only)

In this implementation, try to solve the problem sequentially. Your method should go through the array of participants and make each one takeStep until you do this for every stepIndex up until the stepCount for every participant.

Hint: Basically, you will need two for loops. One that iterates up until the stepCount and another which goes through the array of participants.

ForallLeggedRace

class: ForallLeggedRace.java Java.png
methods: takeSteps
package: leggedrace.studio
source folder: student/src/main/java

method: public void takeSteps(Participant[] participants, int stepCount) Parallel.svg (parallel implementation required)

In this implementation, the participants should all take each individual step in parallel. However, the steps should be taken each in turn sequentially. Think about where to place the forall loop so that the program only progresses to the next stepIndex after every participant has performed a takeStep with the current index value.

ForallPhasedLeggedRace

class: ForallPhasedLeggedRace.java Java.png
methods: takeSteps
package: leggedrace.studio
source folder: student/src/main/java

method: public void takeSteps(Participant[] participants, int stepCount) Parallel.svg (parallel implementation required)

In this solution, you will flip your sequentialLoop/parallelLoop pattern into a parallelPhasedLoop/sequentialLoop pattern with phaserNext().

ForallPhasedPointToPointLeggedRace

class: ForallPhasedPointToPointLeggedRace.java Java.png
methods: takeSteps
package: leggedrace.studio
source folder: student/src/main/java

method: public void takeSteps(Participant[] participants, int stepCount) Parallel.svg (parallel implementation required)

In this implementation, you will build on what you did with the forall implementation to incorporate an array of phasers. Start this off by instantiating an array of phasers at DEFAULT_MODE so that the phasers can both signal and wait. Afterwards, takeStep as you did before with each participant, but remember that the partner phaser should wait until the participant phaser signals something. Remember that you must still ensure that every participant must take a step at the current index value before moving on to the next index.

For this implementation there is no incantation of the parallel forall loop we can use. Rather, we will use a normal Java for loop to spawn async(phased(...),()->{ ... })s wrapped in a finish().

Use provided int getPartnerIndex(int) to find the partner for a participant.

Testing Your Solution

Visualization

class: LeggedRaceVisualizationApp.java VIZ
package: leggedrace.viz
source folder: student/src//java

Click on the buttons on the right to visualize your solutions when you have implemented them.

LeggedRaceScreenShot.png

Correctness

class: LeggedRaceTestSuite.java Junit.png
package: leggedrace.studio
source folder: testing/src/test/java
class: PartialCreditLeggedRaceTestSuite.java Junit.png
package: leggedrace.studio
source folder: testing/src/test/java