Основные конструкции 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
Директива single
Директива OpenMP single используется для выделения участков программы в области параллельных структурных блоков, выполняющихся только в одном из параллельных потоков. Во всех остальных параллельных потоках выделенный директивой single участок программы не выполняется, однако параллельные процессы, выполняющиеся в остальных потоках, ждут завершения выполнения выделенного участка программы, т. е. неявно реализуется процедура синхронизации. Для предотвращения этого ожидания в случае необходимости можно использовать предложение OpenMP nowait, как будет показано ниже.
Описание синтаксиса предложения OpenMP single в программе на языке C/C++ приведено в примере 2.21.
#pragma omp single [предложение [предложение …] ] structured block2.21. Синтаксис предложения OpenMP single в программе на языке C/C++
Структурный блок ( structured block ), следующий за прагмой
#pragma omp single
выполняется только в одном из потоков. В качестве предложений допускаютcя следующие OpenMP директивы: private(list), firstprivate(list). Описание синтаксиса предложения OpenMP single в программе на языке Fortran приведено в примере 2.22.
с$omp single [предложение [предложение …] ] structured block с$omp end single [nowait]2.22. Синтаксис предложения OpenMP single в программе на языке Fortran
Структурный блок ( structured block ), следующий за директивой
c$omp single
выполняется только в одном из параллельных потоков. В качестве предложений допускаютcя следующие OpenMP директивы: private(list), firstprivate(list).