Parallel programming patterns - Олександр Павлишак

71
Parallel Programming Patterns Аудиторія: розробники Олександр Павлишак, 2011 [email protected]

description

Паралелізм та concurrency -- напрямок, в якому технології програмування прямують зараз і, без сумніву, прямуватимуть в майбутньому. Багатоядерними процесорами оснащуються комп'ютери навіть початкового рівня, що відкриває можливості для створення швидких ефективних програм із "живими" інтерфейсами. Тому навіть ті розробники, які раніше не стикались із concurrent кодом, будуть все частіше і частіше програмувати із врахуванням паралелізму. В доповіді буде розглянуто шаблони паралельного програмування, способи асинхронного програмування, а також тенденції окремих сучасних технологій в області паралелізму та асинхронності. Слухачі зможуть отримати знання про основні способи організації паралельних обчислень у desktop-, web- і серверних аплікаціях, засоби досягнення responsive GUI, техніки вирішення проблем, що виникають у concurrent програмуванні.

Transcript of Parallel programming patterns - Олександр Павлишак

Page 1: Parallel programming patterns - Олександр Павлишак

Parallel Programming Patterns

Аудиторія: розробники

Олександр Павлишак, [email protected]

Page 2: Parallel programming patterns - Олександр Павлишак

Зміст

- Тренд- Основні терміни- Managing state- Паралелізм- Засоби

Page 3: Parallel programming patterns - Олександр Павлишак

Вчора

Page 4: Parallel programming patterns - Олександр Павлишак

Сьогодні

Page 5: Parallel programming patterns - Олександр Павлишак

Завтра

Page 6: Parallel programming patterns - Олександр Павлишак

Що відбувається?

- Ріст частоти CPU вповільнився- Через фізичні обмеження- Free lunch is over- ПЗ більше не стає швидшим саме по собі

Page 7: Parallel programming patterns - Олександр Павлишак

Сучасні тренди

- Manycore, multicore- GPGPU, GPU acceleration, heterogeneous

computing- Distributed computing, HPC

Page 8: Parallel programming patterns - Олександр Павлишак

Основні поняття

- Concurrency- Many interleaved threads of control

- Parallelism- Same result, but faster

- Concurrency != Parallelism- It is not always necessary to care about

concurrency while implementing parallelism- Multithreading- Asynchrony

Page 9: Parallel programming patterns - Олександр Павлишак

Задачі

- CPU-bound- number crunching

- I/O-bound- network, disk

Page 10: Parallel programming patterns - Олександр Павлишак

Стан

- Shared- accessible by more than one thread- sharing is transitive

- Private- used by single thread only

Page 11: Parallel programming patterns - Олександр Павлишак

Task-based program

Application

Tasks (CPU, I/O)

Runtime (queuing, scheduling)

Processors (threads, processes)

Page 12: Parallel programming patterns - Олександр Павлишак

Managing state

Page 13: Parallel programming patterns - Олександр Павлишак

Isolation

- Avoiding shared state- Own copy of state- Examples:

- process isolation- intraprocess isolation- by convention

Page 14: Parallel programming patterns - Олександр Павлишак

Immutability

- Multiple read -- not a problem!- All functions are pure- Requires immutable collections- Functional way: Haskell, F#, Lisp

Page 15: Parallel programming patterns - Олександр Павлишак

Synchronization

- The only thing that remains to deal with shared mutable state

- Kinds:- data synchronization- control synchronization

Page 16: Parallel programming patterns - Олександр Павлишак

Data synchronization

- Why? To avoid race conditions and data corruption

- How? Mutual exclusion- Data remains consistent- Critical regions

- locks, monitors, critical sections, spin locks- Code-centered

- rather than associated with data

Page 17: Parallel programming patterns - Олександр Павлишак

Critical region|Thread 1|// ...|lock (locker)|{| // ...| data.Operation();| // ...|}|// ...|||

|Thread 2|// ...|||||||lock (locker)|{| // ...| data.Operation();| // ...|}

Page 18: Parallel programming patterns - Олександр Павлишак

Control synchronization

- To coordinate control flow- exchange data- orchestrate threads

- Waiting, notifications- spin waiting- events- alternative: continuations

Page 19: Parallel programming patterns - Олександр Павлишак

Three ways to manage state

- Isolation: simple, loosely coupled, highly scalable, right data structures, locality- Immutability: avoids sync- Synchronization: complex, runtime overheads, contention

- in that order

Page 20: Parallel programming patterns - Олександр Павлишак

Паралелізм

Page 21: Parallel programming patterns - Олександр Павлишак

Підходи до розбиття задач

- Data parallelism- Task parallelism- Message based parallelism

Page 22: Parallel programming patterns - Олександр Павлишак

Data parallelism

How?

- Data is divided up among hardware processors- Same operation is performed on elements - Optionally -- final aggregation

Page 23: Parallel programming patterns - Олександр Павлишак

Data parallelism

When?

- Large amounts of data- Processing operation is costly- or both

Page 24: Parallel programming patterns - Олександр Павлишак

