Общие сведения о среде выполнения с параллелизмом

В этом документе содержатся общие сведения о среде выполнения с параллелизмом. Здесь рассматриваются преимущества среды выполнения с параллелизмом, указывается, когда следует ее использовать, и описывается, как ее компоненты взаимодействуют друг с другом, с операционной системой и приложениями.

Разделы

Этот документ содержит следующие разделы.

Журнал реализации среды выполнения параллелизма

В Visual Studio 2010–2013 среда выполнения параллелизма была включена в msvcr100.dll через msvcr120.dll. Когда рефакторинг UCRT произошел в Visual Studio 2015, библиотека DLL была рефакторингирована на три части:

  • ucrtbase.dll — API C, отправленный в Windows 10 и обслуживаемый вниз по Обновл. Windows-

  • vcruntime140.dll — функции поддержки компилятора и среды выполнения EH, отправленные через Visual Studio

  • concrt140.dll — среда выполнения параллелизма, отправленная через Visual Studio. Требуется для параллельных контейнеров и алгоритмов, таких как concurrency::parallel_for. Кроме того, для STL требуется эта библиотека DLL в Windows XP для примитивов синхронизации, так как Windows XP не имеет переменных условий.

В Visual Studio 2015 и более поздних версиях планировщик задач среды выполнения с параллелизмом более не является планировщиком класса задач и связанных типов в ppltasks.h. Эти типы теперь используют Windows ThreadPool для повышения производительности и взаимодействия с примитивами синхронизации Windows.

Почему среда выполнения для параллелизма важна

Среда выполнения с параллелизмом обеспечивает единообразие и предсказуемость приложений и компонентов приложений, выполняемых одновременно. Двумя примерами преимуществ среды выполнения параллелизма являются совместная планирование задач и совместная блокировка.

Среда выполнения с параллелизмом использует совместный планировщик задач, реализующий алгоритм переноса нагрузки для эффективного распределения вычислительных ресурсов. Например, рассмотрим приложение, имеющее два потока, управляемых одной средой выполнения. Если один поток завершает свою запланированную задачу, он может разгрузить другой поток. Этот механизм позволяет балансировать общую рабочую нагрузку приложения.

Среда выполнения с параллелизмом также предоставляет примитивы синхронизации, использующие совместное блокирование для синхронизации доступа к ресурсам. Например, рассмотрим задачу, которая должна получить монопольный доступ к общему ресурсу. Выполняя совместное блокирование, среда выполнения может использовать оставшийся квант времени для выполнения другой задачи, пока первая задача ожидает ресурс. Этот механизм обеспечивает максимально эффективное использование вычислительных ресурсов.

[В начало]

Архитектура

Среда выполнения с параллелизмом состоит из четырех компонентов: библиотеки параллельных шаблонов (PPL), библиотеки асинхронных агентов, планировщика задач и диспетчера ресурсов. Эти компоненты распределены между операционной системой и приложениями. На следующем рисунке показано взаимодействие компонентов среды выполнения с параллелизмом в операционной системе и приложениях.

Архитектура среды выполнения параллелизма

The Concurrency Runtime Architecture.

Важно!

Компоненты планировщика задач и Resource Manager недоступны из приложения универсальная платформа Windows (UWP) или при использовании класса задач или других типов в ppltasks.h.

Среда выполнения параллелизма очень компонуема, т. е. можно объединить существующие функциональные возможности, чтобы сделать больше. Среда выполнения с параллелизмом объединяет множество возможностей, таких как параллельные алгоритмы, от компонентов более низкого уровня.

Среда выполнения с параллелизмом также предоставляет примитивы синхронизации, использующие совместное блокирование для синхронизации доступа к ресурсам. Дополнительные сведения об этих примитивах синхронизации см. в разделе "Структуры данных синхронизации".

В следующих разделах представлен краткий обзор возможностей каждого компонента и рекомендации по его использованию.

Библиотека параллельных шаблонов

Библиотека параллельных шаблонов (PPL) предоставляет алгоритмы и контейнеры общего назначения для выполнения детального параллелизма. PPL обеспечивает параллелизм императивных данных, предоставляя параллельные алгоритмы, которые распределяют вычисления по коллекциям или наборам данных между вычислительными ресурсами. Она также обеспечивает параллелизм задач, предоставляя объекты задач, которые распределяют несколько независимых операций между вычислительными ресурсами.

Используйте библиотеку параллельных шаблонов при наличии локальных вычислений, которые могут использовать преимущества параллельного выполнения. Например, можно использовать алгоритм параллелизма::p arallel_for для преобразования существующего for цикла для параллельного действия.

Дополнительные сведения о библиотеке параллельных шаблонов см. в разделе "Библиотека параллельных шаблонов" (PPL).

Библиотека асинхронных агентов

Библиотека асинхронных агентов (или только библиотека агентов) предоставляет модель программирования на основе субъектов и интерфейсы передачи сообщений для грубого потока данных и задач конвейера. Асинхронные агенты позволяют эффективно использовать задержку, выполняя работу, пока другие компоненты ожидают данные.

