Модель исполнения параллельной программы (OpenMP)
Автор: Kvazar • Ноябрь 3, 2023 • Лекция • 1,235 Слов (5 Страниц) • 105 Просмотры
Модель исполнения параллельной программы (OpenMP)
• ͙ при запуске программы создается главный поток, выполняющий впоследствии все последовательные области программы;
• ͙ программа содержит набор последовательных и параллельных областей (или секций или регионов);
• ͙ при входе в параллельную область главным потоком выполняется операция Fork, порождающая совокупность подчиненных потоков. Каждый поток имеет свой уникальный числовой идентификатор (главному потоку соответствует 0);
• ͙ потоки одного региона выполняют один и тот программный код (с точностью до возможных разветвлений), но каждый в идеале обрабатывает свои собственные данные. Если программный код региона представляет собой распараллеливаемый цикл, то разные потоки выполняют разные его итерации. Это распределение вычислительной работы между потоками и позволяет добиваться ускорения выполнения программы по сравнению с ее последовательным вариантом;
• ͙ при выходе из параллельной области всеми потоками выполняется операция Join. Завершается выполнение всех потоков, кроме главного.
[pic 1]
В модели памяти OpenMP все переменные, объявленные в программе вне фрагментов, выполняемых в качестве параллельных регионов, по умолчанию относятся к классу разделяемых, т.е. общедоступных для всех потоков. При выполнении параллельного региона, существуют участки, принадлежащие отдельным потокам и недоступные всем остальным – класс частной памяти. Частными являются:
- стек потока, доступ к элементам которого осуществляется неявным образом при вызове функции и возврате из них
- переменные, объявленные внутри структурного блока, исполняемого в качестве паралльного региона.
Компоненты реализации технологии OpenMP:
директивы компилятора – используются для создания потоков, распределения работы между потоками и синхронизации потоков;
библиотека функций – используется для получения и, возможно, модификации некоторых атрибутов потоков, а также для их синхронизации во время выполнения программы;
переменные окружения – используются администраторов системы для управления поведением параллельной программы.
Технология OpenMP создана и поддерживается для языков C, C++ и Fortran.
Если параллельную программу транслировать компилятором, не поддерживающим эту технологию, то результат будет построен в обычном последовательном (однопоточном) варианте.
При компиляции для платформы Windows с использованием Microsoft Visual Studio включить поддержку OpenMP можно, установив OpenMP support в свойствах проекта (Configuration properties\C/C++\language). Для компилятора gss для платформы Linux в командной строке указывается ключ –fopenmp.
Подключение библиотеки OpenMP в С/С++
#include <omp.h>
Формат записи директив:
#pragma omp <имя директивы> [ опция_1[опция_2, ...]]
Директива создания параллельного региона
#pragma omp parallel [ опция_1[опция_2, ...]]
<структурный блок>
С помощью опций этой директивы можно указать:
- требующееся количество потоков n (num_threads(n))
- условие, при истинности которого параллельный регион действительно создается (if(logical_expression)), например if(arraySize>100000);
- список общих переменных для всех потоков данного региона (shared(variables_list)), например shared(x, alpha, zeroCount)
- список общих переменных, которые должны стать частными в каждом потоке региона и получить неопределенные начальные значения (private(variables_list)), например private(k)
- список переменных, которые должны стать частными в каждом потоке региона и унаследовать значения из главного потока (firstprivate(variables_list)), например firstprivate(sum,ind)
- способ назначения класса памяти по умолчанию (default(shared|none)) всем переменным, используемым в регионе; слово none означает, что класс памяти всех не локальных переменных (т. е. не объявленных внутри структурного блока) должен быть задан явно опциями shared, private или firstprivate ; опция default ( shared ) может быть указана, но смысла это не имеет;
- список глобальных (объявленных вне всех функций) переменных программы ( copyin ( variables_list )), перечисленных в директиве threadprivate (см. подп. 3.3.5), значения которых сохраняются в момент выхода из одного параллельного региона и должны восстанавливаться в момент входа в данный регион;
- оператор сведения данных и список общих переменных reduction ( operator : variables_list ); для каждой указанной в списке переменной создаются локальные копии в каждом потоке; локальные копии инициализируются соответственно типу оператора (для аддитивных операций – ноль или его аналоги, для мультипликативных операций – единица и ее аналоги); над всеми локальными копиями каждой переменной после завершения параллельного региона будет выполнен заданный оператор сведения, результаты сведения будут занесены в одноименные общие переменные; в качестве оператора можно указывать арифметические и логические операции.
Опции в любой директиве не обязательны, если они записываются, то в произвольной последовательности и любом количестве, но смысл не должен быть противоречивым.
[pic 2]
Директива, требующая исполнения охваченного ею участка кода в точности одним потоком:
#pragma omp single [ опция_1[опция_2, ...]]
<структурный блок>
Опции директивы позволяют указать:
...