Опубликован: 15.04.2008 | Доступ: свободный | Студентов: 1559 / 544 | Оценка: 4.36 / 4.02 | Длительность: 06:55:00
ISBN: 978-5-94774-857-4
Специальности: Программист
Лекция 2:

Основные конструкции OpenMP

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

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

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >