Общие сведения о среде выполнения с параллелизмом
В этом документе содержатся общие сведения о среде выполнения с параллелизмом. В нем описаны преимущества среды выполнения с параллелизмом, ситуации, в которых ее следует использовать, и как ее компоненты взаимодействуют друг с другом, с операционной системой и приложениями.
Подразделы
Этот документ содержит следующие разделы.
Важность параллелизма в среде выполнения
Архитектура
Лямбда-выражения C++
Требования
Важность параллелизма в среде выполнения
Среда выполнения с параллелизмом обеспечивает единообразие и предсказуемость выполняемых одновременно приложений и компонентов приложений. Два примера преимуществ среды выполнения с параллелизмом — совместное планирование задач и совместное блокирование.
Среда выполнения с параллелизмом использует совместный планировщик задач, реализующий алгоритм переноса нагрузки, для эффективного распределения нагрузки на вычислительные ресурсы. Например, представим приложение, в котором имеется два потока, управляемые одной средой выполнения. Если один поток завершает запланированную для него задачу, он может принять на себя часть работы другого потока. Этот механизм позволяет уравновешивать общую рабочую нагрузку на приложение.
Среда выполнения с параллелизмом также предоставляет примитивы синхронизации, использующие совместную блокировку для синхронизации доступа к ресурсам. Например, рассмотрим задачу, для которой необходимо обеспечить эксклюзивный доступ к общему ресурсу. Совместная блокировка позволяет использовать в среде выполнения оставшийся такт для выполнения другой задачи, пока первая задача ожидает освобождения ресурса. Этот механизм обеспечивает максимально эффективное использование вычислительных ресурсов.
[Наверх]
Архитектура
Среда выполнения с параллелизмом разделена на четыре компонента: библиотека параллельных шаблонов (PPL), библиотека асинхронных агентов, планировщик заданий и диспетчер ресурсов. Эти компоненты распределены между операционной системой и приложениями. На следующем рисунке показано, как компоненты среды выполнения с параллелизмом взаимодействуют в операционной системе и приложениях.
Архитектура среды выполнения с параллелизмом
Важно!
Компоненты планировщика заданий и диспетчера ресурсов не доступны из приложения Магазин Windows.
Среда выполнения с параллелизмом предоставляет широкие возможности комбинирования, т. е. позволяет сочетать имеющиеся функциональные возможности для выполнения дополнительных задач. Среда выполнения с параллелизмом поддерживает множество функций (например, параллельные алгоритмы), унаследованных от компонентов более низкого уровня.
Среда выполнения с параллелизмом также предоставляет примитивы синхронизации, использующие совместную блокировку для синхронизации доступа к ресурсам. Дополнительные сведения об этих примитивах синхронизации см. в разделе Структуры данных синхронизации.
В следующих подразделах содержится краткий обзор возможностей каждого компонента и даются рекомендации по его использованию.
Библиотека параллельных шаблонов
Библиотека параллельных шаблонов (PPL) предоставляет контейнеры и алгоритмы общего назначения для выполнения специфических операций параллелизма. PPL обеспечивает поддержку императивного параллелизма данных, предоставляя параллельные алгоритмы, которые распределяют вычислительные ресурсы между вычислениями коллекций или наборов данных. Кроме того, библиотека поддерживает параллелизм задач, предоставляя объекты задач, распределяющие вычислительные ресурсы между несколькими независимыми операциями.
Библиотеку параллельных шаблонов рекомендуется использовать при наличии локальных вычислений, требующих параллельного выполнения. Например, можно использовать алгоритм concurrency::parallel_for для преобразования существующего цикла for для параллельной работы.
Дополнительные сведения о библиотеке параллельных шаблонов см. в разделе Библиотека параллельных шаблонов.
Библиотека асинхронных агентов
Библиотека асинхронных агентов (или просто Библиотека агентов) предоставляет модель программирования на основе субъектов и интерфейсы передачи сообщений для недетализированного потока данных и задач по конвейеризации. Асинхронные агенты позволяют эффективно использовать задержку, выполняя работу, пока другие компоненты ожидают данных.
Рекомендуется использовать библиотеку агентов, если имеется несколько асинхронно взаимодействующих друг с другом сущностей. Например, можно создать агент, который считывает данные из файла или сетевого подключения, а затем использует интерфейсы передачи сообщений для отправки этих данных другому агенту.
Дополнительные сведения о библиотеке агентов см. в разделе Библиотека асинхронных агентов.
Планировщик заданий
Планировщик заданий планирует и координирует задачи во время выполнения. Планировщик заданий поддерживает совместную работу и использует алгоритм переноса нагрузки для максимально эффективного использования ресурсов для обработки.
Среда выполнения с параллелизмом предоставляет планировщик по умолчанию, что устраняет необходимость в управлении подробностями инфраструктуры. Однако для удовлетворения качественных требований приложения можно использовать собственную политику планирования или связать конкретные планировщики с конкретными задачами.
Дополнительные сведения о планировщике заданий см. в разделе Планировщик задач (среда выполнения с параллелизмом).
Диспетчер ресурсов
Роль диспетчера ресурсов заключается в управлении вычислительными ресурсами (процессорами и памятью). Диспетчер ресурсов реагирует на изменение рабочей нагрузки во время выполнения, выделяя ресурсы так, чтобы их можно было использовать наиболее эффективно.
Диспетчер ресурсов является своеобразной абстракцией вычислительных ресурсов и взаимодействует в основном с планировщиком заданий. Хотя диспетчер ресурсов можно использовать для точной настройки производительности библиотек и приложений, как правило, используются функции, предоставленные библиотекой параллельных шаблонов, библиотекой агентов и планировщиком заданий. Эти библиотеки используют диспетчер ресурсов для динамического перераспределения ресурсов в ответ на изменение рабочей нагрузки.
[Наверх]
Лямбда-выражения C++
Многие типы и алгоритмы, определяемые средой выполнения с параллелизмом, реализуются в виде шаблонов C++. Некоторые из этих типов и алгоритмов принимают в качестве параметра процедуру, выполняющую работу. Этим параметром может быть лямбда-функция, объект функции или указатель функции. Эти сущности также называются рабочие функции или рабочие процедуры.
Лямбда-выражения — важный новый компонент языка Visual C++, так как они позволяют в сжатой форме определять рабочие функции для параллельной обработки. Объекты функций и указатели функций позволяют использовать среду выполнения с параллелизмом с существующим кодом. При создании нового кода рекомендуется использовать лямбда-выражения, так как они обеспечивают преимущества в безопасности и производительности.
В следующем примере сравнивается синтаксис лямбда-функций, объектов функций и указателей функций в нескольких вызовах алгоритма concurrency::parallel_for_each. Для вычисления квадрата каждого элемента в объекте std::array в каждом вызове алгоритма parallel_for_each используется своя техника.
// 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;
});
}
Output
Дополнительные сведения о лямбда-функциях в С++ см. в разделе Лямбда-выражения в C++.
[Наверх]
Требования
В следующей таблице показаны файлы заголовков, связанные с каждым компонентом среды выполнения с параллелизмом.
Компонент |
Заголовочные файлы |
---|---|
Библиотека параллельных шаблонов |
ppl.h concurrent_queue.h concurrent_vector.h |
Библиотека асинхронных агентов |
agents.h |
Планировщик заданий |
concrt.h |
Диспетчер ресурсов |
concrtrm.h |
Среда выполнения с параллелизмом объявляется в пространстве имен Concurrency. (Можно также использовать concurrency — псевдоним для этого пространства имен). Пространство имен concurrency::details поддерживает платформу среды выполнения с параллелизмом и не предназначено для непосредственного использования в коде.
Среда выполнения с параллелизмом предоставляется как часть библиотеки среды выполнения с параллелизмом (CRT). Дополнительные сведения о построении приложения, которое использует среду выполнения с параллелизмом, см. в разделе Функции библиотеки CRT.
[Наверх]