OpenMP
Директивы OpenMP
Далее приводится перечень директив OpenMP. Описания директив OpenMP ориентированы на спецификацию версии 2.5.
parallel . . . end parallel
Задает границы параллельной секции программы. С данной директивой могут использоваться следующие операторы (их описание дается далее):
do цикл do end do #pragma omp for цикл for
Задает границы цикла, исполняемого в параллельном режиме в языках Fortran и C соответственно. С данной директивой могут использоваться следующие операторы:
sections ... end sections
Обрамляет параллельную секцию программы. Вложенные секции программы, задаваемые директивами section, распределяются между нитями. С данной директивой могут использоваться следующие операторы:
section
Определяет часть sections, которая выполняется одной нитью.
single ... end single
Обрамляет блок программы, который должен выполняться одной нитью. С данной директивой могут использоваться следующие операторы:
workshare ... end workshare
Делит блок на части, выполнение которых распределяется между нитями таким образом, что каждая часть выполняется один раз. Блок может содержать только следующие конструкции:
parallel do цикл do end parallel do
Объединяет директивы parallel и do.
parallel sections ... end parallel sections
Объединяет директивы parallel и sections.
parallel workshare ... end parallel workshare
Объединяет директивы parallel и workshare.
master ... end master
Обрамляет блок программы, который должен выполняться только главной нитью.
critical[(блокировка)] ... end critical[(блокировка)]
Обрамляет блок программы, доступ к которому в любой момент времени может получить только одна нить (критическая секция). Блокировка - необязательное имя критической секции. Квадратные скобки указывают, что имя не является обязательным и может быть опущено.
Директива барьерной синхронизации нитей. Каждая нить, выполнение которой достигло данной точки, приостанавливает свое выполнение до тех пор, пока все нити не достигнут данной точки.
atomic
Объявляет операцию атомарной (при выполнении атомарной операции одновременный доступ к памяти по записи разных нитей запрещен). Применяется только к оператору, непосредственно следующему после данной директивы. Он может иметь следующий вид:
- x = x {+|-|*|/|.AND.|.OR.|.EQV.|.NEQV.} скалярное_выражение_не_содержащее_х
- x = скалярное_выражение_не_содержащее_х {+|-|*|/|.AND.|.OR.|.EQV.|.NEQV.} x
- x = {MAX|MIN|IAND|IOR|IEOR} (x, скалярное_выражение_не_содержащее_x)
- x = {MAX|MIN|IAND|IOR|IEOR} (скалярное_выражение_не_содержащее_x, x)
Данная директива задает точку синхронизации, в которой значения переменных, указанных в списке и видимых из данной нити, записываются в память. Этим обеспечивается согласование содержимого памяти, доступного разным нитям.
ordered ... end ordered
Обеспечивает сохранение того порядка выполнения итераций цикла, который соответствует последовательному выполнению программы.
threadprivate(список common-блоков)
Определяет common -блоки, перечисленные в списке, локальными.