Сравнение среды выполнения с параллелизмом с другими моделями параллелизмаComparing the Concurrency Runtime to Other Concurrency Models

В этом документе описываются различия между функциями и моделями программирования среды выполнения с параллелизмом и других технологий.This document describes the differences between the features and programming models of the Concurrency Runtime and other technologies. Разобравшись, чем преимущества среды выполнения с параллелизмом отличаются от преимуществ других моделей программирования, вы сможете выбрать ту технологию, которая лучше всего соответствует требованиям ваших приложений.By understanding how the benefits of the Concurrency Runtime compare to the benefits of other programming models, you can select the technology that best satisfies the requirements of your applications.

Если сейчас вы используете другую модель программирования, например пул потоков Windows или OpenMP, существуют ситуации, в которых может оказаться выгодным перейти на среду выполнения с параллелизмом.If you are currently using another programming model, such as the Windows thread pool or OpenMP, there are situations where it can be appropriate to migrate to the Concurrency Runtime. Например, в разделе Migrating from OpenMP to the Concurrency Runtime описано, когда может быть выгодна миграция из OpenMP в среду выполнения с параллелизмом.For example, the topic Migrating from OpenMP to the Concurrency Runtime describes when it can be appropriate to migrate from OpenMP to the Concurrency Runtime. Тем не менее, если вы удовлетворены производительностью приложений и текущим уровнем поддержки отладки, миграция не требуется.However, if you are satisfied with application performance and current debugging support, migration is not required.

Функции и преимущества среды выполнения с параллелизмом можно использовать, чтобы дополнить возможности существующего приложения, использующего другую модель параллелизма.You can use the features and productivity benefits of the Concurrency Runtime to complement your existing application that uses another concurrency model. Среда выполнения с параллелизмом не гарантирует балансировку нагрузки, когда несколько планировщиков заданий конкурируют за одни и те же вычислительные ресурсы.The Concurrency Runtime cannot guarantee load balancing when multiple task schedulers compete for the same computing resources. Однако если рабочие нагрузки не накладываются, этот эффект проявляется в минимальной степени.However, when workloads do not overlap, this effect is minimal.

СвященSections

Сравнение планирования с вытеснением до совместного планированияComparing Preemptive Scheduling to Cooperative Scheduling

Модель планирования по приоритетам и модель координированного планирования — это два распространенных способа позволить нескольким задачам совместно использовать вычислительные ресурсы, например процессоры или аппаратные потоки.The preemptive model and cooperative scheduling models are two common ways to enable multiple tasks to share computing resources, for example, processors or hardware threads.

Планирование по приоритетам и координированное планированиеPreemptive and Cooperative Scheduling

Планирование по приоритетам — это основанный на приоритетах механизм циклического перебора, который предоставляет каждой задаче монопольный доступ к вычислительному ресурсу на заданный период, а затем переключается на другую задачу.Preemptive scheduling is a round-robin, priority-based mechanism that gives every task exclusive access to a computing resource for a given time period, and then switches to another task. Планирование по приоритетам используется в многозадачных операционных системах, таких как Windows.Preemptive scheduling is common in multitasking operating systems such as Windows. Совместное планирование — это механизм, который предоставляет каждой задаче эксклюзивный доступ к вычислительному ресурсу до тех пор, пока задача не завершится, или пока задача не выдаст доступ к ресурсу.Cooperative scheduling is a mechanism that gives every task exclusive access to a computing resource until the task finishes or until the task yields its access to the resource. Среда выполнения с параллелизмом использует координированное планирование вместе с приоритетным планировщиком операционной системы, чтобы максимально эффективно использовать ресурсы для обработки.The Concurrency Runtime uses cooperative scheduling together with the preemptive scheduler of the operating system to achieve maximum usage of processing resources.

Различия между приоритетным и координированным планировщикомDifferences Between Preemptive and Cooperative Schedulers

