Программирование с использованием OpenMP
Директивы
-
parallel … end parallel
Границы параллельной секции программы.С данной директивой могут использоваться следующие операции:
private; shared; default; firstprivate; reduction; if; copyin; num_threads
-
#pragma omp for цикл for
Границы цикла, исполняемого в параллельном режиме.С данной директивой могут использоваться следующие операции:
private; firstprivate; lastprivate; reduction; schedule; ordered; nowait.
-
sections … end sections
Вложенные секции программы, задаваемые директивами section, распределяются между нитями. С данной директивой могут использоваться следующие операции:
private; firstprivate; lastprivate; reduction; nowait.
-
section
Определяет часть sections, которая выполняется одной нитью.
-
parallel do цикл do end parallel do
Объединяет директивы parallel и do.
-
parallel sections … end parallel sections
Объединяет директивы parallel и sections.
-
critical[(блокировка)] … end critical[(блокировка)]
Обрамляет блок программы, доступ к которому в любой момент времени может получить только одна нить (критическая секция). Блокировка – необязательное имя критической секции.
-
barrier
Барьерная синхронизация нитей.
-
atomic
Объявляет операцию атомарной (то есть, одновременный доступ по записи разных нитей запрещен). Применяется только к оператору, непосредственно следующему после данной директивы. Он может иметь следующий вид:
x = x {+|-|*|/|.AND.|.OR.|.EQV.|.NEQV.} скалярное_выражение_не_содержащее_x x = скалярное_выражение_не_содержащее_x {+|-|*|/|.AND.|.OR.|.EQV.|.NEQV.} x = {MAX|MIN|IAND|IOR|IEOR} (x, скалярное_выражение_не_содержащее_x) x = {MAX|MIN|IAND|IOR|IEOR} (скалярное_выражение_не_содержащее_x, x)
-
flush[(список переменных)]
Задает точку синхронизации, в которой значения переменных, указанных в списке и видимых из данной нити, записываются в память. Этим обеспечивается согласование содержимого памяти, доступного разным нитям.
-
ordered … end ordered
Сохранение того порядка выполнения итераций цикла, который соответствует последовательному выполнению программы.
Операторы
-
private(список переменных)
Объявляет переменные из списка локальными.
-
firstprivate(список переменных)
Объявляет переменные из списка локальными и инициализирует их значениями из блока программы, предшествующего данной директиве.
-
lastprivate(список переменных)
Объявляет переменные из списка локальными и назначает им значения из того блока программы, который был выполнен последним.
-
nowait
Отменяет барьерную синхронизацию при завершении выполнения параллельной секции.
-
shared(список переменных)
Объявляет переменные из списка глобальными.
-
reduction(операция|встроенная функция: список переменных)
Приведение значений локальных переменных из списка с помощью указанной операции или встроенной функции языка.
-
schedule(характер_распределения_итераций[, количество_итераций_цикла])
Характер распределения итераций цикла между нитями:
- static – количество итераций цикла, передаваемых для выполнения каждой нити фиксировано и распределяется между нитями по принципу кругового планирования. Если количество итераций не указано, оно полагается равным 1;
- dynamic – количество итераций цикла, передаваемых для выполнения каждой нити фиксировано. Очередная "порция" итераций передается освободившейся нити;
- guided – количество итераций цикла, передаваемых для выполнения каждой нити уменьшается. Очередная "порция" итераций передается освободившейся нити;
- runtime – тип распределения работы определяется во время выполнения программы, например, с помощью переменной окружения OMP_SCHEDULE.