Поделиться через


2.4.1 Конструкция for

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

#pragma omp for [clause[[,] clause] ... ] new-line 
   for-loop

Предложение одно из следующих действий:

private (список переменных)

(firstprivateсписок переменных**)**

(lastprivateсписок переменных**)**

снижение (Оператор . список переменных)

Упорядочено

расписание (тип[, chunk_size])

nowait

для директива задает ограничения на структуре соответствовать для цикл. В частности, сопоставления для цикл должен иметь каноническую форму:

для (init-expr; var логически-op б; incr-expr**)**

  • init-expr
    Один из следующих вариантов:

    var = lb

    целое число-тип var = lb

  • incr-expr
    Один из следующих вариантов:

    ++var

    var ++

    -- var

    var --

    var += incr

    var - = incr

    var = var + incr

    var = incr + var

    var = var - incr

  • var
    Переменная знакового целого числа. Если эта переменная в противном случае были бы совместно, она неявно выполняется закрытой на длительность для. Эту переменную, должны быть изменены в теле для выписка. Если переменная не определена lastprivateпосле цикла, его значение не определено.

  • логически-op
    Один из следующих вариантов:

    <

    <=

    >

    >=

  • lb" ви incr
    Выражения целого числа цикла инвариантные. Синхронизация этих выражений во время оценки. Таким образом, все оцененные побочные эффекты, приводящих к непредсказуемым.

Обратите внимание, что каноническая форма разрешает число итераций цикла, который необходимо вычислить для записи в цикл. Это выполняется вычисление со значениями в типе varпосле объединенных promotions. в частности, если значение в - lb + incr нельзя представить в этом типе, результат не определен. Более того, если логически-op < или затем <= incr-expr вызвать var увеличить для каждой итерации цикла. If логически-op > или затем >= incr-expr вызвать var уменьшить на каждой итерации цикла.

расписание предложение указывает, как итерации для цикл делится между потоками рабочей группы. Правильность программы зависит от того, выполняется поток заданная итерация. Значение chunk_sizeесли задан, выражение должно быть целым числом цикла инвариантное с положительным значением. Синхронизация во время оценки этого выражения. Таким образом, все оцененные побочные эффекты, приводящих к непредсказуемым. Расписание тип может быть одним из следующих:

ТАБЛИЦА 2-1 расписание предложение тип значения

static

После расписание (статический),chunk_size) определяет, итерации разделить на блоки размером определенного by chunk_size. Блоки статически присвоенные потокам в рабочей группе в виде циклического перебора в порядке номеров потока. Если нет chunk_size определяет пространство итерации делит приблизительно в блоки, которые равны в размере, при этом один блок, присвоенный каждому потоку.

dynamic

После расписание (динамическое, chunk_size) определяет, итерации разделить на ряд блоков каждый, содержащий chunk_size итерации. Каждый блок присвоенный поток, который ожидает входа в назначение. Выполняется поток блок итераций, а затем ожидает его следующее назначение, до тех пор, пока не будут осталось, что присвоенны не блокируется. Видит, что последний блок, которое требуется присвоить может иметь меньшее число итераций. Если нет chunk_size определяет, оно имеет значение по умолчанию равно 1.

направляется

После интерактивный расписание (" chunk_size) определяет, итерации присвойте потокам в блоках уменьшается с размерами. При завершении его присвоенный поток блок итераций, ему динамически присвоено другой блок, до тех пор, пока не осталось ни одного. Для a chunk_size 1 - размер каждого блока приблизительно количество неопределенных итераций, разделенных на число потоков. Эти размеры уменьшают приблизительно экспоненциально до 1. Для a chunk_size значение k больше 1, размер уменьшается приблизительно экспоненциально к k, за исключением того, что последний блок может иметь меньше k итерации. Если нет chunk_size определяет, оно имеет значение по умолчанию равно 1.

среда выполнения

После расписание (среда выполнения) не указаны, решение о планировании откладывать до времени выполнения. Расписание тип можно выбрать и размер блоков во время выполнения путем установки переменной среды OMP_SCHEDULE. Если эта переменная среды не задана, то результирующее реализация-определено расписание. После расписание (среда выполнения) определяет, chunk_size должны быть определены.

В случае отсутствия явно заданного расписание предложение, значение по умолчанию расписание реализация-определяет.

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

Упорядочено когда должно присутствовать предложение Упорядочено привязка к директив для конструкция.

Неявный барьера в конце a для конструкция, если a nowait предложение distinct.

Ограничения для директива выглядит следующим образом:

  • для цикл должен быть структурированным блоком, и, кроме того, ее выполнение не должен быть завершен a Прервать выписка.

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

  • для переменная итерации цикла должно иметь тип знакового целого числа.

  • Только одного расписание предложение может отображаться на a для директива.

  • Только одного Упорядочено предложение может отображаться на a для директива.

  • Только одного nowait предложение может отображаться на a для директива.

  • Если он не указан или как часто все побочные эффекты в пределах chunk_size" lb" вили incr выражения встречаются.

  • Значение chunk_size выражение должно быть одинаковым для всех потоков в рабочей группе.

Перекрестные ссылки:

  • private" firstprivate" lastprivateи сокращение предложения см. в разделе Раздел 2.7.2 на странице 25.

  • OMP_SCHEDULE переменная среды выполнения, см. в разделе Раздел 4.1 на странице 48.

  • Упорядочено конструкция см. в разделе Раздел 2.6.6 на странице 22.

  • D приложениястраница 93 предоставляет дополнительные сведения об использовании предложения расписания.