Data parallelism

Why?

- To achieve speedup

- For example, with GPU acceleration:- hours instead of days!

Page 25: Parallel programming patterns - Олександр Павлишак

Data parallelism

Embarrassingly parallel problems- parallelizable loops- image processing

Non-embarrassingly parallel problems- parallel QuickSort

Page 26: Parallel programming patterns - Олександр Павлишак

Data parallelism

...

Thread 1

...

Thread 2

Page 27: Parallel programming patterns - Олександр Павлишак

Data parallelism

Structured parallelism

- Well defined begin and end points- Examples:

- CoBegin- ForAll

Page 28: Parallel programming patterns - Олександр Павлишак

CoBegin

var firstDataset = new DataItem[1000];var secondDataset = new DataItem[1000];var thirdDataset = new DataItem[1000];

Parallel.Invoke( () => Process(firstDataset), () => Process(secondDataset), () => Process(thirdDataset) );

Page 29: Parallel programming patterns - Олександр Павлишак

Parallel For

var items = new DataItem[1000 * 1000];// ...Parallel.For(0, items.Length, i => { Process(items[i]); });

Page 30: Parallel programming patterns - Олександр Павлишак

Parallel ForEach

var tickers = GetNasdaqTickersStream();Parallel.ForEach(tickers, ticker => { Process(ticker); });

Page 31: Parallel programming patterns - Олександр Павлишак

Striped Partitioning

Thread 1 Thread 2

...

Page 32: Parallel programming patterns - Олександр Павлишак

Iterate complex data structures

var tree = new TreeNode();// ...Parallel.ForEach( TraversePreOrder(tree), node => { Process(node); });

Page 33: Parallel programming patterns - Олександр Павлишак

Iterate complex data

...

Thread 1

Thread 2

Page 34: Parallel programming patterns - Олександр Павлишак

Declarative parallelismvar items = new DataItem[1000 * 1000];// ...var validItems = from item in items.AsParallel() let processedItem = Process(item) where processedItem.Property > 42 select Convert(processedItem);