Приоритетные планировщики стремятся предоставить нескольким потокам равный доступ к вычислительным ресурсам, чтобы обеспечить обработку каждого потока.Preemptive schedulers seek to give multiple threads equal access to computing resources to ensure that every thread makes progress. На компьютерах с большим объемом вычислительных ресурсов проще реализовать равноправный доступ, однако сложнее обеспечить эффективное использование ресурсов.On computers that have many computing resources, ensuring fair access becomes less problematic; however, ensuring efficient utilization of the resources becomes more problematic.

Приоритетный планировщик в режиме ядра требует, чтобы при принятии решений планирования код приложения полагался на операционную систему.A preemptive kernel-mode scheduler requires the application code to rely on the operating system to make scheduling decisions. И наоборот, координированный планировщик в пользовательском режиме позволяет коду приложения принимать собственные решения планирования.Conversely, a user-mode cooperative scheduler enables application code to make its own scheduling decisions. Поскольку координированное планирование позволяет приложению принимать множество решений по планированию, это уменьшает временные затраты, связанные с синхронизацией в режиме ядра.Because cooperative scheduling enables many scheduling decisions to be made by the application, it reduces much of the overhead that is associated with kernel-mode synchronization. Координированный планировщик обычно уступает принятие решений по планированию ядру операционной системы, когда нет другой работы, которую нужно спланировать.A cooperative scheduler typically defers scheduling decisions to the operating system kernel when it has no other work to schedule. Координированный планировщик также уступает планировщику операционной системы, если имеется операция блокировки, которая передана ядру, но не передана планировщику в пользовательском режиме.A cooperative scheduler also defers to the operating system scheduler when there is a blocking operation that is communicated to the kernel, but that operation is not communicated to the user-mode scheduler.

Координированное планирование и эффективностьCooperative Scheduling and Efficiency

Для приоритетного планировщика вся работа, имеющая один и тот же уровень приоритета, равнозначна.To a preemptive scheduler, all work that has the same priority level is equal. Обычно приоритетный планировщик планирует потоки в порядке их создания.A preemptive scheduler typically schedules threads in the order in which they are created. Кроме того, приоритетный планировщик предоставляет каждому потоку отрезок времени по принципу циклического перебора, основываясь на приоритете потока.Furthermore, a preemptive scheduler gives every thread a time slice in a round-robin manner, based on thread priority. Хотя этот механизм обеспечивает равноправность (обработка каждого потока продвигается вперед), отчасти это достигается за счет эффективности.Although this mechanism provides fairness (every thread makes forward progress), it comes at some cost of efficiency. Например, многие алгоритмы с большим объемом вычислений не требуют равноправность.For example, many computation-intensive algorithms do not require fairness. Вместо этого очень важно обеспечить минимальное общее время, затрачиваемое на завершение связанных задач.Instead, it is important that related tasks finish in the least overall time. Координированное планирование позволяет приложению планировать работу более эффективно.Cooperative scheduling enables an application to more efficiently schedule work. Например, рассмотрим приложение с большим числом потоков.For example, consider an application that has many threads. Планирование потоков, не использующих ресурсы совместно, для параллельного выполнения позволяет сократить временные затраты на синхронизацию и тем самым повысить эффективность.Scheduling threads that do not share resources to run concurrently can reduce synchronization overhead and thereby increase efficiency. Еще одним эффективным способом планирования задач является запуск конвейеров задач (где каждая последующая задача обрабатывает выходные данные предыдущей) на одном процессоре, чтобы входные данные каждого этапа конвейера были уже загружены в кэш памяти.Another efficient way to schedule tasks is to run pipelines of tasks (where each task acts on the output of the previous one) on the same processor so that the input of each pipeline stage is already loaded into the memory cache.

Совместное использование планирования по приоритетам и координированного планированияUsing Preemptive and Cooperative Scheduling Together

