Параллелизм в Visual Studio 2010

Содержание

Слайд 2

Нововведения в Parallel Computing

Parallel Pattern Library

Resource Manager

Task Scheduler

Task Parallel Library

Parallel LINQ

Threads

Native Concurrency

Нововведения в Parallel Computing Parallel Pattern Library Resource Manager Task Scheduler Task
Runtime

Managed Libraries

ThreadPool

Data Structures

Data Structures

Tools

Async
Agents Library

UMS Threads

Microsoft
Research

Visual Studio 2010

Parallel
Debugger Windows

Profiler Concurrency
Analysis

Race Detection

Fuzzing

Axum

Visual F#

Managed Languages

Rx

Native Libraries

Managed Concurrency Runtime

DryadLINQ

HPC Server

Доклад

Operating System

Доклад

Слайд 3

Демо - Parallel Sudoku

Демо - Parallel Sudoku

Слайд 4

Work

Накладые расходы при паралелизме

Необходимо деление операций
Выполнения потоков вызывает лишние накладные расходы
Чем больше

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

Overhead

Overhead

Overhead

Overhead

Overhead

Слайд 5

Global Queue

Рабочий поток N

Рабочий поток 1

ThreadPool в .NET 3.5


Item 7

Item 3

Item 4

Item

Global Queue Рабочий поток N Рабочий поток 1 ThreadPool в .NET 3.5
5

Item 6

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

Item 3.1

Слайд 6

ThreadPool в .NET 4

Lock-Free
Global Queue

Local
Work-Stealing Queue

Local Work-Stealing Queue

Work Thread 1

Work Thread N



Item

ThreadPool в .NET 4 Lock-Free Global Queue Local Work-Stealing Queue Local Work-Stealing
1

Item 2

Item 3

Item 2.1

Минимизации синхронизации и блокировок
Hill-Climbing – определение оптимального числа потоков в пуле в зависимости от нагрузки на CPU

Слайд 7

Task – новый тип для многопоточности

ThreadPool.QueueUserWorkItem
Хорошо подходит для того чтобы стартовать и

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

Слайд 8

Демо – Task, Concurrent collection

Демо – Task, Concurrent collection

Слайд 9

Новые примитивы синхронизации

Thread-safe, scalable collections
IProducerConsumerCollection
ConcurrentQueue
ConcurrentStack
ConcurrentBag
ConcurrentDictionary
Phases and work exchange
Barrier
BlockingCollection
CountdownEvent
Partitioning
{Orderable}Partitioner
Partitioner.Create
Exception handling
AggregateException
Initialization
Lazy
LazyInitializer.EnsureInitialized
ThreadLocal
Locks
ManualResetEventSlim
SemaphoreSlim
SpinLock
SpinWait
Cancellation
CancellationToken{Source}

Использованы при

Новые примитивы синхронизации Thread-safe, scalable collections IProducerConsumerCollection ConcurrentQueue ConcurrentStack ConcurrentBag ConcurrentDictionary Phases
разработке PLINQ и TPL
Для того чтобы решать большинство задач в многопоточности

Слайд 10

Распараллеливаем циклы

Control flow is a primary source of work
Распаралеливаем если итерации независимы
«Синхронное»

Распараллеливаем циклы Control flow is a primary source of work Распаралеливаем если
поведение, поток выполнения не пройдет пока цикл не выполнится
Возможности
Cancelation, breaking, task-local state, scheduling, degree of parallelism
Поддержка профайлера Visual Studio 2010 (как у PLINQ)

for (int i = 0; i < n; i++)
{
work(i);
}

foreach(var item in data)
{
work(item);
}

StatementA();
StatementB;
StatementC();

Parallel.For(0, n, i=>
{
work(i);
});

Parallel.ForEach(data, item=>
{
work(item);
});

Parallel.Invoke(
() => StatementA(),
() => StatementB,
() => StatementC());

Слайд 11

Легко с LINQ на PLINQ

LINQ to Objects:

int[] output = arr
.Select(x =>

Легко с LINQ на PLINQ LINQ to Objects: int[] output = arr
Foo(x))
.ToArray();

int[] output = arr.AsParallel()
.Select(x => Foo(x))
.ToArray();

PLINQ:

Слайд 12

Легко с LINQ на PLINQ

PLINQ может выполнить все LINQ запросы
Простые запросы –

Легко с LINQ на PLINQ PLINQ может выполнить все LINQ запросы Простые
проще выполнить
Разбивайте сложные запросы на более простые, так чтобы только та часть которую нужно распралелить была PLINQ:

src.Select(x => Foo(x))
.TakeWhile(x => Filter(x))
.AsParallel()
.Select(x => Bar(x))
.ToArray();

Слайд 13

Демо – PLINQ

Демо – PLINQ

Слайд 14

Отлаживаем параллелизм

Concurrency Profiler
Parallel Debugger
Parallel tasks
Parallel stack

Отлаживаем параллелизм Concurrency Profiler Parallel Debugger Parallel tasks Parallel stack

Слайд 15

Демо – Profiler views, debugger tools

Демо – Profiler views, debugger tools

Слайд 16

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/

Cсылки и источники DevCenter http://msdn.com/concurrency Исходные коды примеров http://code.msdn.microsoft.com/ParExtExamples Блоги http://blogs.msdn.com/pfxteam Parallel