Difference between revisions of "Iced Cakes Pipeline"
(6 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | [[File:KitchenAid Stand Mixer.jpg|thumb|KitchenAid Stand Mixer]] [[File:Jean-François Millet (II) 005.jpg|thumb|Jean-François Millet (II) 005]] [[File:Piping buttercream onto cake.JPG|thumb|Piping buttercream onto cake]] | ||
+ | |||
=Motivation= | =Motivation= | ||
Pipelines can increase throughput when processing a stream of data. We will gain additional experience with Phasers by building a software pipeline. | Pipelines can increase throughput when processing a stream of data. We will gain additional experience with Phasers by building a software pipeline. | ||
− | = | + | =Perhaps Outdated Lecture= |
− | + | {{CollapsibleYouTube|Perhaps Outdated Pipeline Lecture|<youtube>umTGnCc9cGU</youtube>}} | |
− | |||
− | |||
− | <youtube>umTGnCc9cGU</youtube> | ||
=Code To Use= | =Code To Use= | ||
Line 18: | Line 17: | ||
[https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/pipeline/cake/core/Icer.html class Icer] | [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/pipeline/cake/core/Icer.html class Icer] | ||
:[https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/pipeline/cake/core/Icer.html#ice-int-pipeline.cake.core.BakedCake- ice(int cakeIndex, BakedCake bakedCake)] | :[https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/pipeline/cake/core/Icer.html#ice-int-pipeline.cake.core.BakedCake- ice(int cakeIndex, BakedCake bakedCake)] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
==Phasers== | ==Phasers== | ||
Line 36: | Line 30: | ||
[http://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/concurrent/PhaserUtils.html PhaserUtils] | [http://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/concurrent/PhaserUtils.html PhaserUtils] | ||
: [http://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/concurrent/PhaserUtils.html#awaitAdvanceForPhase-java.util.concurrent.Phaser-int- awaitAdvanceForPhase] | : [http://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/edu/wustl/cse231s/concurrent/PhaserUtils.html#awaitAdvanceForPhase-java.util.concurrent.Phaser-int- awaitAdvanceForPhase] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=Code To Implement= | =Code To Implement= | ||
Line 75: | Line 41: | ||
Note that icer.ice() returns an object of IcedCake. Collect all the 'IcedCake's you make, and return them in an array. | Note that icer.ice() returns an object of IcedCake. Collect all the 'IcedCake's you make, and return them in an array. | ||
− | {{Warning|Do not forget to ensure that all of your tasks complete before you return.}} | + | {{Warning|Do not forget to ensure that all of your tasks (mix, bake, and ice) complete before you return. }} |
[[File:CakePipeline.svg | 600px]] | [[File:CakePipeline.svg | 600px]] | ||
Line 90: | Line 56: | ||
*Make sure that only one of the two ovens bakes any given cake. Use baker.inUse() and baker.numberAlreadyBaked() to help keep track of which oven has done which cakes. | *Make sure that only one of the two ovens bakes any given cake. Use baker.inUse() and baker.numberAlreadyBaked() to help keep track of which oven has done which cakes. | ||
--> | --> | ||
+ | |||
+ | {{Alert|<br/>Recall that [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Phaser.html#awaitAdvance-int- awaitAdvance(phase)]'s returns immediately if the current phase is not the given phase.<br/>It is often better to use [https://www.cse.wustl.edu/~dennis.cosgrove/courses/cse231/current/apidocs/edu/wustl/cse231s/concurrent/PhaserUtils.html#awaitAdvanceForPhase(java.util.concurrent.Phaser,int) PhaserUtils.awaitAdvanceForPhase(phaser, phase)].}} | ||
=Testing Your Solution= | =Testing Your Solution= | ||
Line 102: | Line 70: | ||
==Correctness== | ==Correctness== | ||
− | {{TestSuite| | + | {{TestSuite|_CakePipelineTestSuite| pipeline.cake.exercise}} |
− | + | =Pledge, Acknowledgments, Citations= | |
+ | {{Pledge|exercise-cake-pipeline}} |
Latest revision as of 03:13, 26 April 2023
Contents
Motivation
Pipelines can increase throughput when processing a stream of data. We will gain additional experience with Phasers by building a software pipeline.
Perhaps Outdated Lecture
Video: Perhaps Outdated Pipeline Lecture |
---|
Code To Use
Mixer
Oven
Icer
Phasers
Our reference page's phasers section
class Phaser (Guide to the Java Phaser)
- register
- arrive
- awaitAdvance use via PhaserUtils.awaitAdvanceForPhase(phaser, phase)
Code To Implement
Required Code
class: | CakePipeline.java | |
methods: | mixBakeAndIceCakes | |
package: | pipeline.cake.studio | |
source folder: | student/src/main/java |
method: public static IcedCake[] mixBakeAndIceCakes(Mixer mixer, Oven oven, Icer icer, int cakeCount)
(parallel implementation required)
Design a simple pipeline using Phasers. In order to have a finished cake, you need to first mix the ingredients, then bake the cake, and finally ice it with frosting. Although you only have one tool for each step (one whisk, one oven, and one icing spatula), there's no problem with icing one cake while another is baking in the oven. That's where the parallelism comes in. Answering the above questions should give you all the information you need to set up this method. Remember that this needs to be able work for any number of cakes passed through!
Note that icer.ice() returns an object of IcedCake. Collect all the 'IcedCake's you make, and return them in an array.
Warning:Do not forget to ensure that all of your tasks (mix, bake, and ice) complete before you return. |
Optional Challenge
class: | MultiOvenCakePipeline.java | |
methods: | mixBakeAndIceCakes | |
package: | pipeline.cake.challenge | |
source folder: | student/src/main/java |
method: public static IcedCake[] mixBakeAndIceCakes(Mixer mixer, List<Oven> ovens, Icer icer, int cakeCount)
(parallel implementation required)
As we've discussed in class, not all steps of the pipeline always take the same amount of time to complete. In this example, baking a cake in the oven usually takes much longer than simply mixing the ingredients or icing the cake. The Oven is the bottleneck on the performance of this pipeline. One way to further improve the process then is to simply more ovens. This time, build a similar pipeline to what you made earlier, but use all of the Ovens passed to you in order to speed things up. Here's a couple things to take note of:
- How have the tasks changed? How does this additional oven affect the number of tasks your program will use?
Alert: Recall that awaitAdvance(phase)'s returns immediately if the current phase is not the given phase. It is often better to use PhaserUtils.awaitAdvanceForPhase(phaser, phase). |
Testing Your Solution
Visualization
class: | CakePipelineVizApp.java | VIZ |
package: | pipeline.cake.viz | |
source folder: | student/src//java |
The viz below is for the challenge assignment.
Correctness
class: | _CakePipelineTestSuite.java | |
package: | pipeline.cake.exercise | |
source folder: | testing/src/test/java |
Pledge, Acknowledgments, Citations
file: | exercise-cake-pipeline-pledge-acknowledgments-citations.txt |
More info about the Honor Pledge