Вы находитесь на странице: 1из 41

Обзор TASK PARALLEL

LIBRARY в .NET 4.0

Калита Роман
The Frayman Group
Нововведения в
Parallel Computing
Tool Managed Languages
s
Visual Studio 2010 Visual F # Axum

Parallel Managed Libraries Native


Debugger Windows Libraries
DryadLINQ Rx Async
Profiler Concurrency Agents
Parallel Pattern Library

Data Structures

Data Structures
Analysis Parallel LINQ Library

Microsoft
Task Parallel Library
Research Native Concurrency
Runtime
Race Detection Task Scheduler
Managed Concurrency
Runtime
Fuzzing ThreadPool Resource Manager

Operatin
HPC Server Threads UMS Threads g System

Легенда: Research / Incubation Visual Studio 2010 / .NET 4 Windows 7 / Server 2008 R2
Parallel extensions в .NET
4.0
Parallel LINQ ( PLINQ )

Task Parallel Library

Coordination Data .NET ThreadPool


Structures V4.0
Parallel extensions в .NET
4.0

mscorlib.dll System.Core.dll System.dll

System.Threading System.Linq System.Threading


System.Collections.
System.Threading.Tasks System.Linq.Parallel Concurrent
System.Threading.Internal

System.Collections.Concurrent
Пул потоков в .NET 3.5

Global
Queue
Worker Thread 1 … Worker Thread 1
Item
Item 45

Item 1
ItemThread
Program
2
Item 3
Item 6

•При создании множества потоков все


они обращаются в глобальную
очередь за потоками – результат
накладные расходы
•И возникает все больше и больше
Новый пул потоков

Local Local
Work- … Work-
Lock-Free Stealing Stealing
Global Queue Queue
Queue

Worker Thread 1 … Worker Thread p

Task 6
TaskTask
4 3
Task 2 Thread
Program
Task 5
•Минимизации синхронизации и бло
•Hill-Climbing – определение оптимально
потоков в пуле
в зависимости от нагрузки на CPU
•Минимизация простаивающих поток
Растем в ширину
• Рост
производительност
ь в ширину –
увеличение …
количества ядер


• Мы не знаем на каких
системах будет
выполнятся
программа – не
можем планировать
Task – абстракция над
потоками

Key Classes
Task – абстракция
над потоками
ThreadPool.QueueUserWorkItem
Хорошо подходит для того чтобы
стартовать и «забыть»
Но нехватает:
Waiting
Canceling
Continuing
Exceptions
Debugging
Dataflow between operations

Демо – Tasks
Операции с Tasks’s
Creating Task
• Task.Factory.StartNew

• Task constructor

• new Task vs Task.Factory.StartNew


– Разницы нет, для new Task -
синхронизция
Setting task state, getting
results
• Если необходимо
передать параметер
– используем
перегруженый
конструктор



• Для получения
результатов
используем Task<T>
Cancelling task
• Для отмены
используется
CancellationTokenSource и
CancellationToken






• Можно использовать
token.WaitHandle или
Waiting for task
Exceptions handling
• Вызваем «триггеры»
– Task.Wait(), Task.WaitAll(), …,
Task.Result
• Отлавливаем
AggregateException
• Просматриваем
AggregateException. InnerExceptions

Exceptions handling
• AggregateException.Handle()
Exceptions handling
• Используем свойства
Task – IsCompleted, IsFaulted, Is
Cancelled
Exceptions handling
• Используя TaskScheduler
Task continuation

• Continuation “one to many”


• “many to one”, “any to one”
– ContinueWhenAll, ContinueWenAny


Selective task continuation
Nested detached (child)
tasks
• Detached child tasks ==
обычные вложенные
таски

Nested attached (child)
tasks
• Attached tasks
– Родитель ждет пока
завершится задача
– Родитель возбуждает
исключения
вложенной задачи
– Статус родительской
задачи зависит от
статуса вложенной
Task scheduler

QueueTask(Task t)

Task TaskScheduler

SynchronizationContext
ThreadPoolTaskScheduler Custom
TaskScheduler
Co-ordination data structures

