Санкт-Петербургский государственный университет
Опубликован: 11.02.2010 | Доступ: свободный | Студентов: 530 / 93 | Оценка: 4.41 / 4.44 | Длительность: 08:19:00
Специальности: Программист
Лекция 2:

OpenMP

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

Директивы OpenMP

Далее приводится перечень директив OpenMP. Описания директив OpenMP ориентированы на спецификацию версии 2.5.

parallel
. . .
end parallel

Задает границы параллельной секции программы. С данной директивой могут использоваться следующие операторы (их описание дается далее):

  • private;
  • shared;
  • default;
  • firstprivate;
  • reduction;
  • if;
  • copyin;
  • num_threads.
do
цикл do end do
#pragma omp for цикл for

Задает границы цикла, исполняемого в параллельном режиме в языках Fortran и C соответственно. С данной директивой могут использоваться следующие операторы:

  • private;
  • firstprivate;
  • lastprivate;
  • reduction;
  • schedule;
  • ordered;
  • nowait.
sections 
...
end sections

Обрамляет параллельную секцию программы. Вложенные секции программы, задаваемые директивами section, распределяются между нитями. С данной директивой могут использоваться следующие операторы:

  • private;
  • firstprivate;
  • lastprivate;
  • reduction;
  • nowait.

section

Определяет часть sections, которая выполняется одной нитью.

single
...
end single

Обрамляет блок программы, который должен выполняться одной нитью. С данной директивой могут использоваться следующие операторы:

  • private;
  • firstprivate;
  • copyprivate;
  • nowait.
workshare 
...
end workshare

Делит блок на части, выполнение которых распределяется между нитями таким образом, что каждая часть выполняется один раз. Блок может содержать только следующие конструкции:

  • присваивания массивов;
  • скалярные присваивания;
  • FORALL;
  • WHERE;
  • atomic;
  • critical;
  • parallel.
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[(блокировка)]

Обрамляет блок программы, доступ к которому в любой момент времени может получить только одна нить (критическая секция). Блокировка - необязательное имя критической секции. Квадратные скобки указывают, что имя не является обязательным и может быть опущено.

barrier

Директива барьерной синхронизации нитей. Каждая нить, выполнение которой достигло данной точки, приостанавливает свое выполнение до тех пор, пока все нити не достигнут данной точки.

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)

flush[(список переменных)]

Данная директива задает точку синхронизации, в которой значения переменных, указанных в списке и видимых из данной нити, записываются в память. Этим обеспечивается согласование содержимого памяти, доступного разным нитям.

ordered
...

end ordered

Обеспечивает сохранение того порядка выполнения итераций цикла, который соответствует последовательному выполнению программы.

threadprivate(список common-блоков)

Определяет common -блоки, перечисленные в списке, локальными.

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