Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Введение в openmp

Содержание

Н.Новгород,Введение в OpenMPОбзор технологии OpenMPДирективы OpenMPФормат, области видимости, типыОпределение параллельной областиУправление областью видимости данныхРаспределение вычислений между потокамиОперация редукцииСинхронизацияСовместимость директив и их параметровБиблиотека функций OpenMPПеременные окруженияИнформационные ресурсыСодержание
Введение в OpenMPпо материалам Гергеля В.П., Сысоева А.В.(Кафедра математического обеспечения ЭВМ, ННГУ)Кислицын Д.И. Н.Новгород,Введение в OpenMPОбзор технологии OpenMPДирективы OpenMPФормат, области видимости, типыОпределение параллельной областиУправление областью Интерфейс OpenMP задуман как стандарт параллельного программирования для многопроцессорных систем с общей OpenMP Fortran API v1.0 (1997)OpenMP C/C++ API v1.0 (1998)OpenMP Fortran API v2.0 Основания для достижения эффекта – разделяемые для параллельных процессов данные располагаются в Поэтапное (инкрементальное) распараллеливаниеМожно распараллеливать последовательные программы поэтапно, не меняя их структуруЕдинственность разрабатываемого Использование потоков (общее адресное пространство)Пульсирующий (“вилочный”, fork-join) параллелизмОбзор технологии OpenMP Принцип организации При выполнении обычного кода (вне параллельных областей) программа выполняется одним потоком (master Термины и понятия Параллельный фрагмент (parallel construct) – блок программы, управляемый директивой Набор директив компилятора Библиотека функцийНабор переменных окруженияИзложение материала будет проводиться на примере ФорматПримерПример показывает также, что для задания директивы может быть использовано несколько строк Определение параллельной областиРазделение работыСинхронизацияДирективы OpenMP Типы директивН.Новгород,Введение в OpenMP Директива parallel (основная директива OpenMP)Когда основной поток выполнения достигает директиву parallel, создается Пример использования директивы parallelДирективы OpenMP Определение параллельной области#include  #include  int Формат директивы parallelВозможные параметры (clause)Директивы OpenMP Определение параллельной области #pragma omp parallel Количество потоков (по убыванию старшинства)num_threads(N)omp_set_num_threads()OMP_NUM_THREADSЧисло, равное количеству процессоров, которое “видит” операционная системаПараметр Управление областью видимости обеспечивается при помощи параметров (clause) директив	   private, Параметр shared определяет список переменных, которые будут общими для всех потоков параллельной Начальные значения локальных переменных не определены, а конечные значения теряются при завершении Определение времени выполнения параллельной программыПолучение текущего момента времени выполнения фрагментов кода параллельных Существует 3 директивы для распределения вычислений в параллельной областиDO / for – Формат директивы forВозможные параметры (clause)Директивы OpenMP Распределение вычислений между потоками #pragma omp Распределение итераций в директиве for регулируется параметром (clause) schedulestatic – итерации делятся Пример использования директивы forДирективы OpenMP Распределение вычислений между потоками#include #include #define NMAX Н.Новгород,Введение в OpenMPПример динамического распределения итераций между потокамиДирективы OpenMP Распределение вычислений между Управление порядком выполнения вычисленийЕсли же для ряда действий в цикле необходимо сохранить Синхронизация вычислений по окончании выполнения циклаПо умолчанию, все потоки, прежде чем перейти Параметр reduction определяет список переменных, для которых выполняется операция редукцииперед выполнением параллельной Правила записи параметра reductionВозможный формат записи выражения	x = x op expr	x = Пример использования параметра reductionДирективы OpenMP Операция редукцииtotal = 0;#pragma omp parallel for #include #define NMAX 1000#define LIMIT 100main () {int i, j, sum;float a[NMAX][NMAX];#pragma Формат директивы sectionsВозможные параметры (clause)Директивы OpenMP Распределение вычислений между потоками #pragma omp Директива sections – распределение вычислений для раздельных фрагментов кода фрагменты выделяются при Пример использования директивы sectionsДирективы OpenMP Распределение вычислений между потокамиtotal = 0;#pragma omp Объединение директив parallel и for/sectionsДирективы OpenMP Распределение вычислений между потокамиН.Новгород,Введение в OpenMPtotal Формат директивы singleВозможные параметры (clause)Директивы OpenMP Распределение вычислений между потоками #pragma omp Директива master определяет фрагмент кода, который должен быть выполнен только основным потоком; Пример использования директивы criticalДирективы OpenMP Синхронизация #include  main() { Директива barrier – определяет точку синхронизации, которую должны достигнуть все процессы для Директива atomic – определяет переменную, доступ к которой (чтение/запись) должна быть выполнена Пример использования директивы atomicДирективы OpenMP Синхронизацияtotal = 0;#pragma omp parallel for shared(a) Директива flush – определяет точку синхронизации, в которой системой должно быть обеспечено Директивы OpenMP Совместимость директив и их параметровН.Новгород,Введение в OpenMP Сводный перечень директив OpenMPН.Новгород,Введение в OpenMP Сводный перечень директив OpenMPН.Новгород,Введение в OpenMP Сводный перечень параметров директив OpenMPН.Новгород,Введение в OpenMP Сводный перечень параметров директив OpenMPН.Новгород,Введение в OpenMP Позволяет назначить максимальное число потоков для использования в следующей параллельной области (если Возвращает номер потокаВозвращает число процессоров, доступных приложениюВозвращает true, если вызвана из параллельной Разрешение (dynamic=true) динамического режима и его отключение (dynamic=false)Возвращает true, если динамический режим OMP_SCHEDULE – определяет способ распределения итераций в цикле, если в директиве for Гергель В.П. Раздел
Слайды презентации

Слайд 2 Н.Новгород,
Введение в OpenMP

Обзор технологии OpenMP
Директивы OpenMP
Формат, области видимости,

Н.Новгород,Введение в OpenMPОбзор технологии OpenMPДирективы OpenMPФормат, области видимости, типыОпределение параллельной областиУправление

типы
Определение параллельной области
Управление областью видимости данных
Распределение вычислений между потоками
Операция

редукции
Синхронизация
Совместимость директив и их параметров
Библиотека функций OpenMP
Переменные окружения
Информационные ресурсы

Содержание


Слайд 3 Интерфейс OpenMP задуман как стандарт параллельного программирования для

Интерфейс OpenMP задуман как стандарт параллельного программирования для многопроцессорных систем с

многопроцессорных систем с общей памятью (SMP, NUMA, …)


Обзор

технологии OpenMP

В общем вид системы с общей памятью описываются в виде модели параллельного компьютера с произвольным доступом к памяти (parallel random-access machine – PRAM)

Н.Новгород,

Введение в OpenMP


Слайд 4 OpenMP Fortran API v1.0 (1997)
OpenMP C/C++ API v1.0

OpenMP Fortran API v1.0 (1997)OpenMP C/C++ API v1.0 (1998)OpenMP Fortran API

(1998)
OpenMP Fortran API v2.0 (2000)
OpenMP C/C++ API v2.0 (2002)
OpenMP

C/C++ API v2.5 (2005)

Разработкой стандарта занимается организация OpenMP Architecture Review Board, в которую вошли представители крупнейших компаний - разработчиков SMP-архитектур и программного обеспечения.

Обзор технологии OpenMP Динамика развития стандарта

Н.Новгород,

Введение в OpenMP


Слайд 5


Основания для достижения эффекта – разделяемые для параллельных

Основания для достижения эффекта – разделяемые для параллельных процессов данные располагаются

процессов данные располагаются в общей памяти и для организации

взаимодействия не требуется операций передачи сообщений.

Обзор технологии OpenMP

Н.Новгород,

Введение в OpenMP


Слайд 6 Поэтапное (инкрементальное) распараллеливание
Можно распараллеливать последовательные программы поэтапно, не

Поэтапное (инкрементальное) распараллеливаниеМожно распараллеливать последовательные программы поэтапно, не меняя их структуруЕдинственность

меняя их структуру
Единственность разрабатываемого кода
Нет необходимости поддерживать последовательный и

параллельный вариант программы, поскольку директивы игнорируются обычными компиляторами (в общем случае)
Эффективность
Учет и использование возможностей систем с общей памятью
Стандартизованность (переносимость), поддержка в наиболее распространенных языках (C/C++, Fortran) и платформах (Windows, Unix)

Обзор технологии OpenMP Положительные стороны

Н.Новгород,

Введение в OpenMP


Слайд 7 Использование потоков (общее адресное пространство)
Пульсирующий (“вилочный”, fork-join) параллелизм

Обзор

Использование потоков (общее адресное пространство)Пульсирующий (“вилочный”, fork-join) параллелизмОбзор технологии OpenMP Принцип

технологии OpenMP Принцип организации параллелизма
Параллельные области
Главный поток
Н.Новгород,
Введение в OpenMP


Слайд 8 При выполнении обычного кода (вне параллельных областей) программа

При выполнении обычного кода (вне параллельных областей) программа выполняется одним потоком

выполняется одним потоком (master thread)
При появлении директивы #parallel происходит

создание “команды” (team) потоков для параллельного выполнения вычислений
После выхода из области действия директивы #parallel происходит синхронизация, все потоки, кроме master, уничтожаются
Продолжается последовательное выполнение кода (до очередного появления директивы #parallel)

Обзор технологии OpenMP Принцип организации параллелизма

Н.Новгород,

Введение в OpenMP


Слайд 9 Термины и понятия
Параллельный фрагмент (parallel construct) –

Термины и понятия Параллельный фрагмент (parallel construct) – блок программы, управляемый

блок программы, управляемый директивой parallel; именно параллельные фрагменты ,

совместно с параллельными областями, представляют параллельно-выполняемую часть программы.
Параллельная область (parallel region) – параллельно выполняемые участки программного кода, динамически-возникающие в результате вызова функций из параллельных фрагментов.
Параллельная секция (parallel section) – часть параллельного фрагмента, выделяемая для параллельного выполнения при помощи директивы section.

Н.Новгород,

Введение в OpenMP


Слайд 10

Набор директив компилятора
Библиотека функций
Набор переменных окружения


Изложение материала

Набор директив компилятора Библиотека функцийНабор переменных окруженияИзложение материала будет проводиться на

будет проводиться на примере C/C++
Обзор технологии OpenMP Структура
Н.Новгород,
Введение в OpenMP


Слайд 11 Формат


Пример



Пример показывает также, что для задания директивы может

ФорматПримерПример показывает также, что для задания директивы может быть использовано несколько

быть использовано несколько строк программы – признаком наличия продолжения

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

Директивы OpenMP Формат записи директив

#pragma omp имя_директивы [clause,…]

#pragma omp parallel default(shared) \ private(beta,pi)

Н.Новгород,

Введение в OpenMP


Слайд 12

Определение параллельной области

Разделение работы

Синхронизация



Директивы OpenMP Типы директив
Н.Новгород,
Введение в OpenMP

Определение параллельной областиРазделение работыСинхронизацияДирективы OpenMP Типы директивН.Новгород,Введение в OpenMP

Слайд 13 Директива parallel (основная директива OpenMP)
Когда основной поток выполнения

Директива parallel (основная директива OpenMP)Когда основной поток выполнения достигает директиву parallel,

достигает директиву parallel, создается набор (team) потоков; входной поток

является основным потоком этого набора (master thread) и имеет номер 0
Код области дублируется или разделяется между потоками для параллельного выполнения
В конце области обеспечивается синхронизация потоков – выполняется ожидание завершения вычислений всех потоков; далее все потоки завершаются – дальнейшие вычисления продолжает выполнять только основной поток

Директивы OpenMP Определение параллельной области

Н.Новгород,

Введение в OpenMP


Слайд 14 Пример использования директивы parallel
Директивы OpenMP Определение параллельной области
#include

Пример использования директивы parallelДирективы OpenMP Определение параллельной области#include #include  int


#include
int main () {

int nthreads, tid;
// Создание параллельной области
#pragma omp parallel private(nthreads, tid)
{
// печать номера потока
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);
// Печать количества потоков – только master
if (tid == 0) {
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
} // Завершение параллельной области
}

Н.Новгород,

Введение в OpenMP


Слайд 15 Формат директивы parallel


Возможные параметры (clause)
Директивы OpenMP Определение параллельной области

Формат директивы parallelВозможные параметры (clause)Директивы OpenMP Определение параллельной области #pragma omp

#pragma omp parallel [clause ...] newline
structured_block
if

(scalar_expression)
num_threads(integer-expression)
private (list)
firstprivate (list)
default (shared | none)
shared (list)
copyin (list)
reduction (operator: list)

Н.Новгород,

Введение в OpenMP


Слайд 16
Количество потоков (по убыванию старшинства)
num_threads(N)
omp_set_num_threads()
OMP_NUM_THREADS
Число, равное количеству процессоров,

Количество потоков (по убыванию старшинства)num_threads(N)omp_set_num_threads()OMP_NUM_THREADSЧисло, равное количеству процессоров, которое “видит” операционная

которое “видит” операционная система
Параметр (clause) if – если условие

в if не выполняется, то процессы не создаются

Директивы OpenMP Определение параллельной области

Н.Новгород,

Введение в OpenMP


Слайд 17 Управление областью видимости обеспечивается при помощи параметров (clause)

Управление областью видимости обеспечивается при помощи параметров (clause) директив	  private,

директив
private, firstprivate, lastprivate, shared, reduction, …
которые

определяют, какие соотношения существуют между переменными последовательных и параллельных фрагментов выполняемой программы

Директивы OpenMP Управление областью видимости данных

Н.Новгород,

Введение в OpenMP


Слайд 18 Параметр shared определяет список переменных, которые будут общими

Параметр shared определяет список переменных, которые будут общими для всех потоков

для всех потоков параллельной области; правильность использования таких переменных

должна обеспечиваться программистом shared (list)
Параметр default может отменить действие правила по умолчанию (default(none)) или восстановить правило, что по умолчанию: переменные программы являются общими (default(shared)).
Параметр private определяет список переменных, которые будут локальными для каждого потока; переменные создаются в момент формирования потоков параллельной области; начальное значение переменных является неопределенным private (list)

Директивы OpenMP Управление областью видимости данных

Н.Новгород,

Введение в OpenMP


Слайд 19 Начальные значения локальных переменных не определены, а конечные

Начальные значения локальных переменных не определены, а конечные значения теряются при

значения теряются при завершении потоков
Параметр firstprivate позволяет создать локальные

переменные потоков, которые перед использованием инициализируются значениями исходных переменных
firstprivate (list)
Параметр lastprivate позволяет создать локальные переменные потоков, значения которых запоминаются в исходных переменных после завершения параллельной области (используются значения потока, выполнившего последнюю итерацию цикла или последнюю секцию)
lastprivate (list)

Директивы OpenMP Управление областью видимости данных

Н.Новгород,

Введение в OpenMP


Слайд 20 Определение времени выполнения параллельной программы
Получение текущего момента времени

Определение времени выполнения параллельной программыПолучение текущего момента времени выполнения фрагментов кода

выполнения фрагментов кода параллельных программ обеспечивается при помощи функции
double

omp_get_wtime(void)
Функция возвращает количество секунд, прошедших от некоторого определенного момента времени в прошлом.

double t1, t2, dt;
t1 = omp_get_wtime ();

t2 = omp_get_wtime ();
dt = t2 – t1;

Н.Новгород,

Введение в OpenMP


Слайд 21 Существует 3 директивы для распределения вычислений в параллельной

Существует 3 директивы для распределения вычислений в параллельной областиDO / for

области
DO / for – распараллеливание циклов
sections – распараллеливание раздельных

фрагментов кода (функциональное распараллеливание)
single – директива для указания последовательного выполнения кода

Начало выполнения директив по умолчанию не синхронизируется
Завершение директив по умолчанию является синхронным

Директивы OpenMP Распределение вычислений между потоками

Н.Новгород,

Введение в OpenMP


Слайд 22 Формат директивы for


Возможные параметры (clause)

Директивы OpenMP Распределение вычислений между

Формат директивы forВозможные параметры (clause)Директивы OpenMP Распределение вычислений между потоками #pragma

потоками
#pragma omp for [clause ...] newline
for

loop

private(list)
firstprivate(list)
lastprivate(list)
reduction(operator: list)
ordered
schedule(kind[, chunk_size])
nowait

Н.Новгород,

Введение в OpenMP


Слайд 23 Распределение итераций в директиве for регулируется параметром (clause)

Распределение итераций в директиве for регулируется параметром (clause) schedulestatic – итерации

schedule
static – итерации делятся на блоки по chunk итераций

и статически разделяются между потоками; если параметр chunk не определен, итерации делятся между потоками равномерно и непрерывно
dynamic – распределение итерационных блоков осуществляется динамически (по умолчанию chunk=1)
guided – размер итерационного блока уменьшается экспоненциально при каждом распределении; chunk определяет минимальный размер блока (по умолчанию chunk=1)
runtime – правило распределения определяется переменной OMP_SCHEDULE (при использовании runtime параметр chunk задаваться не должен) Так, например, для задания динамического способа при размере блока итераций 3, следует определить:
setenv OMP_SCHEDULE "dynamic,3"

Директивы OpenMP Распределение вычислений между потоками

Н.Новгород,

Введение в OpenMP


Слайд 24 Пример использования директивы for

Директивы OpenMP Распределение вычислений между потоками
#include

Пример использования директивы forДирективы OpenMP Распределение вычислений между потоками#include #include #define


#include
#define NMAX 100
int main (){
int

i, j;
double a[NMAX][NMAX], sum;
for (i=0; i < NMAX; i++)
for (j=0; j < NMAX; j++)
a[i][j] = (i+j);
#pragma omp parallel for shared(a) private(i,j,sum)
for (i=0; i < NMAX; i++) {
sum = 0;
for (j=0; j < NMAX; j++)
sum += a[i][j];
printf ("Summa of row elements %d is %f\n",i,sum);
} /* Завершение параллельного фрагмента */
}

Н.Новгород,

Введение в OpenMP


Слайд 25 Н.Новгород,
Введение в OpenMP

Пример динамического распределения итераций между потоками

Директивы

Н.Новгород,Введение в OpenMPПример динамического распределения итераций между потокамиДирективы OpenMP Распределение вычислений

OpenMP Распределение вычислений между потоками
#include
#include
#define NMAX 100
#define

CHUNK 10
int main (){
int i, j;
double a[NMAX][NMAX], sum;
for (i=0; i < NMAX; i++)
for (j=0; j < NMAX; j++)
a[i][j] = (i+j);
#pragma omp parallel for shared(a) private(i,j,sum) \
schedule (dynamic, CHUNK)
for (i=0; i < NMAX; i++) {
sum = 0;
for (j=i; j < NMAX; j++)
sum += a[i][j];
printf ("Summa of row elements %d is %f\n",i,sum);
} /* Завершение параллельного фрагмента */
}

Слайд 26 Управление порядком выполнения вычислений
Если же для ряда действий

Управление порядком выполнения вычисленийЕсли же для ряда действий в цикле необходимо

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

последовательному выполнению итераций в последовательной программе, то желаемого результата можно добиться при помощи директивы ordered (при этом для директивы for должен быть указан параметр ordered). Параметр ordered управляет порядком выполнения только тех действий, которые выделены директивой ordered.

Директивы OpenMP Распределение вычислений между потоками

#pragma omp parallel for shared(a) private(i,j,sum) \
schedule (dynamic, CHUNK) ordered
{
for (i=0; i < NMAX; i++) {
sum = 0;
for (j=i; j < NMAX; j++)
sum += a[i][j];
#pragma omp ordered
printf ("Сумма элементов строки %d равна %f\n",i,sum);
} /* Завершение параллельного фрагмента */

Н.Новгород,

Введение в OpenMP


Слайд 27 Синхронизация вычислений по окончании выполнения цикла
По умолчанию, все

Синхронизация вычислений по окончании выполнения циклаПо умолчанию, все потоки, прежде чем

потоки, прежде чем перейти к выполнению дальнейших вычислений, ожидают

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

Директивы OpenMP Распределение вычислений между потоками

Н.Новгород,

Введение в OpenMP


Слайд 28 Параметр reduction определяет список переменных, для которых выполняется

Параметр reduction определяет список переменных, для которых выполняется операция редукцииперед выполнением

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

копии этих переменных,
потоки формируют значения в своих локальных переменных
при завершении параллельной области над всеми локальными значениями выполняются необходимые операции редукции, результаты которых запоминаются в исходных (глобальных) переменных
reduction (operator: list)

Директивы OpenMP Операция редукции

Н.Новгород,

Введение в OpenMP


Слайд 29 Правила записи параметра reduction
Возможный формат записи выражения
x =

Правила записи параметра reductionВозможный формат записи выражения	x = x op expr	x

x op expr
x = expr op x
x binop =

expr
x++, ++x, x--, --x
x должна быть скалярной переменной
expr не должно ссылаться на x
op (operator) должна быть неперегруженной операцией вида
+, -, *, /, &, ^, |, &&, ||
binop должна быть неперегруженной операцией вида
+, -, *, /, &, ^, |

Директивы OpenMP Операция редукции

Н.Новгород,

Введение в OpenMP


Слайд 30 Пример использования параметра reduction
Директивы OpenMP Операция редукции
total = 0;
#pragma

Пример использования параметра reductionДирективы OpenMP Операция редукцииtotal = 0;#pragma omp parallel

omp parallel for shared(a) private(i,j,sum) \ reduction (+:total)
for (i=0;

i < NMAX; i++) {
sum = 0;
for (j=i; j < NMAX; j++)
sum += a[i][j];
printf ("Сумма элементов строки %d равна %f\n",i,sum);
total = total + sum;
} /* Завершение параллельного фрагмента */
printf ("Общая сумма элементов матрицы равна %f\n",total);

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

Н.Новгород,

Введение в OpenMP


Слайд 31 #include
#define NMAX 1000
#define LIMIT 100
main () {
int

#include #define NMAX 1000#define LIMIT 100main () {int i, j, sum;float

i, j, sum;
float a[NMAX][NMAX];

#pragma omp parallel for shared(a)

private(i,j,sum) \
if (NMAX>LIMIT)
{
for (i=0; i < NMAX; i++) {
sum = 0;
for (j=0; j < NMAX; j++)
sum += a[i][j];
printf ("Сумма элементов строки %d равна %f\n",i,sum);
} /* Завершение параллельного фрагмента */
}

Директивы OpenMP Распределение вычислений между потоками

Параметр if директивы parallel

Н.Новгород,

Введение в OpenMP


Слайд 32 Формат директивы sections





Возможные параметры (clause)

Директивы OpenMP Распределение вычислений между

Формат директивы sectionsВозможные параметры (clause)Директивы OpenMP Распределение вычислений между потоками #pragma

потоками
#pragma omp sections [clause ...] newline
{

#pragma omp section newline
structured_block
#pragma omp section newline
structured_block
}

private(list)
firstprivate(list)
lastprivate(list)
reduction(operator: list)
nowait

Н.Новгород,

Введение в OpenMP


Слайд 33 Директива sections – распределение вычислений для раздельных фрагментов

Директива sections – распределение вычислений для раздельных фрагментов кода фрагменты выделяются

кода
фрагменты выделяются при помощи директивы section
каждый фрагмент выполняется

однократно
разные фрагменты выполняются разными потоками
завершение директивы по умолчанию синхронизируется
директивы section должны использоваться только в статическом контексте

Директивы OpenMP Распределение вычислений между потоками

Н.Новгород,

Введение в OpenMP


Слайд 34 Пример использования директивы sections

Директивы OpenMP Распределение вычислений между потоками
total

Пример использования директивы sectionsДирективы OpenMP Распределение вычислений между потокамиtotal = 0;#pragma

= 0;
#pragma omp parallel shared(a,b) private(i,j)
{
#pragma omp sections
{

#pragma omp section
/* Вычисление сумм элементов строк и общей суммы */
for (i=0; i < NMAX; i++) {
sum = 0;
for (j=0; j < NMAX; j++)
sum += a[i][j];
printf ("Summa of row elements %d is %f\n",i,sum);
total = total + sum;
}
#pragma omp section
/* Копирование матрицы */
for (i=0; i < NMAX; i++)
for (j=0; j < NMAX; j++)
b[i][j] = a[i][j];
}
} /* Завершение параллельного фрагмента */
printf ("Total summa is %f\n",total);
}

Н.Новгород,

Введение в OpenMP


Слайд 35 Объединение директив parallel и for/sections
Директивы OpenMP Распределение вычислений между

Объединение директив parallel и for/sectionsДирективы OpenMP Распределение вычислений между потокамиН.Новгород,Введение в

потоками
Н.Новгород,
Введение в OpenMP

total = 0;
#pragma omp parallel sections shared(a,b)

private(i,j)
{
#pragma omp section
/* Вычисление сумм элементов строк и общей суммы */
for (i=0; i < NMAX; i++) {
sum = 0;
for (j=0; j < NMAX; j++)
sum += a[i][j];
printf ("Summa of row elements %d is %f\n",i,sum);
total = total + sum;
}
#pragma omp section
/* Копирование матрицы */
for (i=0; i < NMAX; i++)
for (j=0; j < NMAX; j++)
b[i][j] = a[i][j];
} /* Завершение параллельного фрагмента */
printf ("Total summa is %f\n",total);
}

Слайд 36 Формат директивы single


Возможные параметры (clause)

Директивы OpenMP Распределение вычислений между

Формат директивы singleВозможные параметры (clause)Директивы OpenMP Распределение вычислений между потоками #pragma

потоками
#pragma omp single [clause ...] newline
structured_block

private(list)
firstprivate(list)
copyprivate(list)
nowait

Директива single определяет блок параллельного фрагмента, который должен быть выполнен только одним потоком; все остальные потоки ожидают завершения выполнения данного блока (если не указан параметр nowait).

Н.Новгород,

Введение в OpenMP


Слайд 37 Директива master определяет фрагмент кода, который должен быть

Директива master определяет фрагмент кода, который должен быть выполнен только основным

выполнен только основным потоком; все остальные потоки пропускают данный

фрагмент кода (завершение директивы по умолчанию не синхронизируется)


Директива critical определяет фрагмент кода, который должен выполняться только одним потоком в каждый текущий момент времени (критическая секция)

Директивы OpenMP Синхронизация

#pragma omp master newline
structured_block

#pragma omp critical [name] newline
structured_block

Н.Новгород,

Введение в OpenMP


Слайд 38 Пример использования директивы critical
Директивы OpenMP Синхронизация
#include

Пример использования директивы criticalДирективы OpenMP Синхронизация #include  main() {

main() {
int x;
x

= 0;
#pragma omp parallel shared(x)
{
#pragma omp critical
x = x + 1;
} // end of parallel section
}

Н.Новгород,

Введение в OpenMP


Слайд 39 Директива barrier – определяет точку синхронизации, которую должны

Директива barrier – определяет точку синхронизации, которую должны достигнуть все процессы

достигнуть все процессы для продолжения вычислений (директива должны быть

вложена в блок)

Директивы OpenMP Синхронизация

#pragma omp barrier newline

Н.Новгород,

Введение в OpenMP


Слайд 40 Директива atomic – определяет переменную, доступ к которой

Директива atomic – определяет переменную, доступ к которой (чтение/запись) должна быть

(чтение/запись) должна быть выполнена как неделимая операция


Возможный формат записи

выражения expression
x binop = expr , x++, ++x, x--, --x
x должна быть скалярной переменной
expr не должно ссылаться на x
binop должна быть неперегруженной операцией вида
+, -, *, /, &, ^, |, >>, <<

Директивы OpenMP Синхронизация

#pragma omp atomic newline
expression

Н.Новгород,

Введение в OpenMP


Слайд 41 Пример использования директивы atomic
Директивы OpenMP Синхронизация
total = 0;
#pragma omp

Пример использования директивы atomicДирективы OpenMP Синхронизацияtotal = 0;#pragma omp parallel for

parallel for shared(a) private(i,j,sum)
for (i=0; i < NMAX;

i++) {
sum = 0;
for (j=0; j < NMAX; j++)
sum += a[i][j];
printf ("Summa of row elements %d is %f\n",i,sum);
#pragma omp atomic
total += sum;
} /* Завершение параллельного фрагмента */
printf ("Total summa is %f\n",total);

Н.Новгород,

Введение в OpenMP


Слайд 42 Директива flush – определяет точку синхронизации, в которой

Директива flush – определяет точку синхронизации, в которой системой должно быть

системой должно быть обеспечено единое для всех процессов состояние

памяти (т.е. если потоком какое-либо значение извлекалось из памяти для модификации, измененное значение обязательно должно быть записано в общую память)


Если указан список list, то восстанавливаются только указанные переменные
Директива flush неявным образом присутствует в директивах barrier, critical, ordered, parallel, for, sections, single

Директивы OpenMP Синхронизация

#pragma omp flush (list) newline

Н.Новгород,

Введение в OpenMP


Слайд 43 Директивы OpenMP Совместимость директив и их параметров
Н.Новгород,
Введение в OpenMP

Директивы OpenMP Совместимость директив и их параметровН.Новгород,Введение в OpenMP

Слайд 44 Сводный перечень директив OpenMP
Н.Новгород,
Введение в OpenMP

Сводный перечень директив OpenMPН.Новгород,Введение в OpenMP

Слайд 45 Сводный перечень директив OpenMP
Н.Новгород,
Введение в OpenMP

Сводный перечень директив OpenMPН.Новгород,Введение в OpenMP

Слайд 46 Сводный перечень параметров директив OpenMP
Н.Новгород,
Введение в OpenMP

Сводный перечень параметров директив OpenMPН.Новгород,Введение в OpenMP

Слайд 47 Сводный перечень параметров директив OpenMP
Н.Новгород,
Введение в OpenMP

Сводный перечень параметров директив OpenMPН.Новгород,Введение в OpenMP

Слайд 48 Позволяет назначить максимальное число потоков для использования в

Позволяет назначить максимальное число потоков для использования в следующей параллельной области

следующей параллельной области (если это число разрешено менять динамически).

Вызывается из последовательной области программы

Возвращает максимальное число потоков

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

Библиотека функций OpenMP

void omp_set_num_threads(int num_threads)

int omp_get_max_threads(void)

int omp_get_num_threads(void)

Н.Новгород,

Введение в OpenMP


Слайд 49 Возвращает номер потока

Возвращает число процессоров, доступных приложению

Возвращает true,

Возвращает номер потокаВозвращает число процессоров, доступных приложениюВозвращает true, если вызвана из

если вызвана из параллельной области программы

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

от некоторого определенного момента времени в прошлом

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

Библиотека функций OpenMP

int omp_get_thread_num(void)

int omp_get_num_procs(void)

int omp_in_parallel(void)

Н.Новгород,

Введение в OpenMP

double omp_get_wtime(void)

double omp_get_wtick(void)


Слайд 50 Разрешение (dynamic=true) динамического режима и его отключение (dynamic=false)

Возвращает

Разрешение (dynamic=true) динамического режима и его отключение (dynamic=false)Возвращает true, если динамический

true, если динамический режим разрешён


Разрешение (nested=true) вложенного параллелизма и

его отключение (nested=false)

Возвращает true, если вложенный параллелизм разрешён


Библиотека функций OpenMP

void omp_set_dynamic (int dynamic);

int omp_get_dynamic(void);

int omp_set_nested(int nested);

int omp_get_nested(void);

Н.Новгород,

Введение в OpenMP


Слайд 51 OMP_SCHEDULE – определяет способ распределения итераций в цикле,

OMP_SCHEDULE – определяет способ распределения итераций в цикле, если в директиве

если в директиве for использована клауза schedule(runtime)
OMP_NUM_THREADS – определяет

число нитей для исполнения параллельных областей приложения
OMP_DYNAMIC – разрешает или запрещает динамическое изменение числа нитей
OMP_NESTED – разрешает или запрещает вложенный параллелизм

Переменные окружения

Н.Новгород,

Введение в OpenMP


  • Имя файла: vvedenie-v-openmp.pptx
  • Количество просмотров: 139
  • Количество скачиваний: 0