Читать «Организация параллельных потоков. Часть 2» онлайн - страница 3

Валентин Юльевич Арьков

2.2. Многопоточность

Использование OpenMP проще всего изучать на компьютере с одним многоядерным процессором.

Чтобы сделать из последовательной программы параллельную, разработчику нужно добавить всего несколько строк. Компилятор может игнорировать директивы распараллеливания. В этом случае мы получаем исходную последовательную программу. Если настроить компилятор на использование OpenMP, он автоматически сгенерирует и скомпилирует параллельную программу.

В технологии OpenMP происходит динамическое создание потоков. В процессе работы программа может создавать и уничтожать дополнительные потоки (рис. 2.1). Такая модель условно называется «fork-join». Это означаетразделение программына несколько параллельных веток, выполнение работы параллельном режиме и последующее слияние в одну последовательную ветку.

Рис. 2.1. Модель распараллеливания fork-join

Задание. Изучите в Википедии статью «Fork join».

2.3. Термины OpenMP

В технологии OpenMP используют следующие понятия и термины.

Construct — Конструкция — директива и следующий за ней структурный блок команд (часть программы, ограниченная фигурными скобками).

Directive — Директива — строка, начинающаяся как #pragma omp и определяющая поведение программы.

Thread — Поток — часть программы, которая может выполняться последовательно на одном ядре.

Master thread — Главный поток — поток, который существует на протяжении всего времени выполнения процесса и который создаёт группу параллельных потоков (Team) при входе в параллельную область.

Team — Группа параллельных потоков — один или несколько потоков, которые участвуют в выполнении какой-либо конструкции языка.

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

Parallel region — Параллельная область — часть программы, которая может выполняться несколькими потоками.

Serial region — Последовательная область — часть программы, которая выполняется только главным потоком.

Переменные делятся на два вида — в зависимости от способа доступа:

Private — уникальная переменная, доступная только внутри потока.

Shared — общая переменная, доступная всем параллельным потокам в рамках одной группы.

2.4. Ответственность разработчика

Лёгкость распараллеливания оборачивается повышением ответственности программиста.

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

— Dependencies — зависимости по данным между параллельными потоками;

— Conflicts — конфликты доступа к данным;

— Deadlocks — тупиковые ситуации (взаимная блокировка);

— Race conditions — ситуация гонки за доступ к данным.

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

Ответственность за корректность составления программы лежит полностью на составителе программы. Все эти положения можно найти в тексте спецификации OpenMP.