56
Практикум №5 Введение в программный интерфейс OpenMP – 1 / 56 Введение в программный интерфейс OpenMP С/к. «Параллельное программирование» мехмат, IV курс, группа 11

Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Практикум №5 Введение в программный интерфейс OpenMP – 1 / 56

Введение в программный интерфейс OpenMP

С/к. «Параллельное программирование»

мехмат, IV курс, группа 11

Page 2: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Начало работы с OpenMP

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 2 / 56

Page 3: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Назначение OpenMP

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 3 / 56

OpenMP (Open Multi-Processing) — программный интерфейсдля создания многопоточных приложений намногопроцессорных системах с разделяемой (общей)памятью.

Включает в себя следующие компоненты:

✔ директивы компилятора (расширения языков С/C++

и Fortran — требуется поддержка со стороныкомпилятора);

✔ библиотечные функции;

✔ переменные среды.

Page 4: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Особенности (преимущества) OpenMP

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 4 / 56

✔ Является кросс-платформенным для множествапараллельных архитектур с общей памятью.

✔ В отличие от библиотек управления потоками(Pthreads, Windows API и т. д.) позволяет скрыть отпрограммиста многие низкоуровневые операции,связанные с созданием потоков, распределениемвычислительной нагрузки и т. д.

✔ Позволяет выполнять инкрементное

распараллеливание: постепенное преобразованиеотдельных участков последовательной программы, безеё радикальных изменений.

Page 5: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Особенности (преимущества) OpenMP (окончание)

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 5 / 56

✔ Позволяет поддерживать создание параллельнойи последовательной версий программы на основе однихи тех же исходных текстов.

Page 6: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Создание проекта программы

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 6 / 56

Чтобы создать проект программы, использующей OpenMP,необходимо выполнить следующие действия:

1. Создать проект приложения для платформы Win32,например, консольного. Для этого необходимо в средеMicrosoft Visual Studio выбрать в меню команду File →

New → Project. . . , указать тип проекта (Project Types)как Visual C++ → Win32 и в поле шаблонов(Templates) выбрать шаблон Win32 Console Application(консольное приложение Win32, см. рис. 1).

Page 7: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Создание проекта программы (окончание)

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 7 / 56

Рис. 1: Создание консольного проекта для платформы Win32

Page 8: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Преобразование проекта для использования Intel C++

Compiler

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 8 / 56

2. Преобразовать проект для использования в нёмкомпилятора Intel C++ Compiler. Для этого необходимов среде Microsoft Visual Studio в окне Solution Explorerвыбрать созданный проект и в контекстном меню(вызываемом по правой кнопке мыши) выбратькоманду Use Intel(R) C++ (см. рис. 2).

Page 9: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Преобразование проекта для использования Intel C++

Compiler (окончание)

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 9 / 56

Рис. 2: Преобразование проекта

Page 10: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Настройка компилятора для использования OpenMP

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 10 / 56

3. Включить использование OpenMP в настройкахкомпилятора для проекта. Для этого необходимов свойствах проекта (Project → Properties) выбратьв поле Configuration (конфигурация) All Configurations(все конфигурации) и затем в настройках языка(Configuration Properties → C/C++ → Language) в полеOpenMP Support (поддержка OpenMP) выбратьнастройку Generate Parallel Code (/openmp, equiv. to/Qopenmp) (генерировать параллельный код — см.рис. 4).

Page 11: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Настройка компилятора для использования OpenMP(окончание)

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 11 / 56

Рис. 3: Включение OpenMP в настройках компилятора

Page 12: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Настройка количества потоков

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 12 / 56

Замечание: чтобы явно задать количество потоков, накоторые будет распараллеливаться скомпилированнаяпрограмма, использующая OpenMP, его можно указать припомощи переменной среды OMP_NUM_THREADS. △

Рис. 4: Настройка переменной среды, определяющей количе-ство потоков

Page 13: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Пример программы, использующей OpenMP

Начало

Назначение

Особенности 1

