Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Параллельное программирование с использованием...doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
302 Кб
Скачать
☆

Директива 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 использовать строго запрещено!