- •(Вопросы 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
Директива workshare
Директива OpenMP workshare используется для организации параллельного выполнения петель циклов только в программах, написанных на языках Fortran 90/95. Эта директива появилась в стандарте OpenMP начиная с версии 2.0.
Синтаксис предложения OpenMP workshare в программах на языках Fortran 90/95 имеет следующий вид:
c$omp [ parallel ] workshare
loop
c$omp end workshare [nowait]
В результате все петли loop реализуются как параллельные процессы. Распределение петель по процессам осуществляется компилятором. Последнее предложение, содержащее end workshare, завершает параллельное выполнение петель loop с неявно присутствующей синхронизацией barrier. Для отмены синхронизации следует включить предложение nowait.
В следующем примере иллюстрируется использование директивы workshare:
c$omp parallel workshare
A = A + B
c$omp end workshare
В этом примере A и B являются массивами одинаковой размерности, например N. Отметим, что рассмотренный пример можно также переписать, например, в следующем виде с использованием оператора цикла и OMP-предложения parallel do:
c$omp parallel do private ( I )
do I = 1, N
A (I) = A (I) + B (I)
enddo
c$omp end parallel do
Важно отметить, что в компиляторах Fortran компании Intel директива workshare не поддерживается. Отметим также, что компиляторы Fortran 90/95 компаний IBM и SUN поддерживают эту директиву. Также еще раз отметим, что в программах на языках C/C++ директива workshare недопустима.
Директива sections
Директива OpenMP sections используется для выделения участков программы в области параллельных структурных блоков, выполняющихся в отдельных параллельных потоках.
Описание синтаксиса предложения OpenMP sections в программе на языке C/C++ приведено в примере 2.18.
#pragma omp sections [предложение [предложение …]]
{
#pragma omp section
structured block
[#pragma omp section
structured block
…
]
}
Пример 2.18. Синтаксис предложения OpenMP sections в программе на C/C++
Каждый структурный блок (structured block), следующий за прагмой
#pragma omp sections
выполняется в отдельном параллельном потоке. Общее же число параллельных потоков равно количеству структурных блоков (section), перечисленных после прагмы
#pragma omp sections [ предложение [ предложение … ] ]
В качестве предложений допускаютcя следующие OpenMP директивы: private(list), firstprivate(list), lastprivate(list), reduction(operator :list) и nowait.
Описание синтаксиса предложения OpenMP sections в программе на языке Fortran приведено в примере 2.19.
с$omp sections [предложение [, предложение] …]
с$omp section
code block
[с$omp section
another code block
[с$omp section
…]]
с$omp end sections [nowait]
Пример 2.19. Синтаксис предложения OpenMP sections в программе на языке Fortran
В качестве предложений допускаются все перечисленные выше директивы OpenMP.
Для большей ясности рассмотрим фрагмент программы на языке Fortran, приведенный в примере 2.20. В этом примере каждая параллельная секция выполняется в отдельном параллельном потоке. Всего в параллельной области определено три параллельных потока, реализующих в данном случае функциональную декомпозицию.
Отметим, что выражение c$omp end sections неявно реализует функцию синхронизации barrier. Для ее отмены следует воспользоваться предложением nowait.
с$omp parallel
с$omp sections
с$omp section
call computeXpart ( )
с$omp section
call computeYpart ( )
с$omp section
call computeZpart ( )
с$omp end sections
с$omp end parallel
call sum ( )
Пример 2.20. Использование предложения OpenMP sections в программе на языке Fortran
