Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский политехнический университет
Параллельные вычисления Параллельные вычисления - это процессы обработки данных, в которых одновременно могут выполняться несколько операций компьютерной системы Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 2
Цели параллельных вычислений Сокращение времени исполнения Повышение конфигурируемости Возможно лучшая отказоустойчивость Научный интерес Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 3
Достижение параллелизма Достижение параллелизма возможно только при выполнимости следующих требований: независимость функционирования отдельных устройств ЭВМ (устройства ввода-вывода, обрабатывающие процессоры и устройства памяти), избыточность элементов вычислительной системы использование специализированных устройств (например, отдельные процессоры для целочисленной и вещественной арифметики, устройства многоуровневой памяти), дублирование устройств ЭВМ (например, использование нескольких однотипных обрабатывающих процессоров или нескольких устройств оперативной памяти) Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 4
Достижение параллелизма Возможные режимы выполнения независимых частей программы: многозадачный режим (режим разделения времени), при котором для выполнения нескольких процессов используется единственный процессор, параллельное выполнение, когда в один и тот же момент времени может выполняться несколько команд обработки данных, распределенные вычисления, при которых для параллельной обработки данных используется несколько обрабатывающих устройств, достаточно удаленных друг от друга, а передача данных по линиям связи приводит к существенным временным задержкам. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 5
Классификация вычислительных систем Систематика Флинна … Классификация по способам взаимодействия последовательностей (потоков) выполняемых команд и обрабатываемых данных: SISD (одиночный поток команд одиночный поток данных) SIMD (одиночный поток команд множественный поток данных) MISD (множественный поток команд одиночный поток данных) MIMD (множественный поток команд множественный поток данных) Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 6
Структура ЭВМ с индивидуальной памятью Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 7
Структура ЭВМ с разделяемой памятью Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 8
OpenMP Набор директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с разделяемой памятью на языках С, С++, Fortran Разработкой стандарта занимается некоммерческая организация OpenMP ARB в которую вошли представители крупнейших компаний – разработчиков SMP-архитектур Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 9
Модель параллельной программы Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. OpenMP реализует параллельные вычисления с помощью многопоточности, в которой «главный» поток создает набор подчиненных потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами (количество процессоров не обязательно должно быть больше или равно числу потоков) 10
Пример простой программы Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. #include void main() { omp_set_num_threads( 2 ); #pragma omp parallel { cout
Разделение работы в параллельном регионе void main() { const int n = 100; int a[n]; omp_set_num_threads( 2 ); #pragma omp parallel { #pragma omp for for (int i=0; i
Изменение числа нитей void main() { omp_set_num_threads(2); #pragma omp parallel num_threads(3) { cout
Директива single void main() { omp_set_num_threads(3); #pragma omp parallel { cout
Директива master void mode() { if(omp_in_parallel()) cout
Разделяемые и локальные переменные Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. В OpenMP переменные в параллельных областях программы разделяются на два основных класса: Shared Разделяемые (общие); все нити видят одну и ту же переменную; Private Локальные; каждая нить видит свой экземпляр данной переменной. По умолчанию переменные – разделяемые 16
Использование клаузы private int f(int a) { return a*a-10*a-50; } void main() { const int n = 100; int a[n], t; omp_set_num_threads( 2 ); #pragma omp parallel { #pragma omp for private (t) for (int i=0; i
Пример: локальные переменные omp_set_num_threads( 3 ); int i = 1; cout
Пример void main() { int mId, nthreads; omp_set_num_threads( 2 ); #pragma omp parallel private(mId, nthreads) { mId = omp_get_thread_num(); nthreads=omp_get_num_threads(); cout
Использование опции firstprivate() omp_set_num_threads( 2); int n=10; cout
Использование опции copyprivate() omp_set_num_threads(5); int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); cout
Пример: разделяемые переменные omp_set_num_threads( 3 ); int i = 1; cout
Опция reduction Опция reduction(оператор:список) задаёт оператор и список общих переменных; для каждой переменной создаются локальные копии в каждой нити; локальные копии инициализируются соответственно типу оператора над локальными копиями переменных после выполнения всех операторов параллельной области выполняется заданный оператор Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. Список возможных операторов: +, *, -, &, |, &&, || 23
Пример void main() { omp_set_num_threads(2); int count = 0; #pragma omp parallel reduction (+: count) { count++; cout
Вычисление числа π Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 4.0 (1+x 2 ) dx = 0 1 F(x i ) x i = 0 N Мы можем аппроксимировать интеграл как сумму прямоугольников: Где каждый прямоугольник имеет ширину x и высоту F(x i ) в середине интервала F(x) = 4.0/(1+x 2 ) X
Вычисление числа π (последовательная реализация Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. #include void main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; for (i = 1; i
Вычисление числа π (реализация с помощью OpenMP) Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. #include void main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; #pragma omp parallel for reduction(+:sum) private(x) for (i = 1; i