Санкт-Петербургский государственный университет
Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 955 / 173 | Длительность: 05:14:00
Лекция 8:

Программирование с использованием OpenMP

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Директивы

  • 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.
< Лекция 7 || Лекция 8: 123 || Лекция 9 >