Особенности 2

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 13 / 56

Замечание: Пример openmp_sample.c, поставляемый вместес компилятором Intel C++ Compiler, находится в каталогеC:\Program_Files\Intel\Compiler\C++\10.1.

022\samples\openmp_samples △

Page 14: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Основные концепции OpenMP

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 14 / 56

Page 15: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Модель исполнения программы

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 15 / 56

. . . . . .

последовательный

участок

параллельный

участок

начало развилка слияние конец

основной поток

Рис. 5: Концепция многопоточного параллелизма

Реализуется модель многопоточного параллелизма (рис. 5),по которой программа состоит из чередующихсяпоследовательных и параллельных участков.

Page 16: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Разветвление/слияние потоков

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 16 / 56

✔ В точке программы «развилка» основной поток

порождает несколько вспомогательных (т. н. команда

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

✔ В точке «слияние» основной поток ожидаетзавершения вспомогательных, после чего продолжаетвыполнять следующий последовательный участок.

Замечание: каждый из вспомогательных потоков может,в свою очередь, порождать собственную команду потоков,являясь для неё «основным». Основной поток программы,с создания которого началось её исполнение, в даннойтерминологии называется начальным (initial). △

Page 17: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Взаимодействие потоков с памятью

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 17 / 56

✔ Все потоки имеют доступ к переменным, находящимсяв общей памяти.

✔ Кроме этого, каждый поток имеет доступ к собственнойпамяти, недоступной для остальных потоков.

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

✔ Операции записи в общую память не являютсяатомарными в общем случае и могут вызвать гонку

за данными (data race).

Page 18: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Локальное отображение общей памяти

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 18 / 56

✔ Поток может иметь доступ к общей памяти(на чтение/запись) через некоторое его локальное

отображение (быстродействующий кэш и т. п. —зависит от реализации).

✔ Постоянная согласованность общей памяти с еёлокальным отображением не требуется.

✔ Операция сброса (flush) предназначена длясогласования содержимого локального отображенияс общей памятью — выполняется в определённыхучастках программы, а также в местах, задаваемыхявно средствами OpenMP.

Page 19: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Поведение операции сброса отображения

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 19 / 56

✔ Операция применяется к заданному наборупеременных.

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

✔ Если поток записал значение в переменную, тоследующая после него операция сброса не завершаетсядо записи этого значения в общую память.

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

Page 20: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Поведение операции сброса отображения (окончание)

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 20 / 56

✔ Операция сброса уничтожает локальное отображениепеременной, таким образом, последующее её чтениепотоком приводит к её считыванию напрямую из общейпамяти (в результате чего может заново создасться еёлокальное отображение).

✔ Следующие после сброса переменной операции доступак ней в текущем потоке не могут начаться дозавершения сброса.

✔ После завершения операции сброса заданного наборапеременных результаты всех операций записи в нихтекущим потоком становятся видны остальнымпотокам.

Page 21: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Синхронизация записи/чтения

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 21 / 56

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

1. Значение записывается в переменную первым потоком.

2. Переменная сбрасывается первым потоком.

3. Переменная сбрасывается вторым потоком.

4. Значение считывается из переменной вторым потоком.

Замечание: соблюдение заданного порядка гарантируетсяоперациями синхронизации OpenMP. △

Page 22: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Структурный блок программы

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 22 / 56

Структурный блок программы (structured block) —исполняемый оператор (возможно, составной)с единственной точкой входа в начале и единственнойточкой выхода в конце, либо конструкция OpenMP.

Конструкция OpenMP (construct) — исполняемая директива

OpenMP вместе со связанным структурным блоком(если он есть), не включая кода вызываемыхподпрограмм.

Page 23: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Исполняемые/декларативные директивы OpenMP

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 23 / 56

Исполняемая директива OpenMP — директива OpenMP,имеющая связанный с ней исполняемыйпользовательский код.

Декларативная директива OpenMP — директива OpenMP,имеющая связанные с ней пользовательскиеобъявления, но не исполняемый код.

Замечание: на настоящее время (OpenMP 3.0)декларативной является только директива threadprivate. Всеостальные директивы являются исполняемыми. △

Page 24: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Связанная область

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 24 / 56

Область (region) — весь код, исполнявшийся при выполнениизаданной конструкции или функции OpenMP (т. е.,область включает все вызываемые подпрограммы,а также неявный код, добавленный реализациейOpenMP).

Связанная область (binding region) — для заданнойобласти — охватывающая её область, котораяопределяет для неё контекст исполнения и определяетграницы её воздействия.

Page 25: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Операции блокировки в OpenMP

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 25 / 56

В состав OpenMP входит набор функций (см. с. 46),предназначенных для блокировки общих ресурсов с цельюсинхронизации. Поддерживаются следующие типыблокировок:

Простая блокировка (simple lock) — не может быть повторнозахвачена владеющим потоком.

Вложенная блокировка (nested lock) — может быть повторнозахвачена владеющим потоком. Для освобождениятребуется вызов функции разблокировки в таком жеколичестве, сколько раз была произведена блокировка.

Page 26: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Директивы OpenMP

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 26 / 56

Page 27: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Общий формат директивы OpenMP

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 27 / 56

В С/C++ директивы OpenMP записываются при помощидиректив компилятора #pragma:

#pragma omp 〈имя〉 [〈предложение〉 {[, ] 〈предложение〉} ] 〈ø〉имя — имя директивы;предложение — конструкция, задающая дополнитель-

ную информацию и зависящая от ди-рективы;ø — конец строки (в дальнейшем не указы-вается).

Большинство директив OpenMP связываются со следующимза ними структурным блоком.

Page 28: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Директива parallel

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 28 / 56

#pragma omp parallel [〈предложения〉 ]〈структурный блок〉

Поток, встречающий конструкцию parallel, создаёт командупотоков, становясь для неё основным. Потокам командыприсваиваются уникальные целые номера, начиная с 0(основной поток), возвращаемые функциейomp_get_thread_num(). Каждый поток исполняет код,определяемый структурным блоком, в конце которогонеявно устанавливается барьер.Предложения: if, num_threads, default, private, firstprivate,shared, copyin, reduction.

Page 29: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Пример использования директивы parallel

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 29 / 56

#include <iostream>

int main()

{

#pragma omp parallel

std::cout << "This is a thread in a parallel conctruct\n";

}

Page 30: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Пример использования директивы parallel (окончание)

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 30 / 56

Результатом работы программы может быть следующийвывод:

This is a thread in a parallel conctruct

This is a thread in a parallel conctruct

Замечание: символы, выводимые разными потокамина консоль, могут быть перемешаны друг с другомв произвольном порядке. △

Page 31: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Функции OpenMP

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 31 / 56

Page 32: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Использование функций OpenMP

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 32 / 56

В С/C++ объявления функций OpenMP приведеныв заголовочном файле <omp.h>, который входит в составкомпилятора, поддерживающего расширения OpenMP:

#include <iostream>

#include <omp.h>

int main()

{

std::cout

<< "Processors: " << omp_get_num_procs()

<< ", Max threads: " << omp_get_thread_limit()

<< std::endl;

}

Page 33: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

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

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 33 / 56

Пример вывода приведённой программы на системе с двумяядрами:

Processors: 2, Max threads: 2147483647

Замечание: В некоторых реализациях также требуетсяподключение библиотеки, реализующей функции OpenMP,на этапе сборки. Например, в составе gcc версии 4.2 такойбиблиотекой является libgomp.a. △

Page 34: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_wtime(), omp_get_wtick()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 34 / 56

double omp_get_wtime(void);

Возвращает время в секундах, прошедшее с некоторогофиксированного момента «в прошлом». Значение являетсялокальным по отношению к текущему потоку.

double omp_get_wtick(void);

Возвращает точность в секундах времени, возвращаемогофункцией omp_get_wtime().

Page 35: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_num_threads(), omp_set_num_threads()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 35 / 56

int omp_get_num_threads(void);

Возвращает количество потоков команды, исполняющейобласть, порождённую директивой parallel, с которойсвязана область данной функции. При вызове изпоследовательного участка программы возвращает 1.

void omp_set_num_threads(int nNumThreads);

Устанавливает количество потоков, используемыхпоследующими parallel-областями, не использующимипредложения num_threads.

Page 36: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_max_threads()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 36 / 56

int omp_get_max_threads(void);

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

Замечание: данная функция может быть использована длясоздания в динамической памяти массива достаточногоразмера для хранения данных для всех потоков командыпоследующей parallel-области. △

Page 37: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_thread_num()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 37 / 56

int omp_get_thread_num(void);

Возвращает номер потока в команде, исполняющейparallel-область, которая связана с областью даннойфункции. Возвращаемое значение находится в диапазонеот 0 до omp_get_num_threads() − 1.

Page 38: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Пример: заполнение массива потоками

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 38 / 56

int main()

{

std::vector <int> v(omp_get_max_threads());

#pragma omp parallel

{

int nSize = omp_get_num_threads();

int nRank = omp_get_thread_num();

v[nRank] = 1 + nRank;

if (0 == nRank && nSize < v.size())

v[nSize] = ­1;

}

std::copy(

v.begin(), v.end(),

std::ostream_iterator <int> (std::cout, " "));

std::cout << std::endl;

}

Page 39: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_num_procs()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 39 / 56

int omp_get_num_procs(void);

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

Page 40: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_in_parallel()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 40 / 56

int omp_in_parallel(void);

Возвращает истину (ненулевое значение), если вызовокружён активной parallel-областью, иначе — ложь (0).

Page 41: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_dynamic(), omp_set_dynamic()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 41 / 56

int omp_get_dynamic(void);

Возвращает истину (ненулевое значение), если установленрежим динамической подстройки количества потоков.

void omp_set_dynamic(int bUseDynamic);

Включает/отключает режим динамической подстройкиколичества потоков, доступного для исполненияпоследующих parallel-областей.

Page 42: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_schedule()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 42 / 56

void omp_get_schedule(omp_sched_t *pKind, int *pnModifier);

Возвращает для связанной с вызовом функцииparallel-областью тип планирования задач (*pKind) и размерпорции данных (*pnModifier). Тип omp_sched_t описан как

typedef enum omp_sched_t

{

omp_sched_static = 1,

omp_sched_dynamic = 2,

omp_sched_guided = 3,

omp_sched_auto = 4

} omp_sched_t;

Page 43: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_set_schedule()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 43 / 56

void omp_set_schedule(omp_sched_t nKind, int nModifier);

Устанавливает тип планирования задач (nKind) и размерпорции данных (nModifier). При указании в качестве первогопараметра значения omp_sched_auto значение второгопараметра не используется.

Page 44: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_get_thread_limit()

Начало

Основы

Директивы

Функции

Использование

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

Планирование 1

Планирование 2

Предел

Блокировки

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 44 / 56

int omp_get_thread_limit(void);

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

Page 45: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Блокировки OpenMP

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 45 / 56

Page 46: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_init_lock(), omp_init_nest_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 46 / 56

void omp_init_lock(omp_lock_t *pLock);

void omp_init_nest_lock(omp_nest_lock_t *pLock);

Инициализируют переменные блокировки (типа omp_lock_t

и omp_nest_lock_t соответственно). После инициализациипеременные находятся в разблокированном состоянии.

Замечание: перед вызовом переменные блокировки должныбыть в неинициализированном состоянии. △

Page 47: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_destroy_lock(), omp_destroy_nest_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 47 / 56

void omp_destroy_lock(omp_lock_t *pLock);

void omp_destroy_nest_lock(omp_nest_lock_t *pLock);

Освобождают ресурсы, связанные с переменнымиблокировки, переводя их в неинициализированное состояние.

Замечание: перед вызовом переменные блокировки должныбыть в разблокированном состоянии. △

Page 48: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_set_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 48 / 56

void omp_set_lock(omp_lock_t *pLock);

Вызов функций приостанавливает вызывающий поток домомента, когда переменная блокировки будет переведенав разблокированное состояние. После этого вызов функциипереводит переменную в состояние заблокированноститекущим потоком.

Замечание: перед вызовом переменная должна бытьв разблокированном состоянии. △

Page 49: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_set_nest_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 49 / 56

void omp_set_nest_lock(omp_nest_lock_t *pLock);

Вызов функций приостанавливает вызывающий поток домомента, когда переменная блокировки будет переведенав разблокированное состояние. Если переменная былазаблокирована текущим потоком, ожидания не происходит.После этого вызов функции переводит переменнуюв состояние заблокированности текущим потоком, при этомсчётчик её блокировок увеличивается.

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

Page 50: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_unset_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 50 / 56

void omp_unset_lock(omp_lock_t *pLock);

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

Замечание: перед вызовом переменная должна бытьзаблокирована текущим потоком. △

Page 51: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_unset_nest_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 51 / 56

void omp_unset_nest_lock(omp_nest_lock_t *pLock);

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

Замечание: перед вызовом переменная должна бытьзаблокирована текущим потоком. △

Page 52: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_test_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 52 / 56

int omp_test_lock(omp_lock_t *pLock);

Производит попытку блокировки переменной аналогичновызову omp_set_lock(), однако в отличие от неёне приостанавливает выполнения текущего потока в случаееё захвата другим потоком, а возвращает ложь (0). Еслизахват блокировки произошёл успешно, возвращает истину(ненулевое значение).

Замечание: перед вызовом переменная должна бытьв разблокированном состоянии, либо захвачена другимпотоком. △

Page 53: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

omp_test_nest_lock()

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 53 / 56

int omp_test_nest_lock(omp_lock_t *pLock);

Производит попытку блокировки переменной аналогичновызову omp_set_nest_lock(), однако в отличие от неёне приостанавливает выполнения текущего потока в случаееё захвата другим потоком, а возвращает значение 0. Еслизахват блокировки произошёл успешно, возвращает текущеезначение счётчика блокировок переменной.

Замечание: перед вызовом переменная должна бытьв разблокированном, либо заблокированном состоянии. △

Page 54: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Пример использования блокировок

Начало

Основы

Директивы

Функции

Блокировки

Инициализация

Уничтожение

Захват 1

Захват 2

Освобождение 1

Освобождение 2

Проверка 1

Проверка 2

Пример

Заключение

Практикум №5 Введение в программный интерфейс OpenMP – 54 / 56

int main()

{

std::queue <int> q;

omp_lock_t lock;

omp_init_lock(&lock);

#pragma omp parallel

{

int nRank = omp_get_thread_num();

omp_set_lock(&lock);

q.push(1 + nRank);

omp_unset_lock(&lock);

}

omp_destroy_lock(&lock);

// . . .}

Page 55: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Заключение

Начало

Основы

Директивы

Функции

Блокировки

Заключение

Литература

Практикум №5 Введение в программный интерфейс OpenMP – 55 / 56

Page 56: Введение в программный интерфейс OpenMPstaff.mmcs.sfedu.ru/~dubrov/files/tut_parallel_05_openmp.pdfисполняемый оператор (возможно,

Список литературы

Начало

Основы

Директивы

Функции

Блокировки

Заключение

Литература

Практикум №5 Введение в программный интерфейс OpenMP – 56 / 56

[1] Савельев В. А. Методические указания на тему:«Параллельное программирование: OpenMP API». —Ростов-на-Дону, Издательство РГУ, 2006. — 32 с.

[2] Akhter S., Roberts J. Multi-Core Programming. IncreasingPerformance through Software Multi-threading — IntelPress, 2006. — 336 pp.

[3] http://www.openmp.org/