Опубликован: 11.02.2010 | Уровень: специалист | Доступ: платный | ВУЗ: Санкт-Петербургский государственный университет
Лекция 2:

OpenMP

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

Операторы OpenMP

Операторы OpenMP используются совместно с директивами.

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

Объявляет переменные из списка локальными.

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

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

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

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

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

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

nowait

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

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

Объявляет переменные из списка общими для всех нитей.

default(private|shared|none)

Данный оператор позволяет изменить правила определения области видимости переменных, действующие по умолчанию. Вариант private используется только в языке Fortran.

reduction(операция|встроенная функция: список переменных)

Оператор приведения (редукции) значений локальных переменных из списка с помощью указанной операции или встроенной функции языка. Операция редукции применяется к нескольким значениям и возвращает одно значение.

if(скалярное логическое выражение)

Условный оператор.

num_threads( скалярное целое выражение)

Задает количество нитей. Альтернативный способ задания количества нитей обеспечивает переменная окружения OMP_NUM_THREADS.

schedule(характер_распределения_итераций[, количество_итераций_цикла])

Данный оператор задает способ распределения итераций цикла между нитями:

  • static - количество итераций цикла, передаваемых для выполнения каждой нити фиксировано и распределяется между нитями по принципу кругового планирования. Если количество итераций не указано, оно полагается равным 1;
  • dynamic - количество итераций цикла, передаваемых для выполнения каждой нити фиксировано. Очередная "порция" итераций передается освободившейся нити;
  • guided - количество итераций цикла, передаваемых для выполнения каждой нити постепенно уменьшается. Очередная "порция" итераций передается освободившейся нити;
  • runtime - тип распределения работы определяется во время выполнения программы, например, с помощью переменной окружения OMP_SCHEDULE.

copyin(список имен common-блоков)

При выполнении этого оператора данные из главной нити копируются в локальные экземпляры common -блока в начале каждой параллельной секции. Имена задаются между символами "/ ".

Подпрограммы OpenMP

Подпрограммы, формирующие среду выполнения параллельной программы

Здесь и далее вначале приводится интерфейс подпрограмм OpenMP для языка C, затем для языка Fortran.

void omp_set_num_threads(int threads);

subroutine omp_set_num_threads(threads) integer threads

Задает количество потоков ( threads ) при выполнении параллельных секций программы.

int omp_get_num_threads(void);

integer function omp_get_num_threads()

Возвращает количество потоков, используемых для выполнения параллельной секции.

int omp_get_max_threads(void); 
integer function omp_get_max_threads()

Возвращает максимальное количество потоков, которые можно использовать для выполнения параллельных секций программы.

int omp_get_thread_num(void);

integer function omp_get_thread_num()

Возвращает идентификатор нити, из которой вызывается данная функция.

int omp_get_num_procs(void);

integer function omp_get_num_procs()

Возвращает количество процессоров, доступных в данный момент программе.

int omp_in_parallel(void);

logical function omp_in_parallel()

Возвращает значение true при вызове из активной параллельной секции программы.

void omp_set_dynamic(int threads);

subroutine omp_set_dynamic(threads)

logical threads

Включает или отключает возможность динамического назначения количества потоков при выполнении параллельной секции. По умолчанию эта возможность отключена.

int omp_get_dynamic(void);

logical function omp_get_dynamic()

Возвращает значение true, если динамическое назначение количества потоков разрешено.

void omp_set_nested(int nested);

subroutine omp_set_nested(nested) integer nested

Разрешает или запрещает вложенный параллелизм. По умолчанию вложенный параллелизм запрещен.

int omp_get_nested(void);

logical function omp_get_nested()

Определяет, разрешен ли вложенный параллелизм.

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Сергей Лебедев
Сергей Лебедев
Россия
Паулус Шеетекела
Паулус Шеетекела
Россия, ТГТУ, 2010