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

Post on 18-May-2020

46 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

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

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

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

Назначение OpenMP

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

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

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

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

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

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

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

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

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

Начало

Назначение

Особенности 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).

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

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

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

Преобразование проекта для использования 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).

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

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

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

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

Настройка компилятора для использования 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).

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

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

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

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

Начало

Назначение

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

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

Проект 1

Проект 2

Проект 3

Проект 4

Проект 5

Проект 6

Запуск

Пример

Основы

Директивы

Функции

Блокировки

Заключение

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

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

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

Пример программы, использующей 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 △

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

. . . . . .

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

участок

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

участок

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

Начало

Основы

Модель

Потоки

Память

Отображение

Сброс 1

Сброс 2

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

Блок

Директивы

Область

Блокировки

Директивы

Функции

Блокировки

Заключение

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

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

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

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

Директивы OpenMP

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

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

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

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

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

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

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

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

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

Директива 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.

Пример использования директивы 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";

}

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

Начало

Основы

Директивы

Общий формат

parallel

Пример 1

Пример 2

Функции

Блокировки

Заключение

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

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

This is a thread in a parallel conctruct

This is a thread in a parallel conctruct

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

Функции OpenMP

Начало

Основы

Директивы

Функции

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

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

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

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

Предел

Блокировки

Заключение

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

Использование функций 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;

}

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

Начало

Основы

Директивы

Функции

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

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

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

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

Предел

Блокировки

Заключение

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

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

Processors: 2, Max threads: 2147483647

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

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().

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.

omp_get_max_threads()

Начало

Основы

Директивы

Функции

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

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

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

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

Предел

Блокировки

Заключение

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

int omp_get_max_threads(void);

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

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

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.

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

Начало

Основы

Директивы

Функции

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

Библиотека

Время

Потоки 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;

}

omp_get_num_procs()

Начало

Основы

Директивы

Функции

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

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

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

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

Предел

Блокировки

Заключение

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

int omp_get_num_procs(void);

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

omp_in_parallel()

Начало

Основы

Директивы

Функции

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

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

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

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

Предел

Блокировки

Заключение

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

int omp_in_parallel(void);

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

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-областей.

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;

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 значение второгопараметра не используется.

omp_get_thread_limit()

Начало

Основы

Директивы

Функции

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

Библиотека

Время

Потоки 1

Потоки 2

Потоки 3

Пример 1

Колич. ядер

Проверка

Режим

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

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

Предел

Блокировки

Заключение

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

int omp_get_thread_limit(void);

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

Блокировки OpenMP

Начало

Основы

Директивы

Функции

Блокировки

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

Уничтожение

Захват 1

Захват 2

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

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

Проверка 1

Проверка 2

Пример

Заключение

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

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 соответственно). После инициализациипеременные находятся в разблокированном состоянии.

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

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);

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

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

omp_set_lock()

Начало

Основы

Директивы

Функции

Блокировки

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

Уничтожение

Захват 1

Захват 2

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

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

Проверка 1

Проверка 2

Пример

Заключение

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

void omp_set_lock(omp_lock_t *pLock);

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

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

omp_set_nest_lock()

Начало

Основы

Директивы

Функции

Блокировки

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

Уничтожение

Захват 1

Захват 2

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

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

Проверка 1

Проверка 2

Пример

Заключение

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

void omp_set_nest_lock(omp_nest_lock_t *pLock);

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

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

omp_unset_lock()

Начало

Основы

Директивы

Функции

Блокировки

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

Уничтожение

Захват 1

Захват 2

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

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

Проверка 1

Проверка 2

Пример

Заключение

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

void omp_unset_lock(omp_lock_t *pLock);

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

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

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, переводитпеременную блокировки в разблокированное состояние.После этого один из потоков, ожидавших разблокировкипеременной, прекращает ожидание и захватывает её.

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

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). Еслизахват блокировки произошёл успешно, возвращает истину(ненулевое значение).

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

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. Еслизахват блокировки произошёл успешно, возвращает текущеезначение счётчика блокировок переменной.

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

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

Начало

Основы

Директивы

Функции

Блокировки

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

Уничтожение

Захват 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);

// . . .}

Заключение

Начало

Основы

Директивы

Функции

Блокировки

Заключение

Литература

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

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

Начало

Основы

Директивы

Функции

Блокировки

Заключение

Литература

Практикум №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/

top related