- •(Вопросы 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
Директива if
Директива (предложение) OpenMP if используется для организации условного выполнения потоков в параллельном структурном блоке.
Предложение OpenMP
if( expression )
определяет условие выполнения параллельных потоков в последующем параллельном структурном блоке. Если выражение expression принимает значение TRUE (Истина), то потоки в последующем параллельном структурном блоке выполняются. В противном случае, когда выражение expression принимает значение FALSE (Ложь), потоки в последующем параллельном структурном блоке не выполняются.
В качестве иллюстрации рассмотрим фрагмент программы (Пример 2.12).
c$omp parallel do if (n .ge. 2000)
do i = 1, n
a (i) = b (i)*c + d (i)
enddo
Пример 2.12. Пример использования директивы OpenMP if в параллельной области программы
В этом примере цикл распараллеливается только в том случае (n>2000), когда параллельная версия будет заведомо быстрее последовательной. Напомним, что трудоемкость образования параллельных потоков эквивалентна примерно трудоемкости 1000 операций.
Директива reduction
Директива OpenMP reduction позволяет собрать вместе в главном потоке результаты вычислений частичных сумм, разностей и т. п. из параллельных потоков последующего параллельного структурного блока.
В предложении OpenMP
reduction( operator | intrinsic: var1 [, var2,…, varN])
определяется operator - операции (+, -, *, / и т. п.) или функции, для которых будут вычисляться соответствующие частичные значения в параллельных потоках последующего параллельного структурного блока. Кроме того, определяется список локальных переменных var1, var2, …, varN, в котором будут сохраняться соответствующие частичные значения. После завершения всех параллельных процессов частичные значения складываются (вычитаются, перемножаются и т. п.), и результат сохраняется в одноименной общей переменной.
В качестве иллюстрации рассмотрим фрагмент программы (пример 2.13).
c$omp do shared (x) private (i)
c$omp& reduction (+ : sum)
do i = 1, N
sum = sum + x (I)
enddo
Пример 2.13. Пример вычисления суммы с использованием директивы OpenMP reduction в параллельной области программы
В этом примере в каждом параллельном потоке определена локальная переменная sum для вычисления частичных сумм. После завершения параллельных потоков все локальные переменные sum суммируются, а результат сохраняется в одноименной общей (глобальной) переменной sum.
Во фрагменте программы (пример 2.14) вычисляется минимальное значение по результатам вычисления частичных минимумов, вычисленных в параллельных потоках. В этом примере в каждом параллельном потоке определяются локальные минимумы по результатам сравнения значений x(i) и gmin. После завершения всех параллельных потоков вычисляется значение общей переменной gmin по результатам сравнения значений локальных переменных gmin в параллельных потоках.
c$omp do shared (x) private (i)
c$omp& reduction (min : gmin)
do i = 1, N
gmin = min gmin, x (i))
enddo
Пример 2.14. Пример вычисления минимума с использованием директивы OpenMP reduction в параллельной области программы
В языке Fortran в качестве параметров operator и intrinsic в предложениях reduction допускаются следующие операции и функции:
параметр operator может быть одной из следующих арифметических или логических операций: + , -, * , .and. , .or. , .eqv. , .neqv.;
параметр intrinsic может быть одной из следующих функций: max, min, iand, ior, ieor.
В языке C/C++ в качестве параметров operatorи intrinsicв предложениях reduction допускаются следующие операции и функции:
параметр operator может быть одной из следующих арифметических или логических операций: + , -, * , & , ^ , && , || ;
параметр intrinsic может быть одной из следующих функций: max, min;
указатели и ссылки в предложениях reduction использовать строго запрещено!