Координированное планирование не позволяет решить все проблемы, связанные с планированием.Cooperative scheduling does not solve all scheduling problems. Например, задачи, которые не уступают управление другим задачам по принципу равноправности, могут потреблять все доступные вычислительные ресурсы и препятствовать выполнению других задач.For example, tasks that do not fairly yield to other tasks can consume all available computing resources and prevent other tasks from making progress. Среда выполнения с параллелизмом использует преимущества координированного планирования, чтобы дополнить гарантии равноправности планирования по приоритетам.The Concurrency Runtime uses the efficiency benefits of cooperative scheduling to complement the fairness guarantees of preemptive scheduling. По умолчанию среда выполнения с параллелизмом использует координированный планировщик, реализующий алгоритм переноса нагрузки для эффективного распределения вычислительных ресурсов.By default, the Concurrency Runtime provides a cooperative scheduler that uses a work-stealing algorithm to efficiently distribute work among computing resources. Однако планировщик среды выполнения с параллелизмом также полагается на приоритетный планировщик операционной системы для равномерного распределения ресурсов между приложениями.However, the Concurrency Runtime scheduler also relies on the preemptive scheduler of the operating system to fairly distribute resources among applications. В приложениях можно также создать пользовательские планировщики и их политики, чтобы осуществлять точный контроль над выполнением потока.You can also create custom schedulers and scheduler policies in your applications to produce fine-grained control over thread execution.

[Top][Top]

Сравнение среда выполнения с параллелизмом с API WindowsComparing the Concurrency Runtime to the Windows API

Программный интерфейс Microsoft Windows, который обычно называют Windows API (ранее назывался Win32), предоставляет модель программирования, позволяющую использовать параллелизм в приложениях.The Microsoft Windows application programming interface, which is typically referred to as the Windows API (and formerly known as Win32), provides a programming model that enables concurrency in your applications. Среда выполнения с параллелизмом использует Windows API для предоставления дополнительных моделей программирования, которые не доступны из базовой операционной системы.The Concurrency Runtime builds on the Windows API to provide additional programming models that are not available from the underlying operating system.

Среда выполнения с параллелизмом использует потоковую модель Windows API для выполнения параллельной работы.The Concurrency Runtime builds on the Windows API thread model to perform parallel work. Кроме того, она использует механизмы локальной памяти потока и управления памятью Windows API.It also uses the Windows API memory management and thread-local storage mechanisms. В Windows 7 и Windows Server 2008 R2 она использует поддержку Windows API для планируемых пользователями потоков и компьютеров, имеющих более 64 аппаратных потоков.On Windows 7 and Windows Server 2008 R2, it uses Windows API support for user-schedulable threads and computers that have more than 64 hardware threads. Среда выполнения с параллелизмом расширяет модель Windows API, предоставляя координированный планировщик задач и алгоритм переноса нагрузки для оптимизации использования вычислительных ресурсов, а также разрешая использовать несколько экземпляров планировщика одновременно.The Concurrency Runtime extends the Windows API model by providing a cooperative task scheduler and a work-stealing algorithm to maximize the use of computing resources, and by enabling multiple simultaneous scheduler instances.

Языки программированияProgramming Languages

Windows API использует язык программирования C для предоставления модели программирования.The Windows API uses the C programming language to expose the programming model. Среда выполнения с параллелизмом предоставляет интерфейс программирования C++, который использует новейшие функции языка C++.The Concurrency Runtime provides a C++ programming interface that takes advantage of the newest features in the C++ language. Например, лямбда-функции предоставляют исчерпывающий типобезопасный механизм для определения параллельных рабочих функций.For example, lambda functions provide a succinct, type-safe mechanism for defining parallel work functions. Дополнительные сведения о новейших функциях языка C++, используемых в среде выполнения с параллелизмом, см. в этом обзоре.For more information about the newest C++ features that the Concurrency Runtime uses, see Overview.

Потоки и пулы потоковThreads and Thread Pools

