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

Директива 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