Организация параллельных потоков. Часть 2. Учебное пособие. Валентин Юльевич Арьков

Читать онлайн.



Скачать книгу

данных.

      Задание. Изучите в Википедии статьи «SIMD» и «Таксономия Флинна». Выясните, что такое SIMD.

      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 – ситуация гонки за доступ к данным.

      Как видим, все эти ситуации