You are on page 1of 66

Dual-Core Itanium 2

Intel CPU Trends


(sources: Intel, Wikipedia, K. Olukotun)
Pentium 4

Pentium

386
http://parallelpatterns.codeplex.com/
1 1 1 1

2 2 2

3 3
Pipeline

Futures
Parallel
Loop

Parallel
Aggregation
Parallel
Tasks
static void Walk<T>(Tree<T> root, Action<T> action)
{
if (root == null) return;
var t1 = Task.Factory.StartNew(() =>
action(root.Data));
var t2 = Task.Factory.StartNew(() =>
Walk(root.Left, action));
var t3 = Task.Factory.StartNew(() =>
Walk(root.Right, action));
Task.WaitAll(t1, t2, t3);
}
QUIZ…
http://parallelpatterns.codeplex.com/
Patterns for Parallel Programming

Design Patterns
Head First Design Patterns
Patterns of Enterprise Application Architecture

A Pattern Language for Parallel Programming ver2.0


ParaPLOP

http://ademiller.com/tech/
www.microsoft.com/teched www.microsoft.com/learning

http://microsoft.com/technet http://microsoft.com/msdn
Sign up for Tech·Ed 2011 and save $500
starting June 8 – June 31st
http://northamerica.msteched.com/registration

You can also register at the


North America 2011 kiosk located at registration
Join us in Atlanta next year
Divide & Distributed
Pipeline Actors
Conquer Array Map
Producer/ MPMD Reduce
Consumer

SPMD Parallel
Loops
Master/ Fork/ Shared Repository
Worker Join Queue
Task
Graph

SOA
Facade

Source: More Patterns for Parallel Application Programs, Berna L. Massingill, Timothy G. Mattson and Beverly A. Sanders
Source: Design Patterns – Gamma, Helm, Johnson & Vlissides
Patterns of Enterprise Application Architecture - Fowler
ConcurrentFoo
IFoo Foo

Source: Design Patterns – Gamma, Helm, Johnson & Vlissides


Source: Patterns of Enterprise Application Architecture - Fowler
Task Queue

Source: Patterns for Parallel Programming – Mattson, Sanders & Massingill


var results =
new ConcurrentQueue<Result>();

Parallel.For(0, 1000, (i) =>


{
Result result =
ComputeResult(i);
results.Enqueue(result);
});
var accountRatings =
accounts.AsParallel()
.Select(item =>
CreditRating(item))
.ToList();
Parallel.For (0, acc.Length, i =>
{
acc[i].UpdateCreditRating();
});

#pragma omp parallel for


for (int i = 0; i < len; i++)
{
acc[i].UpdateCreditRating();
}
Parallel.Invoke(
() => ComputeMean(),
() => ComputeMedian()
);

parallel_invoke(
[&] { ComputeMean(); },
[&] { ComputeMedian(); },
);
var input = new BlockingCollection<string>();

var readLines = Task.Factory.StartNew(() =>


{
try {
foreach(var line in
File.ReadAllLines(@"input.txt"))
input.Add(line);
}
finally { input.CompleteAdding(); }
});

var writeLines = Task.Factory.StartNew(() =>


{
Get-ChildItem C:\ |
Where-Object {$_.Length -gt 2KB} |
Sort-Object Length

You might also like