Использованы при
разработке PLINQ и TPL
Для того чтобы решать
большинство задач в
многопоточности
Thread -safe, scalable collections
IProducerConsumerCollection<T>
ConcurrentQueue<T>
ConcurrentStack<T>
ConcurrentBag<T>
ConcurrentDictionary<TKey,TValue>

Phases and work exchange


Barrier
BlockingCollection<T>
CountdownEvent

Partitioning
{Orderable}Partitioner<T>
Partitioner.Create

Exception handling
AggregateException
Initialization
Lazy<T>
LazyInitializer.EnsureInitialized<T>
ThreadLocal<T>
Примитивы синхронизации.
SpinWait. SpinLock
• Возможностью
ожидать, не
переключая
контекст (spin)
• Текущий поток не
передает
управление
планировщику.
Вместо этого,
внутри метода SpinWait()
запускается некий
холостой цикл.
Примитивы синхронизации.
ManualResetEventSlim и
SemaphoreSlim,
CountDownEvent
Примитивы синхронизации.
Barrier
• Достигшие
определенного
состояния потоки,
блокируются до тех
пор, пока другие
потоки, в свою
очередь, не
достигнут такого же
состояния.
• Подходит для
синхронизации при
multiphase parallel algorithm
• multiphase parallel algorithm
Примитивы синхронизации.
Barrier
ThreadLocal<T>
• Представляет Thread Local
Storage для изоляции
данных между
потоками

• Каждый поток
использует свои
данные для
чтения/записи
• Работает так, как
будто, для
отдельного потока
Ленивая инициализация
Could be IList < T > or Arr

IEnumerable < T > Range


Chunk
Striped?
Hash
Partition

Task Task Task


Query Query Query
“Where” “Where” “Where”
“OrderBy” “OrderBy” “OrderBy”
“Sum” Re-partition
“Sum” “Sum”

Merge

Consumer( foreach … )
Распараллеливаем циклы

Control flow is a primary source of work

for (int i = 0; i < n; i++) foreach(var item in data)


StatementA();
{ { StatementB;
work(i); work(item); StatementC();
} }
Распаралеливаем если итерации
независимы

Parallel.For(0, n, i=> Parallel.ForEach(data, item=> Parallel.Invoke(


{ { () => StatementA(),
work(i); work(item); () => StatementB,
}); }); () => StatementC());

«Синхронное» поведение, поток


выполнения не пройдет пока цикл не
выполнится
Возможности
Cancelation, breaking, task-local state, scheduling, degree of
parallelism
Поддержка профайлера Visual Studio 2010 (как у
PLINQ)
Легко с LINQ на PLINQ

LINQ to Objects:
int[] output = arr
.Select(x => Foo(x))
.ToArray();

>PLINQ:
> int[] output = arr. AsParallel ()
.Select(x => Foo(x))
.ToArray();
Легко с LINQ на PLINQ
PLINQ может выполнить все LINQ запросы
Простые запросы – проще выполнить
Разбивайте сложные запросы на более
простые, так чтобы только та часть
которую нужно распралелить была PLINQ:

src.Select(x => Foo(x))


.TakeWhile(x => Filter(x))
.AsParallel()
.Select(x => Bar(x))
.ToArray();
Отлаживаем
параллелизм
Concurrency Profiler
Parallel Debugger
Parallel tasks
Parallel stack
Демо –
Debugger tools
Накладые
расходы
Выполнения потоковпри
Необходимо деление операций
вызывает лишние

паралелизме
накладные расходы
Чем больше потоков тем больше лишних
расходов
Для быстрого запуска/выполнения
потоков необходимо уменьшить
накладные расходы связанные с этим

Overhead Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Work
Overhead
Overhead
Overhead
Overhead Overhead
Overhead
Overhead
Overhead
Overhead
Overhead Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Overhead
Книги по TPL
Cсылки и источники
DevCenter
http://msdn.com/concurrency
Исходные коды примеров
http://code.msdn.microsoft.com/ParExtExamples
Блоги
http://blogs.msdn.com/pfxteam
Parallel stack
Доклады, видео
http://channel9.msdn.com/learn
http://microsoftpdc.com/
http://rsdn.ru/article/dotnet/ParallelFX3.xml
http://msdn.microsoft.com/ru-ru/magazine/cc163427.aspx
Спасибо за
внимание:)

Оценить