foreach (var item in validItems){ // ...}

Page 35: Parallel programming patterns - Олександр Павлишак

Data parallelism

Challenges

- Partitioning- Scheduling- Ordering- Merging- Aggregation- Concurrency hazards: data races, contention

Page 36: Parallel programming patterns - Олександр Павлишак

Task parallelism

How?

- Programs are already functionally partitioned: statements, methods etc.- Run independent pieces in parallel- Control synchronization- State isolation

Page 37: Parallel programming patterns - Олександр Павлишак

Task parallelism

Why?

- To achieve speedup

Page 38: Parallel programming patterns - Олександр Павлишак

Task parallelism

Kinds- Structured

- clear begin and end points- Unstructured

- often demands explicit synchronization

Page 39: Parallel programming patterns - Олександр Павлишак

Fork/join

- Fork: launch tasks asynchronously- Join: wait until they complete- CoBegin, ForAll- Recursive decomposition

Page 40: Parallel programming patterns - Олександр Павлишак

Fork/join

Task 1

Task 2

Task 3

SeqSeq

Page 41: Parallel programming patterns - Олександр Павлишак

Fork/join

Parallel.Invoke( () => LoadDataFromFile(), () => SavePreviousDataToDB(), () => RenewOtherDataFromWebService());

Page 42: Parallel programming patterns - Олександр Павлишак

Fork/join

Task loadData = Task.Factory.StartNew(() => { // ... });Task saveAnotherDataToDB = Task.Factory.StartNew(() => { // ... });// ...Task.WaitAll(loadData, saveAnotherDataToDB);// ...

Page 43: Parallel programming patterns - Олександр Павлишак

Fork/join

void Walk(TreeNode node) { var tasks = new[] { Task.Factory.StartNew(() => Process(node.Value)), Task.Factory.StartNew(() => Walk(node.Left)), Task.Factory.StartNew(() => Walk(node.Right)) }; Task.WaitAll(tasks);}

Page 44: Parallel programming patterns - Олександр Павлишак

Fork/join recursive

Root

SeqSeq Left

Right

Node

Left

Right

Node

Left

Right

Page 45: Parallel programming patterns - Олександр Павлишак

Dataflow parallelism: Futures

Task<DataItem[]> loadDataFuture = Task.Factory.StartNew(() => { //... return LoadDataFromFile(); });

var dataIdentifier = SavePreviousDataToDB();RenewOtherDataFromWebService(dataIdentifier);//...DisplayDataToUser(loadDataFuture.Result);

Page 46: Parallel programming patterns - Олександр Павлишак

Dataflow parallelism: Futures

Seq

Future

Seq Seq

Page 47: Parallel programming patterns - Олександр Павлишак

Dataflow parallelism: Futures

Seq

Future

Seq

Future

Seq

Future

Seq Seq

Page 48: Parallel programming patterns - Олександр Павлишак

Continuations

Seq

Task

Seq Seq

Task

Task

Page 49: Parallel programming patterns - Олександр Павлишак

Continuationsvar loadData = Task.Factory.StartNew(() => { return LoadDataFromFile(); });

var writeToDB = loadData.ContinueWith(dataItems => { WriteToDatabase(dataItems.Result); });

var reportToUser = writeToDB.ContinueWith(t => { // ... });reportProgressToUser.Wait();

Page 50: Parallel programming patterns - Олександр Павлишак

Producer/consumerpipeline

lines parsedlines DB

reading parsing storing

Page 51: Parallel programming patterns - Олександр Павлишак

Producer/consumerpipeline

lines

parsedlines

DB

Page 52: Parallel programming patterns - Олександр Павлишак

Producer/consumer

var lines = new BlockingCollection<string>();

Task.Factory.StartNew(() => { foreach (var line in File.ReadLines(...)) lines.Add(line); lines.CompleteAdding(); });

Page 53: Parallel programming patterns - Олександр Павлишак

Producer/consumer

var dataItems = new BlockingCollection<DataItem>();

Task.Factory.StartNew(() => { foreach (var line in lines.GetConsumingEnumerable() ) dataItems.Add(Parse(line)); dataItems.CompleteAdding(); });

Page 54: Parallel programming patterns - Олександр Павлишак

Producer/consumer

var dbTask = Task.Factory.StartNew(() => { foreach (var item in dataItems.GetConsumingEnumerable() ) WriteToDatabase(item); });

dbTask.Wait();

Page 55: Parallel programming patterns - Олександр Павлишак

Task parallelism

Challenges

- Scheduling- Cancellation- Exception handling- Concurrency hazards: deadlocks, livelocks, priority inversions etc.

Page 56: Parallel programming patterns - Олександр Павлишак

Message based parallelism

- Accessing shared state vs. local state- No distinction, unfortunately- Idea: encapsulate shared state changes into

messages- Async events- Actors, agents

Page 57: Parallel programming patterns - Олександр Павлишак

Засоби

Page 58: Parallel programming patterns - Олександр Павлишак

Concurrent data structures

- Concurrent Queues, Stacks, Sets, Lists- Blocking collections, - Work stealing queues- Lock free data structures- Immutable data structures

Page 59: Parallel programming patterns - Олександр Павлишак

Synchronization primitives

- Critical sections, - Monitors, - Auto- and Manual-Reset Events,- Coundown Events, - Mutexes, - Semaphores, - Timers, - RW locks- Barriers

Page 60: Parallel programming patterns - Олександр Павлишак

Thread local state

- A way to achieve isolation

var parser = new ThreadLocal<Parser>( () => CreateParser());

Parallel.ForEach(items, item => parser.Value.Parse(item));

Page 61: Parallel programming patterns - Олександр Павлишак

Thread pools

ThreadPool.QueueUserWorkItem(_ => { // do some work });

Page 62: Parallel programming patterns - Олександр Павлишак

AsyncTask.Factory.StartNew(() => { //... return LoadDataFromFile(); }) .ContinueWith(dataItems => { WriteToDatabase(dataItems.Result); }) .ContinueWith(t => { // ... });

Page 63: Parallel programming patterns - Олександр Павлишак

Asyncvar dataItems = await LoadDataFromFileAsync();

textBox.Text = dataItems.Count.ToString();

await WriteToDatabaseAsync(dataItems);

// continue work

Page 64: Parallel programming patterns - Олександр Павлишак

Технології

- TPL, PLINQ, C# async, TPL Dataflow- PPL, Intel TBB, OpenMP- CUDA, OpenCL, C++ AMP- Actors, STM- Many others

Page 65: Parallel programming patterns - Олександр Павлишак

Підсумок

- Програмування для багатьох CPU- Concurrency != parallelism- CPU-bound vs. I/O-bound tasks- Private vs. shared state

Page 66: Parallel programming patterns - Олександр Павлишак

Підсумок

- Managing state:- Isolation - Immutability- Synchronization

- Data: mutual exclusion- Control: notifications

Page 67: Parallel programming patterns - Олександр Павлишак

Підсумок

- Паралелізм:- Data parallelism: scalable- Task parallelism: less scalable- Message based parallelism

Page 68: Parallel programming patterns - Олександр Павлишак

Підсумок

- Data parallelism- CoBegin- Parallel ForAll- Parallel ForEach- Parallel ForEach over complex data structures- Declarative data parallelism

- Challenges: partitioning, scheduling, ordering, merging, aggregation, concurrency hazards

Page 69: Parallel programming patterns - Олександр Павлишак

Підсумок

- Task parallelism: structured, unstructured- Fork/Join

- CoBegin- Recursive decomposition

- Futures- Continuations- Producer/consumer (pipelines)

- Challenges: scheduling, cancellation, exceptions, concurrency hazards

Page 70: Parallel programming patterns - Олександр Павлишак

Підсумок

- Засоби/інструменти- Компілятори, бібліотеки- Concurrent data structures- Synchronization primitives- Thread local state- Thread pools- Async invocations- ...

Page 71: Parallel programming patterns - Олександр Павлишак

Q/A