PARALLELISM В.NET 4.0 И VISUAL STUDIO 2010 Калита Роман TaskManagementSoft
Нововведения в Parallel Computing Parallel Pattern Library Resource Manager Task Scheduler Task Parallel Library Parallel LINQ Threads Native Concurrency Runtime Managed Libraries ThreadPool Data Structures Tools Async Agents Library Async Agents Library UMS Threads Microsoft Research Microsoft Research Visual Studio 2010 Parallel Debugger Windows Parallel Debugger Windows Profiler Concurrency Analysis Profiler Concurrency Analysis Race Detection Fuzzing Axum Visual F# Managed Languages Rx Native Libraries Managed Concurrency Runtime DryadLINQ Легенда: Research / Incubation Visual Studio 2010 /.NET 4 Windows 7 / Server 2008 R2 HPC Server Operating System
Демо - Parallel Sudoku
Накладые расходы при паралелизме
Global Queue Рабочий поток N Рабочий поток 1 ThreadPool в.NET 3.5 Program Thread Item 7 Item 3 Item 4 Item 5 Item 6 При создании множества потоков все они обращаются в глобальную очередь за потоками – результат накладные расходы И возникает все больше и больше блокировок Item 3.1
Program Thread ThreadPool в.NET 4 Lock-Free Global Queue Lock-Free Global Queue Local Work- Stealing Queue Local Work- Stealing Queue Local Work- Stealing Queue Work Thread 1 Work Thread N Item 1 Item 2 Item 3 Item 2.1 Минимизации синхронизации и блокировок Hill-Climbing – определение оптимального числа потоков в пуле в зависимости от нагрузки на CPU
Task – новый тип для многопоточности
Демо – Task, Concurrent collection
Новые примитивы синхронизации Использованы при разработке PLINQ и TPL Для того чтобы решать большинство задач в многопоточности
for (int i = 0; i < n; i++) { work(i); } for (int i = 0; i < n; i++) { work(i); } foreach(var item in data) { work(item); } foreach(var item in data) { work(item); } StatementA(); StatementB; StatementC(); StatementA(); StatementB; StatementC(); Parallel.For(0, n, i=> { work(i); }); Parallel.For(0, n, i=> { work(i); }); Parallel.ForEach(data, item=> { work(item); }); Parallel.ForEach(data, item=> { work(item); }); Parallel.Invoke( () => StatementA(), () => StatementB, () => StatementC()); Parallel.Invoke( () => StatementA(), () => StatementB, () => StatementC());
Легко с LINQ на PLINQ > LINQ to Objects: int[] output = arr.Select(x => Foo(x)).ToArray(); int[] output = arr.Select(x => Foo(x)).ToArray(); int[] output = arr.AsParallel().Select(x => Foo(x)).ToArray(); int[] output = arr.AsParallel().Select(x => Foo(x)).ToArray(); > PLINQ:
Легко с LINQ на PLINQ src.Select(x => Foo(x)).TakeWhile(x => Filter(x)).AsParallel().Select(x => Bar(x)).ToArray(); src.Select(x => Foo(x)).TakeWhile(x => Filter(x)).AsParallel().Select(x => Bar(x)).ToArray();
Демо – PLINQ
Отлаживаем параллелизм
Демо – Profiler views, debugger tools
Cсылки и источники
Спасибо за внимание:)