
- •(Вопросы 27-32) содержание
- •1. Лекция: Введение.
- •2. Лекция: Основные конструкции OpenMp
- •3. Лекция: Загрузка и синхронизация в OpenMp
- •4. Лекция: Дополнительные возможности OpenMp
- •1. Лекция: Введение Классификация параллельных архитектур
- •Современные направления развития параллельных вычислительных систем
- •Межузловые соединения в параллельных системах
- •Инструменты создания параллельных программ
- •2. Лекция: Основные конструкции OpenMp Основные принципы OpenMp
- •Принципиальная схема программирования в OpenMp
- •Синтаксис директив в OpenMp
- •Директива if
- •Директива reduction
- •Директива copyin
- •Директива for
- •Директива do
- •Директива workshare
- •Директива sections
- •Директива single
- •3. Лекция: Загрузка и синхронизация в OpenMp
- •Синхронизация процессов в OpenMp
- •Синхронизация типа atomic
- •Синхронизация типа critical
- •Синхронизация типа barrier
- •Синхронизация типа master
- •Синхронизация типа ordered
- •Синхронизация типа flush
- •Загрузка процессов в OpenMp. Директива schedule
- •Загрузка типа static
- •Загрузка типа dynamic
- •Загрузка типа guided
- •Загрузка типа runtime
- •4. Лекция: Дополнительные возможности OpenMp Задание переменных окружения с помощью функций runtime OpenMp
- •Передача данных с помощью директивы threadprivate
- •Функции блокировки в OpenMp
Загрузка процессов в OpenMp. Директива schedule
Проблема загрузки параллельных потоков является важной проблемой не только для параллельного программирования с использованием OpenMP, но и для всего параллельного программирования в целом. Эта проблема тесно связана с проблемой балансировки загрузки процессоров параллельных высокопроизводительных вычислительных систем, а также с проблемой повышения эффективности работы параллельных программ. Понятно, что для высокопроизводительной параллельной вычислительной системы успешное решение проблемы балансировки загрузки процессоров является ключом к решению задачи повышения эффективности вычислительной системы в целом. Как известно, процессы по-разному могут использовать вычислительные возможности процессоров. Так, на стадии интенсивных арифметических вычислений коэффициент загрузки процессоров обычно близок к 100%. На стадии интенсивных операций ввода/вывода коэффициент загрузки процессоров меняется в диапазоне от нескольких процентов до десятков процентов. Кроме того, процессоры могут простаивать и в том случа е, когда процессы, переданные им, уже обработаны, а другие процессоры все еще продолжают обрабатывать процессы той же задачи. Для исключения простоев или уменьшения времени простоев применяют различные методы балансировки процессов. Существующие в OpenMP различные методы загрузки процессов также могут быть применены для улучшения балансировки работы параллельных вычислительных систем.
Для распределения работы между процессами в OpenMP имеется директива schedule с параметрами, позволяющими задавать различные режимы загрузки процессоров. Ниже приведен общий вид предложения schedule в OpenMP.
schedule( type [ , chunk ] )
Здесь type - параметр, определяющий тип загрузки, а chunk - параметр, который определяет порции данных, пересылаемых между процессами (по умолчанию значение параметра chunk равно 1).
В OpenMP параметр type принимает одно из следующих значений:
static,
dynamic,
guided,
runtime.
Загрузка типа static
В этом случае вся совокупность загружаемых процессов разбивается на равные порции размера chunk, и эти порции последовательно распределяются между процессорами (или потоками, которые затем и выполняются на этих процессорах) с первого до последнего и т. д.
В качестве примера использования загрузки типа static рассмотрим фрагмент программы на языке Fortran, приведенный в примере 3.7.
с$omp do shared (x) private (i)
с$omp& schedule (static, 1000)
do i = 1, 12000
… work …
enddo
Пример 3.7. Пример загрузки schedule(static, chunk=1000)
Схема распределения загрузки процессов по процессорам (или потокам (threads), которые затем выполняются на процессорах), соответствующая этому примеру, приведена на рис.3.1. Как видно из этой схемы, все 12000 процессов разбиты на 12 порций по 1000 процессов (chunk=1000). Загрузка порций в потоки (threads) происходит последовательно. Сначала порции в порядке нумерации загружаются в первый, второй, третий и четвертый потоки, а затем загрузка производится опять в том же порядке, начиная с первого потока и т. д.
Рис. 3.1. Схема загрузки процессоров для программы, приведенной в примере 3.7