lightweight concurrent tasks
DESCRIPTION
Lightweight Concurrent Tasks. Lecture 1.d. Acknowledgements. Authored by Thomas Ball, MSR Redmond. What We’ve Seen So Far. Parallel.For / ForEach data parallelism over integer range or IEnumerable automatic generation of tasks dynamic partitioning and load balancing - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/1.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
1
Lightweight Concurrent Tasks
Lecture 1.d
6/16/2010
![Page 2: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/2.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
2
Acknowledgements
• Authored by– Thomas Ball, MSR Redmond
6/16/2010
![Page 3: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/3.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
3
What We’ve Seen So Far
• Parallel.For/ForEach– data parallelism over integer range or IEnumerable– automatic generation of tasks– dynamic partitioning and load balancing
• Parallel.For doesn’t address many problems– Irregular matrix algorithms– Algorithms over trees, graphs– …
6/16/2010
![Page 4: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/4.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
4
Concepts
• Wavefront computation
• Task– Task Status– Parent/child relationship– Task Result– Task Continuation
6/16/2010
CodeConcept
PerformanceConcept
![Page 5: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/5.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
5
Levenshtein Edit Distance
• Find minimal distance between strings s1 and s2– via character insertions, deletions, and substitutions
• Example of dynamic programming– break down problems into smaller problems– cache (“memoize”) results of subproblems
• Other examples– longest common subsequence, matrix-chain multiplication,
sequence alignment
6/16/2010
![Page 6: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/6.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
6
Edit Distance and Wavefront
S A T U R D A Y0 1 2 3 4 5 6 7 8
S 1U 2N 3D 4A 5Y 6
(i-1,j-1) (i,j-1)
(i-1,j) (i,j)
dist[i, j] = (s1[i - 1] == s2[j - 1]) ? dist[i - 1, j - 1] : 1 + min(dist[i - 1, j], min(dist[i, j - 1], dist[i - 1, j - 1]));
s1
s2
i>0 and j>0
dist
6/16/2010
![Page 7: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/7.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
7
Edit Distance and Wavefront
S A T U R D A Y0 1 2 3 4 5 6 7 8
S 1 0 1 2 3 4 5 6 7
U 2 1 1 2 2 3 4 5 6
N 3 2 2 2 3 3 4 5 6
D 4 3 3 3 3 4 3 4 5
A 5 4 3 4 4 4 4 3 4
Y 6 5 4 4 5 5 5 4 3
6/16/2010
![Page 8: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/8.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
8
TaskFactory and Task
• TaskFactory– Task StartNew(Action)– Task ContinueWhenAll(Task[], Action<Task[]>)
• Task– static TaskFactory Factory– Task ContinueWith(Action<Task>)– void Wait()
6/16/2010
![Page 9: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/9.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
9
Wavefront on 2x2 Matrix A CB D
A
B
D
C
6/16/2010
Task A = Task.Factory.StartNew(actionA); Task B = A.ContinueWith(actionB); Task C = A.ContinueWith(actionC); Task D = Task.Factory.ContinueWhenAll( new Task[2] { B, C }, actionD); D.Wait();
![Page 10: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/10.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
10
3x3 Matrix and Task Graph
A C F
B E H
D G I
A
B
E
C
D F
G H
I6/16/2010
![Page 11: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/11.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
11
General Wavefront Algorithm
void Wavefront(int numRows, int numColumns, Action<int,int> processCell)
6/16/2010
Alpaca
ProjectParallelAlgorithms_Wavefront.cs
![Page 12: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/12.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
12
Edit Distance with Parallel Wavefront// allocation of dist arrayWavefront(numRows, numColumns, (int i, int j ) => { if (i == 0) dist[i,j] = j; else if (j == 0) dist[i,j] = i; else dist[i, j] = (s1[i - 1] == s2[j - 1]) ? dist[i - 1, j - 1] : 1 + Math.Min(dist[i - 1, j],
Math.Min(dist[i, j - 1], dist[i - 1, j - 1])); });6/16/2010
Alpaca
ProjectEditDistance.cs
![Page 13: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/13.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
13
Performance of Parallel Wavefront
• Much worse than sequential!
• One Task per entry of the distance matrix– Not enough computation per Task– Coordination cost of Task allocation, management,
and synchronization dominates
6/16/2010
![Page 14: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/14.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
14
Blocking For More Work per Task
S A T U R D A Y
0 1 2 3 4 5 6 7 8
S 1 0 1 2 3 4 5 6 7
U 2 1 1 2 2 3 4 5 6
N 3 2 2 2 3 3 4 5 6
D 4 3 3 3 3 4 3 4 5
A 5 4 3 4 4 4 4 3 4
Y 6 5 4 4 5 5 5 4 3
6/16/2010
![Page 15: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/15.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
15
BlockedWavefront
static void BlockedWavefront( int numRows, int numColumns, int numBlocksPerRow, int numBlocksPerColumn, Action<int, int, int, int> processBlock)
6/16/2010
processBlock(start_i, end_i, start_j, end_j);
Alpaca
ProjectParallelAlgorithms_Wavefront.cs
![Page 16: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/16.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
16
BlockedWavefront
// Compute the size of each block. int rowBlockSize = numRows / numBlocksPerRow; int columnBlockSize = numColumns / numBlocksPerColumn; Wavefront(numBlocksPerRow, numBlocksPerColumn, (row, column) => { int start_i = row * rowBlockSize; int end_i = row < numBlocksPerRow - 1 ? start_i + rowBlockSize : numRows; int start_j = column * columnBlockSize; int end_j = column < numBlocksPerColumn - 1 ? start_j + columnBlockSize : numColumns; processBlock(start_i, end_i, start_j, end_j); });
6/16/2010
![Page 17: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/17.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
17
Tasks, TaskScheduler, ThreadPool
• Task represents an asynchronous operation• TaskScheduler
– is responsible for scheduling of Tasks– defaults to the .NET 4 ThreadPool– more on scheduling in Unit 5
• ThreadPool – effectively manages a set of Threads– More on thread pool and threads in Unit 5
6/16/2010
![Page 18: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/18.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
18
Task Status (partial)
WaitingToRun
Running
WaitingForChildrenToCompleteCanceled Faulted
RanToCompletion
6/16/2010
![Page 19: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/19.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
19
Task Status (partial list)WaitingToRun The task is scheduled for execution but has
not yet begun runningRunning The task is running but has not yet
completedWaitingForChildrenToComplete
The task has finished executing and is waiting for attached child tasks to complete
RanToCompletion The task completed execution successfully
Canceled The task acknowledged cancellation by throwing an OperationCanceledException
Faulted The task completed due to an unhandled exception
6/16/2010
![Page 20: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/20.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
20
Nested Tasks
static void SimpleNestedTask() { var parent = Task.Factory.StartNew(() => { Console.WriteLine("Outer task executing."); var child = Task.Factory.StartNew(() => { Console.WriteLine("Nested task starting."); Thread.SpinWait(500000); Console.WriteLine("Nested task completing."); }); }); parent.Wait(); Console.WriteLine("Outer has completed."); }
6/16/2010
TaskExamples.cs
Alpaca
Project
![Page 21: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/21.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
21
Child Tasksstatic void SimpleNestedTask() { var parent = Task.Factory.StartNew(() => { Console.WriteLine("Outer task executing."); var child = Task.Factory.StartNew(() => { Console.WriteLine("Nested task starting."); Thread.SpinWait(500000); Console.WriteLine("Nested task completing."); }, TaskCreationOptions.AttachedToParent); ); }); parent.Wait(); Console.WriteLine("Outer has completed."); }
6/16/2010
![Page 22: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/22.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
22
Relationship BetweenNested and Child Tasks?
“Nested” doesn’t imply “Child”
“Child” doesn’t imply “Nested”
6/16/2010
![Page 23: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/23.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
23
Task Results (Futures)var cts = new CancellationTokenSource();Task<int> dataForThefuture = Task.Factory.StartNew( () => ComputeSomeResult(), cts.Token);
...
// This will return the value immediately if the Task has already // completed, or will wait for the result to be available if it’s // not yet completed.int result = dataForTheFuture.Result;
6/16/2010
![Page 24: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/24.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
24
Task Results (Futures)var cts = new CancellationTokenSource();Task<int> dataForThefuture = Task.Factory.StartNew( () => ComputeSomeResult(), cts.Token);
...
// Cancel it and make sure we are made aware of any exceptions // that occurred.cts.Cancel();dataForTheFuture.ContinueWith(t => LogException(dataForTheFuture), TaskContinuationOptions.OnlyOnFaulted);
6/16/2010
![Page 25: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/25.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
25
Tasks and Exceptions
• If a nested task throws an exception, it must be observed or handled directly in the outer task just as with any non-nested task
• If a child task C throws an exception, the exception is automatically propagated to the parent task (via C.Wait()or C.Result)
6/16/2010
![Page 26: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/26.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
26
Difference between Nest and Child Tasks
Category Nested Tasks Attached Child TasksOuter task (parent) waits for inner tasks to complete. No Yes
Parent propagates exceptions thrown by children (inner tasks).
No Yes
Status of parent (outer task) dependent on status of child (inner task).
No Yes
6/16/2010
![Page 27: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/27.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
27
TaskContinuationOptions(partial)
NotOnRanToCompletion
Continuation task should not be scheduled if its antecedent ran to completion.
NotOnFaulted Continuation task should not be scheduled if its antecedent threw an unhandled exception
NotOnCanceled Continuation task should not be scheduled if its antecedent was canceled
OnlyOnlyOnRanToCompletion,OnlyOnFaulted,OnlyOnCanceled
You can guess…
6/16/2010
![Page 28: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/28.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
28
Tasks and Cancellation
• Task cancellation is cooperative• To cancel a parent and all its children in one
request, pass the same token to all tasks – Parent cancellation doesn’t imply child
cancellation– When child task cancels itself, a
TaskCanceledException is propagated to the joining task (see exceptions)
6/16/2010
![Page 29: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/29.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
29
static void MyParallelInvoke(params Action[] actions){ var tasks = new Task[actions.Length]; for (int i = 0; i < actions.Length; i++) { tasks[i] = Task.Factory.StartNew(actions[i]); } Task.WaitAll(tasks);}
One Task per Element
6/16/2010
Alpaca
ProjectMyParallel.cs
![Page 30: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/30.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
30
static T[] MyParallelInvoke<T>(params Func<T>[] functions){ var results = new T[functions.Length]; Task.Factory.StartNew(() => { for (int i = 0; i < functions.Length; i++) { int cur = i; Task.Factory.StartNew( () => results[cur] = functions[cur](), TaskCreationOptions.AttachedToParent); } }).Wait(); return results;}
One Task per Element,With Child Tasks
6/16/2010
![Page 31: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/31.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
31
static T[] MyParallelInvoke<T>( params Func<T>[] functions
) { T[] results = new T[functions.Length]; Parallel.For(0, functions.Length, i => { results[i] = functions[i](); }); return results;}
One Task per Element,With Parallel.For
6/16/2010
![Page 32: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/32.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
32
http://code.msdn.microsoft.com/ParExtSamples
• ParallelExtensionsExtras.csproj– Extensions/
• TaskExtraExtensions.cs• TaskFactoryExtensions/
– ParallelAlgorithms/
6/16/2010
![Page 33: Lightweight Concurrent Tasks](https://reader036.vdocument.in/reader036/viewer/2022062323/568162c0550346895dd34ff1/html5/thumbnails/33.jpg)
Practical Parallel and Concurrent Programming DRAFT: comments to [email protected]
33
Parallel Programming with Microsoft .NET
• Chapter 3 (Parallel Tasks)• Chapter 6 (Dynamic Task Parallelism)
6/16/2010