Используйте библиотеку агентов, если существует несколько сущностей, асинхронно взаимодействующих друг с другом. Например, можно создать агент, который читает данные из файла или сетевого подключения, а затем использует интерфейсы передачи сообщений для отправки этих данных другому агенту.

Дополнительные сведения о библиотеке агентов см. в разделе "Асинхронная библиотека агентов".

Планировщик заданий

Планировщик задач планирует и координирует задачи во время выполнения. Планировщик задач является совместным и использует алгоритм переноса нагрузки для максимально эффективного использования вычислительных ресурсов.

Среда выполнения с параллелизмом предоставляет планировщик по умолчанию, поэтому нет необходимости управлять деталями инфраструктуры. Однако для удовлетворения качественных требований приложения можно также предоставить собственную политику планирования или связать конкретные планировщики с конкретными задачами.

Дополнительные сведения о планировщике задач см. в разделе "Планировщик задач".

Resource Manager

Роли диспетчера ресурсов заключается в управлении вычислительными ресурсами, такими как процессоры и память. Диспетчер ресурсов реагирует на изменение рабочих нагрузок во время выполнения, назначая ресурсы тем нагрузкам, где они могут быть наиболее эффективными.

Диспетчер ресурсов выступает в качестве абстракции вычислительных ресурсов и в основном взаимодействует с планировщиком задач. Хотя диспетчер ресурсов можно использовать для точной настройки производительности библиотек и приложений, обычно используются функциональные возможности, предоставляемые библиотекой параллельных шаблонов, библиотекой агентов и планировщиком задач. Эти библиотеки используют диспетчер ресурсов для динамической балансировки ресурсов при изменении рабочей нагрузки.

[В начало]

Лямбда-выражения C++

Многие типы и алгоритмы, определяемые средой выполнения с параллелизмом, реализованы как шаблоны C++. Некоторые из этих типов и алгоритмов принимают в качестве параметра подпрограмму, которая выполняет работу. Этот параметр может быть лямбда-функцией, объектом функции или указателем функции. Эти сущности также называются рабочими функциями или рабочими подпрограммами.

Лямбда-выражения — важный новый компонент языка Visual C++, так как они позволяют в сжатой форме определять рабочие возможности для параллельной обработки. Объекты функций и указатели функций позволяют использовать среду выполнения с параллелизмом с существующим кодом. Тем не менее рекомендуется использовать лямбда-выражения при написании нового кода из-за преимуществ безопасности и производительности, которые они предоставляют.

В следующем примере сравнивается синтаксис лямбда-функций, объектов функций и указателей функций в нескольких вызовах параллелизма::p arallel_for_each алгоритма. Каждый вызов parallel_for_each использует другой метод для вычисления квадрата каждого элемента в объекте std::array .

// comparing-work-functions.cpp
// compile with: /EHsc
#include <ppl.h>
#include <array>
#include <iostream>

using namespace concurrency;
using namespace std;

// Function object (functor) class that computes the square of its input.
template<class Ty>
class SquareFunctor
{
public:
   void operator()(Ty& n) const
   {
      n *= n;
   }
};

// Function that computes the square of its input.
template<class Ty>
void square_function(Ty& n)
{
   n *= n;
}

int wmain()
{
   // Create an array object that contains 5 values.
   array<int, 5> values = { 1, 2, 3, 4, 5 };

   // Use a lambda function, a function object, and a function pointer to 
   // compute the square of each element of the array in parallel.

   // Use a lambda function to square each element.
   parallel_for_each(begin(values), end(values), [](int& n){n *= n;});

   // Use a function object (functor) to square each element.
   parallel_for_each(begin(values), end(values), SquareFunctor<int>());

   // Use a function pointer to square each element.
   parallel_for_each(begin(values), end(values), &square_function<int>);

   // Print each element of the array to the console.
   for_each(begin(values), end(values), [](int& n) { 
      wcout << n << endl;
   });
}

Выходные данные

1
256
6561
65536
390625

Дополнительные сведения о лямбда-функциях в C++см . в лямбда-выражениях.

[В начало]

Требования

В следующей таблице показаны файлы заголовков, связанные с каждым компонентом среды выполнения с параллелизмом.

Компонент Файлы заголовков
Библиотека параллельных шаблонов ppl.h

concurrent_queue.h

concurrent_vector.h
Библиотека асинхронных агентов agents.h
Планировщик заданий concrt.h
Resource Manager concrtrm.h

Среда выполнения параллелизма объявлена в пространстве имен параллелизма . (Вы также можете использовать параллелизм, который является псевдонимом для этого пространства имен.) Пространство concurrency::details имен поддерживает платформу среды выполнения параллелизма и не предназначено для использования непосредственно из кода.

Среда выполнения с параллелизмом предоставляется как часть библиотеки времени выполнения C (CRT). Дополнительные сведения о создании приложения, использующего CRT, см. в разделе "Функции библиотеки CRT".

[В начало]