§ 6. Выполнение операторов цикла
Если в параллельной секции встретился оператор цикла без до-
полнительных указаний, то он будет выполнен всеми нитями, т.е.
каждая нить выполнит все операции данного цикла (заметим, что
переменные там могут иметь тип PRIVATE и тогда это — собствен-
ность данной нити).
Для распределения итераций между нитями используется ди-
ректива !$OMP DO
!$OMP DO [опция]
<do-цикл >
[!$OMP END DO]
Данная директива относится к оператору DO, находящимуся меж-
ду заголовком и хвостовиной директивы (здесь и далее квадрат-
ные скобки включают необязательные параметры); в качестве оп-
ции может быть использована опция SCHEDULE, которая определяет
конкретный способ распределения итераций цикла по нитям; пара-
метрами опции SCHEDULE являются следующие:
1) STATIC [,m] — блочно-циклическое распределение итераций
(квадраратные скобки означают, что содержимое не обязательно);
первый блок из m итераций выполняет первая нить, второй блок
из m итераций – вторая и т.д., а затем распределение начинается
снова с первой нити. Если значение m не указано, то множество
итераций делится на (непрерывные) куски одинакового размера по
числу нитей.
2) DYNAMIC [,m] — динамическое распределение итераций с
фиксированным размером блока: сначала все нити получают пор-
ции по m итераций, а затем каждая нить, заканчивающая свою ра-
боту получает порцию, содержащую m итераций. Если значение m
не указано, то оно принимается равным единице.
3) GUIDED [,m] — динамическое распределение итераций бло-
ками уменьшающегося размера: сначала блоки берутся максималь-
ных размеров (определяемых реализацией Open MP), а затем эти
размеры уменьшаются до тех пор, пока не достигнут значения m
(m — минимальный размер блока). Если значение m не указано, оно
принимается равным единице.
139