Центральным механизмом параллелизма в Windows AP является поток.The central concurrency mechanism in the Windows API is the thread. Обычно для создания потоков используется функция CreateThread.You typically use the CreateThread function to create threads. Хотя потоки относительно легко создавать и использовать, операционная система выделяет значительный объем времени и ресурсов для управления ими.Although threads are relatively easy to create and use, the operating system allocates a significant amount of time and other resources to manage them. Кроме того, хотя каждому потоку гарантируется то же время выполнения, что и любому другому потоку с таким же уровнем приоритета, связанные с ним временные затраты требуют создания достаточно крупных задач.Additionally, although each thread is guaranteed to receive the same execution time as any other thread at the same priority level, the associated overhead requires that you create sufficiently large tasks. Для более мелких или детальных задач издержки, связанные с параллелизмом, могут перевесить преимущества параллельного выполнения задач.For smaller or more fine-grained tasks, the overhead that is associated with concurrency can outweigh the benefit of running the tasks in parallel.

Пулы потоков являются одним из способов снизить затраты на управление потоками.Thread pools are one way to reduce the cost of thread management. Пользовательские пулы потоков и реализация пула потоков, представленная в Windows API, позволяют эффективно выполнять небольшие рабочие элементы в параллельном режиме.Custom thread pools and the thread pool implementation that is provided by the Windows API both enable small work items to efficiently run in parallel. Пул потоков Windows обрабатывает рабочие элементы в очереди в порядке поступления (FIFO).The Windows thread pool maintains work items in a first-in, first-out (FIFO) queue. Все рабочие элементы запускаются в порядке добавления в пул.Each work item is started in the order in which it was added to the pool.

Среда выполнения с параллелизмом реализует алгоритм переноса нагрузки для расширения механизма планирования FIFO.The Concurrency Runtime implements a work-stealing algorithm to extend the FIFO scheduling mechanism. Алгоритм перемещает задачи, обработка которых еще не начата, в потоки, где рабочие элементы заканчиваются.The algorithm moves tasks that have not yet started to threads that run out of work items. Хотя алгоритм переноса нагрузки может равномерно распределять рабочую нагрузку, он также может переупорядочивать рабочие элементы.Although the work-stealing algorithm can balance workloads, it can also cause work items to be reordered. В результате рабочий элемент может запускаться не в том порядке, в котором он был отправлен.This reordering process can cause a work item to start in a different order than it was submitted. Это полезно при рекурсивных алгоритмах, где выше вероятность совместного использования данных более новыми задачами, а не более старыми.This is useful with recursive algorithms, where there is a better chance that data is shared among newer tasks than among older ones. Обеспечение первоначального выполнения новых элементов снижает число промахов кэша и, возможно, число ошибок страниц.Getting the new items to run first means fewer cache misses and possibly fewer page faults.

С точки зрения операционной системы перенос нагрузки не является равноправным.From the perspective of the operating system, work stealing is unfair. Однако если приложение реализует алгоритм или задачу для параллельного выполнения, равноправность подзадач не всегда имеет значение.However, when an application implements an algorithm or task to run in parallel, fairness among the sub-tasks does not always matter. Действительно важно то, насколько быстро завершается задача в общем случае.What does matter is how quickly the overall task finishes. Для других алгоритмов FIFO является подходящей стратегией планирования.For other algorithms, FIFO is the appropriate scheduling strategy.

Поведение в различных операционных системахBehavior on Various Operating Systems

В Windows XP и Windows Vista приложения, использующие среду выполнения с параллелизмом, ведут себя точно так же, за исключением того, что в Windows Vista наблюдается повышение производительности кучи.On Windows XP and Windows Vista, applications that use the Concurrency Runtime behave similarly, except that heap performance is improved on Windows Vista.

В Windows 7 и Windows Server 2008 R2 операционная система дополнительно поддерживает параллелизм и масштабируемость.In Windows 7 and Windows Server 2008 R2, the operating system further supports concurrency and scalability. Например, эти операционные системы поддерживают компьютеры, имеющие более 64 аппаратных потоков.For example, these operating systems support computers that have more than 64 hardware threads. Чтобы воспользоваться преимуществами этих новых функций, необходимо изменить существующее приложение, использующее Windows API.An existing application that uses the Windows API must be modified to take advantage of these new features. Однако приложение, использующее среду выполнения с параллелизмом, применяет эти возможности автоматически и не требует изменений.However, an application that uses the Concurrency Runtime automatically uses these features and does not require modifications.

