"...Изучение и анализ примеров.
В и приведены описания и приложены исходные коды параллельных программ..." Непонятно что такое - "В и приведены описания" и где именно приведены и приложены исходные коды. |
Введение в библиотеку Microsoft Parallel Extensions to the .Net Framework
Parallel Extensions to the .NET Framework (другие названия - Parallel FX Library, PFX) - это библиотека, разработанная фирмой Microsoft, для использования в программах на базе управляемого (managed) кода. Она позволяет распараллеливать задачи, в которых могут использоваться специальные - координирующие (coordinating) - структуры данных. Тем самым, библиотека PFX упрощает написание параллельных программ, обеспечивая увеличение производительности при увеличении числа ядер или числа процессоров, исключая многие сложности современных моделей параллельного программирования. Первая версия библиотеки была представлена 29 ноября 2007 года, впоследствии выходили обновления в декабре 2007 и июне 2008 годов. На момент написания данных лекций, библиотека PFX вошла в состав .NET 4 CTP и Visual Studio 2008/2010.
Parallel Extensions обеспечивает несколько новых способов организации параллелизма:
- Параллелизм при декларативной обработке данных. Реализуется при помощи параллельного интегрированного языка запросов (PLINQ) - параллельной реализации LINQ. Отличие от LINQ заключается в том, что запросы выполняются параллельно, обеспечивая масштабируемость и загрузку доступных ядер и процессоров.
- Параллелизм при императивной обработке данных. Реализуется при помощи библиотечных реализаций параллельных вариантов основных итеративных операций над данными, таких как циклы for и foreach. Их выполнение автоматически распределяется на все доступные ядра/процессоры вычислительной системы.
- Параллелизм на уровне задач. Библиотека Parallel Extensions обеспечивает высокоуровневую работу с пулом рабочих потоков, позволяя явно структурировать параллельно исполняющийся код с помощью легковесных задач. Планировщик библиотеки Parallel Extensions выполняет диспетчеризацию и управление исполнением этих задач, а также единообразный механизм обработки исключительных ситуаций.
Требования
Parallel Extensions - это управляемая (managed) библиотека и для своей работы она требует установленный .NET Framework 3.5.
1.1 Лучший способ использования Parallel Extensions
Библиотека Parallel Extensions была разработана в целях обеспечения наибольшей производительности при использовании многоядерных процессоров или многопроцессорных машин. Вместо того чтобы принимать решение о верхней границе количества распараллеливаемых задач во время разработки, библиотека позволяет автоматически масштабировать выполняемые задачи, динамически вовлекая в работу все большее количество ядер, по мере того как они становятся доступными. Прирост производительности достигается при использовании Parallel Extensions на многоядерных процессорах или многопроцессорных машинах. Вместе с этим Parallel Extensions разработана так, чтобы минимизировать издержки и при выполнении на однопроцессорных машинах.
1.2 Как начать программировать с использованием Parallel Extensions
Для того чтобы начать разрабатывать программы с применением Parallel Extensions необходимо выполнить следующие шаги:
- Установить Parallel Extensions to the .Net Framework
- Запустить Visual Studio
- Создать новый проект
- Добавить в проект ссылку на библиотеку System.Threading.dll
Microsoft Parallel Extensions for .Net состоит из двух компонент:
А также содержит набор координирующих структур данных, используемых для синхронизации и координации выполнения параллельных задач.
Основная, базовая концепция Parallel Extensions - это задача (Task) - небольшой участок кода, представленный лямбда-функцией, который может выполняться независимо от остальных задач. И PLINQ, и TPL API предоставляют методы для создания задач - PLINQ разбивает запрос на небольшие задачи, а методы TPL API - Parallel.For, Parallel.ForEach и Parallel.Invoke - разбивают цикл или последовательность блоков кода на задачи.
Parallel Extensions содержит менеджер задач, который планирует выполнение задач. Другое название менеджера задач - планировщик. Планировщик управляет множеством рабочих потоков, на которых происходит выполнение задач. По умолчанию, создается число потоков равное числу процессоров (ядер). Каждый поток связан со своей очередью задач. По завершении выполнения очередной задачи, поток извлекает следующую задачу из своей локальной очереди. Если же она пуста, то он может взять для исполнения задачу, находящуюся в локальной очереди другого рабочего потока. Задачи выполняются независимо друг от друга. Поэтому при использовании ими разделяемых ресурсов требуется выполнять синхронизацию при помощи блокировок или других конструкций.
1.3 TPL (Task Parallel Library)
Перед использованием TPL в своем приложении, убедитесь, что ваш проект содержит ссылку на System.Threading.dll. Возможности TPL сосредоточены в двух пространствах имен этой библиотеки: System.Threading и System.Threading.Tasks. В них определены три простых типа:
System.Threading.Parallel
Класс System.Threading.Parallel позволяет распараллеливать циклы и последовательность блоков кода в приложениях .Net. Эта функциональность реализована как набор статических методов, а именно методов For, ForEach и Invoke.
Parallel.For и Parallel.ForEach
Конструкции Parallel.For и Parallel.ForEach являются параллельными аналогами циклов for и foreach. Их использование корректно в случае независимого исполнения итераций цикла, то есть, если ни в одной итерации не используется результаты работы с предыдущих итераций. Тогда эти итерации могут быть выполнены параллельно.
Parallel.Invoke
Статический метод Invoke в параллельной реализации позволяет распараллелить исполнение блоков операторов. Часто в приложениях существуют такие последовательности операторов, для которых не имеет значения порядок выполнения операторов внутри них. В таких случаях, вместо последовательного выполнения операторов одного за другим, возможно их параллельное выполнение, позволяющее повысить производительность. Подобные ситуации часто возникают в рекурсивных алгоритмах и алгоритмах типа "разделяй и властвуй".
System.Threading.Tasks.Task
С помощью методов этого класса возможно организовать асинхронное выполнение нескольких методов, включая ожидание завершения и прерывание их работы. Более подробно работа с данным классом описана в Лекции 5.
System.Threading.Tasks.Future<T>
С помощью этого класса также возможно асинхронно выполнять несколько методов. При этом эти методы могут возвращать результат работы. Более подробно работа с данным классом описана в Лекции 6.
1.4 PLINQ (Parallel Language-Integrated Query)
PLINQ (Parallel Language-Integrated Query) - параллельный интегрированный язык запросов, т.е., это параллельная реализация LINQ.
Традиционно, запросы в языках программирования представлялись просто как значения строкового типа и, как следствие, не осуществлялось проверки типов для них на этапе компиляции. LINQ сделал запросы языковой конструкцией самих языков С# и Visual Basic. Стало возможным разрабатывать запросы, не задумываясь над типом коллекции, используя ключевые слова языка и знакомые операторы.
Отличие PLINQ от LINQ состоит в том, что запросы выполняются параллельно, используя все доступные ядра и процессоры.
Более подробно работа с PLINQ описана в Лекции 7.
1.5 Координирующие структуры данных
Пространство имен System.Threading стандартной библиотеки классов .NET Framework 3.5 содержит множество низкоуровневых примитивов синхронизации, таких как мьютексы, мониторы и события. Библиотека PFX предлагает к использованию более высокоуровневые примитивы, а именно:
- System.Threading.CountdownEvent
- System.Threading.LazyInit<T>
- System.Threading.ManualResetEventSlim
- System.Threading.SemaphoreSlim
- System.Threading.SpinLock
- System.Threading.SpinWait
- System.Threading.WriteOnce<T>
- System.Threading.Collections.BlockingCollection<T>
- System.Threading.Collections.ConcurrentQueue<T>
- System.Threading.Collections.ConcurrentStack<T>
Более подробно работа с координирующими структурами данных описана в "Класс System.Threading.Tasks.Future и координирующие структуры данных" .