stringtranslate.com

Параллельные расширения

Parallel Extensions — это название библиотеки управляемого параллелизма , разработанной в результате сотрудничества Microsoft Research и команды CLR в Microsoft . Библиотека была выпущена в версии 4.0 .NET Framework . [1] Он состоит из двух частей: параллельного LINQ (PLINQ) и библиотеки параллельных задач (TPL). [2] [3] Он также состоит из набора структур данных координации (CDS) – наборов структур данных, используемых для синхронизации и координации выполнения параллельных задач. [4]

Параллельный LINQ

PLINQ или Parallel LINQ , распараллелив выполнение запросов к объектам (LINQ to Objects) и данным XML (LINQ to XML). PLINQ предназначен для выявления параллелизма данных с помощью запросов. [2] Любые вычисления над объектами, реализованные в виде запросов, могут быть распараллелены с помощью PLINQ. Однако объекты должны реализовывать IParallelEnumerableинтерфейс, который определяется самим PLINQ. Внутри он использует TPL для выполнения. [4] [5]

Параллельная библиотека задач

Библиотека параллельных задач ( TPL ) — это компонент параллелизма задач в составе параллельных расширений для .NET. [6] Он предоставляет параллельные конструкции, такие как «параллель» Forи ForEach«циклы», используя обычные вызовы методов и делегаты , поэтому конструкции можно использовать из любых языков CLI . Работа по созданию и завершению потоков , а также масштабирование количества потоков в соответствии с количеством доступных процессоров выполняется самой библиотекой [3] с использованием планировщика перехвата работы . [7]

TPL также включает в себя другие конструкции, такие как Task и Future . Задача — это действие , которое может выполняться независимо от остальной части программы. В этом смысле он семантически эквивалентен потоку, за исключением того, что он является более легким объектом и не требует затрат на создание потока ОС. Задачи ставятся в очередь объектом диспетчера задач и планируются для выполнения в нескольких потоках ОС в пуле потоков, когда приходит их очередь.

Будущее — это задача, которая возвращает результат. Результат вычисляется в фоновом потоке, инкапсулированном объектом Future , и сохраняется в буфере до тех пор, пока не будет получен. [3] Если предпринята попытка получить результат до того, как он был вычислен, запрашивающий поток блокируется до тех пор, пока результат не будет доступен. [6]

Другая конструкция TPL — класс Parallel . TPL обеспечивает базовую форму структурированного параллелизма посредством трех статических методов класса Parallel:

Параллельный вызов
Параллельно выполняет массив делегатов Action, а затем ожидает их завершения.
Параллельно.Для
Параллельный эквивалент цикла for C#.
Параллельный.ForEach
Параллельный эквивалент цикла foreach в C#.

Архитектура

Основная концепция параллельных расширений для .NET — это Taskнебольшая единица кода, обычно представленная как лямбда-функция , которая может выполняться независимо. И PLINQ, и TPL API предоставляют методы для создания задач: PLINQ делит запрос на более мелкие задачи, а Parallel.Forметоды Parallel.ForEachи Parallel.Invokeделят цикл на задачи.

PFX включает Task Managerобъект, который планирует выполнение задач. Диспетчер задач содержит глобальную очередь задач, которые затем выполняются. Он также инкапсулирует несколько потоков , в которых выполняются задачи. По умолчанию создается столько потоков, сколько процессоров (или ядер процессоров) имеется в системе, хотя это число можно изменить вручную. Каждый поток связан с конкретной очередью задач. В режиме ожидания каждый поток берет пакет задач и помещает их в свою локальную очередь, где они затем выполняются одна за другой. Если глобальная очередь пуста, поток будет искать задачи в очередях своих одноранговых узлов и брать задачи, которые находились в очереди дольше всего ( кража задач ). Во время выполнения Задачи будут выполняться независимо, при этом изменение состояния одной Задачи будет независимым от других. В результате, если они используют общий ресурс, их все равно необходимо синхронизировать вручную с помощью блокировок или других конструкций.

Смотрите также

Рекомендации

  1. ^ «Что нового в .NET Framework 4» . Проверено 21 сентября 2011 г.
  2. ^ ab «Программирование в эпоху параллелизма: параллельное программирование с PFX» . Проверено 16 октября 2007 г.
  3. ^ abc «Журнал MSDN: Библиотека параллельных задач» . Архивировано из оригинала 14 октября 2007 года . Проверено 16 октября 2007 г.
  4. ^ ab «CTP, июнь 2008 г. — параллельные расширения .NET FX» . Проверено 6 августа 2008 г.
  5. ^ «Более мощные агрегаты в PLINQ» . Проверено 6 августа 2008 г.
  6. ^ аб Даффи, Джо (2009). Параллельное программирование в Windows . стр. 887–929. ISBN 978-0321434821.
  7. ^ Лейен, Даан; Шульте, Вольфрам; Буркхардт, Себастьян (2009). «Проектирование библиотеки параллельных задач». Уведомления ACM SIGPLAN . 44 (10): 227. CiteSeerX 10.1.1.146.4197 . дои : 10.1145/1639949.1640106. 

Внешние ссылки