base.user-mode_schedulingbase.user-mode_scheduling

[Top][Top]

Сравнение среда выполнения с параллелизмом с OpenMPComparing the Concurrency Runtime to OpenMP

Среда выполнения с параллелизмом позволяет использовать самые разные модели программирования.The Concurrency Runtime enables a variety of programming models. Эти модели могут перекрываться с моделями других библиотек или дополнять их.These models may overlap or complement the models of other libraries. В этом разделе среда выполнения с параллелизмом сравнивается с OpenMP.This section compares the Concurrency Runtime to OpenMP.

Модель программирования OpenMP определяется открытым стандартом и обладает четко определенными привязками к языкам программирования Fortran и C/C++.The OpenMP programming model is defined by an open standard and has well-defined bindings to the Fortran and C/C++ programming languages. OpenMP версий 2.0 и 2.5 хорошо подходит для параллельных алгоритмов, которые являются итеративными, то есть выполняют параллельные итерации по массиву данных.OpenMP versions 2.0 and 2.5 are well-suited for parallel algorithms that are iterative; that is, they perform parallel iteration over an array of data. OpenMP работает наиболее эффективно при предопределенной степени параллелизма и соответствующем уровне доступных ресурсов в системе.OpenMP is most efficient when the degree of parallelism is pre-determined and matches the available resources on the system. Модель OpenMP особенно хорошо подходит для высокопроизводительных вычислений, где очень крупные вычислительные задачи распределяются по вычислительным ресурсам на одном компьютере.The OpenMP model is an especially good match for high-performance computing, where very large computational problems are distributed across the processing resources of a single computer. В этом случае аппаратная среда известна, и разработчик может рассчитывать на монопольный доступ к вычислительным ресурсам при выполнении алгоритма.In this scenario, the hardware environment is known and the developer can reasonably expect to have exclusive access to computing resources when the algorithm is executed.

Однако другие, менее ограниченные вычислительные среды, могут показывать не такие высокие результаты при использовании с OpenMP.However, other, less constrained computing environments may not be a good match for OpenMP. Например, с помощью OpenMP сложнее реализовать рекурсивные задачи (например, алгоритм быстрой сортировки или поиск в дереве данных).For example, recursive problems (such as the quicksort algorithm or searching a tree of data) are more difficult to implement by using OpenMP. Среда выполнения с параллелизмом дополняет возможности OpenMP, предоставляя библиотеку параллельных шаблонов (PPL) и библиотеку асинхронных агентов.The Concurrency Runtime complements the capabilities of OpenMP by providing the Parallel Patterns Library (PPL) and the Asynchronous Agents Library. В отличие от OpenMP среда выполнения с параллелизмом предоставляет динамический планировщик, адаптирующийся к доступным ресурсам и корректирующий уровень параллелизма при изменении рабочей нагрузки.Unlike OpenMP, the Concurrency Runtime provides a dynamic scheduler that adapts to available resources and adjusts the degree of parallelism as workloads change.

Многие функции в среде выполнения с параллелизмом можно расширить.Many of the features in the Concurrency Runtime can be extended. Кроме того, можно объединять существующие функции для создания новых.You can also combine existing features to compose new ones. Поскольку модель OpenMP основывается на директивах компилятора, ее не так легко расширять.Because OpenMP relies on compiler directives, it cannot be extended easily.

Дополнительные сведения о сравнении среды выполнения с параллелизмом с OpenMP и о миграции существующего кода OpenMP для использования среды выполнения с параллелизмом см. в разделе Migrating from OpenMP to the Concurrency Runtime.For more information about how the Concurrency Runtime compares to OpenMP and how to migrate existing OpenMP code to use the Concurrency Runtime, see Migrating from OpenMP to the Concurrency Runtime.

[Top][Top]

См. также разделSee also

Среда выполнения с параллелизмомConcurrency Runtime
ОбзорOverview
Библиотека параллельных шаблоновParallel Patterns Library (PPL)
библиотеку асинхронных агентовAsynchronous Agents Library
OpenMPOpenMP