ݺߣ

ݺߣShare a Scribd company logo
Основы распараллеливания
С/С++ программ при помощи OpenMP
Обо мне
• Преподаватель ОНПУ кафедры
Системного программного
обеспечения
• Основатель FlyElephant и
GeeksLab.
План
• Часть 1. Основы распараллеливания С/С++
программ при помощи OpenMP
• Часть 2. Знакомство с FlyElephant
История вычислительной техники
История вычислительной техники
Cray-1
1976 год
133 Мфлопса
История вычислительной техники
IBM POWER4
2001 год
2 ядра
История вычислительной техники
GPU и CUDA
2007 год
История вычислительной техники
Intel MIC - 2010 год
32 ядра
Ребрендинг в Xeon Phi
2012 год
61 ядро
~1 TFLOPS
Инфраструктура
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Модели параллельных программ
Вычислительные системы с общей памятью
Системы с распределенной памятью
Гибридные системы
Системы с общей памятью
• Преимущества:
• Не требуется обмен данными
• Просто писать программы
• Компактность систем
• Недостатки:
• Проблема совместного доступа к памяти
• Проблема синхронности кэшей
• Ограниченный обьем ОЗУ
• Проблема масштабируемости
Системы с распределённой памятью
• Преимущества:
• Простота и дешевизна построения
• Эффективное решение задач, требующих малого обмена данными
• Возможность решать задачи, требующие очень больших объёмов
оперативной памяти
• Возможность масштабирования
• Недостатки:
• Проблема обмена данными
• Сложное программирование
• Большой размер систем
• Большое энергопотребление
Гибридные системы
Инструментарий
OpenMP
Open Multi-Processing
MPI
Message Passing Interface
Hadoop
Spark
OpenMP
OpenMP (Open Multi-Processing)
открытый стандарт для распараллеливание
программ на языках С, С++ и Fortran.
http://openmp.org/
v1 - 1997 год GCC 4.1
v 4.0 - July 2013 Intel C++ Compiler
v 4.1 - в работе Visual C++
Преимущества OpenMP
• Лёгкость использования.
• Кросс-платформенность для систем с общей
памятью.
• Сокрытие низкоуровневых операций.
• Инкрементное распараллеливание.
• Поддержка параллельной и последовательной
версий программ.
Компоненты
• Переменные окружения.
• Директивы компилятора — расширения языков С/
C++ и Fortran.
• Функции.
Модель Fork-Join
master
thread
master
thread
master
thread
F FJ J
OpenMP и GCC
GCC v4.1
-openmp
g++ test.cpp -o test -fopenmp
#include<omp.h>
Переменные окружения
• OMP_NUM_THREADS - Устанавливает количество потоков
в параллельном блоке. По умолчанию, количество потоков
равно количеству виртуальных процессоров.
• OMP_SCHEDULE - Устанавливает тип распределения работ
в параллельных циклах с типом runtime.
• OMP_DYNAMIC - Разрешает или запрещает динамическое
изменение количества потоков, которые реально
используются для вычислений (в зависимости от загрузки
системы). Значение по умолчанию зависит от реализации.
• OMP_NESTED - Разрешает или запрещает вложенный
параллелизм (распараллеливание вложенных циклов). По
умолчанию – запрещено.
Директивы
Формат директивы (С/C ++)
#pragma omp < имя> [ <предложение> {[,] <предложение>}]
имя — имя директивы;
предложение — конструкция, задающая дополнительную
информацию и зависящая от директивы;
Директива parallel
#pragma omp parallel [<предложение>]
<структурный блок>
• Поток, встречающий конструкцию parallel, создаёт команду
потоков, становясь для неё основным.
• Потокам команды присваиваются уникальные целые номера,
начиная с 0 (основной поток).
• Каждый поток исполняет код, определяемый структурным
блоком, в конце которого неявно устанавливается барьер.
Директива parallel
#include <iostream>
#include <omp.h>
int main()
{
#pragma omp parallel
std::cout << "Hello, world!" << std::endl;
}
Директива for
#pragma omp for [<педложения>]
<циклы for>
Ограничения:
• (Единственный) счётчик — целого типа, указатель, или итератор
произвольного доступа. Должен изменяться только в заголовке цикла.
• Условие цикла: сравнение переменной с инвариантным к циклу
выражением при помощи <, <=, >, >=.
• Изменение счётчика: при помощи ++, --, i += d, i -= d, i = i + d, i = d +
i, i = i - d (d — инвариантное к циклу целое выражение)
Директива for
#pragma omp parallel
{
#pragma omp for
for (ptrdiff_t i = 0; i < n; i++)
dst[i] = sqrt(src[i]);
}
#pragma omp parallel for
#pragma omp parallel for
for (ptrdiff_t i = 0; i < n; i++)
dst[i] = sqrt(src[i]);
Другие директивы
single - если в параллельной области какой-либо участок кода должен быть
выполнен лишь один раз.
sections - используется для задания конечного (неитеративного)
параллелизма.
master - выделяет участок кода, который будет выполнен только нитью-
мастером.
critical - оформляется критическая секция программы. Критическая секция
запрещает одновременное исполнение структурированного блока более чем
одним потоком.
barrier - способ синхронизации, дает всем потокам указание ожидать друг
друга перед тем, как они продолжат выполнение за барьером.
Список OpenMP функций
• omp_set_num_threads Установить количество потоков
• omp_get_num_threads Вернуть количество потоков в группе
• omp_get_max_threads Максимальное количество потоков
• omp_get_thread_num ID потока
• omp_get_num_procs Максимальное количество процессоров
• omp_in_parallel В параллельном регионе?
• omp_set_dynamic Activate dynamic thread adjustment
• omp_get_dynamic Check for dynamic thread adjustment
• omp_set_nested Activate nested parallelism
• omp_get_nested Check for nested parallelism
• omp_get_wtime Вернуть время
• omp_get_wtick Number of seconds between clock ticks
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Platform for scientific computing
and data management
Какие могут быть задачи?
• Научные расчеты
• Анализ данных
• Рендеринг
• Моделирование
• Прогнозирование
• …
Problems
• Time-consuming deployment and support of the
elastic infrastructure.
• Complicated process of connection between the
large number of computing tools.
Solution
• Platform-as-a-Service that provides elastic multi-
core systems, HPC clusters and GPU clusters.
• Software, templates, algorithms and data available
at one place.
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Научный расчет. Как это работает в
реальной жизни
Научный расчет. Как это
работает у нас
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Функционал, который есть
сейчас
• загрузка файлов в хранилище;
• запуск вычислительных программ, написаных на С/С++,
которые будут выполняться с помощью компилятора GCC с
поддержкой OpenMP;
• виртуальные машины облака Azure с количеством ядер от 1
до 32 и ОЗУ до 448 ГБ;
• просмотр и скачивание файлов результатов расчета;
• биллинг, пополнение счета при помощи пластиковых карт и
промо-кодов.
Программа бета-
тестирования
• Получить бесплатный доступ
• Использовать новые функции первыми
• Помогать сделать FlyElephant лучше
http://flyelephant.net/beta/
Функционал, который ждет
нас в скором будущем
• Поддержка Python, R, Java и MPI.
• Система визуализации результатов
• Система управления результатами расчетов
• Внутренняя социальная сеть
• Система API
Отдельный интерфейс
для учебного процесса
Поддержка открытых
научных исследований
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
d.spodarets@flyelephant.net

flyelephant.net

More Related Content

Вебинар: Основы распараллеливания С++ программ при помощи OpenMP

  • 2. Обо мне • Преподаватель ОНПУ кафедры Системного программного обеспечения • Основатель FlyElephant и GeeksLab.
  • 3. План • Часть 1. Основы распараллеливания С/С++ программ при помощи OpenMP • Часть 2. Знакомство с FlyElephant
  • 8. История вычислительной техники Intel MIC - 2010 год 32 ядра Ребрендинг в Xeon Phi 2012 год 61 ядро ~1 TFLOPS
  • 11. Модели параллельных программ Вычислительные системы с общей памятью Системы с распределенной памятью Гибридные системы
  • 12. Системы с общей памятью • Преимущества: • Не требуется обмен данными • Просто писать программы • Компактность систем • Недостатки: • Проблема совместного доступа к памяти • Проблема синхронности кэшей • Ограниченный обьем ОЗУ • Проблема масштабируемости
  • 13. Системы с распределённой памятью • Преимущества: • Простота и дешевизна построения • Эффективное решение задач, требующих малого обмена данными • Возможность решать задачи, требующие очень больших объёмов оперативной памяти • Возможность масштабирования • Недостатки: • Проблема обмена данными • Сложное программирование • Большой размер систем • Большое энергопотребление
  • 17. OpenMP (Open Multi-Processing) открытый стандарт для распараллеливание программ на языках С, С++ и Fortran. http://openmp.org/ v1 - 1997 год GCC 4.1 v 4.0 - July 2013 Intel C++ Compiler v 4.1 - в работе Visual C++
  • 18. Преимущества OpenMP • Лёгкость использования. • Кросс-платформенность для систем с общей памятью. • Сокрытие низкоуровневых операций. • Инкрементное распараллеливание. • Поддержка параллельной и последовательной версий программ.
  • 19. Компоненты • Переменные окружения. • Директивы компилятора — расширения языков С/ C++ и Fortran. • Функции.
  • 21. OpenMP и GCC GCC v4.1 -openmp g++ test.cpp -o test -fopenmp #include<omp.h>
  • 22. Переменные окружения • OMP_NUM_THREADS - Устанавливает количество потоков в параллельном блоке. По умолчанию, количество потоков равно количеству виртуальных процессоров. • OMP_SCHEDULE - Устанавливает тип распределения работ в параллельных циклах с типом runtime. • OMP_DYNAMIC - Разрешает или запрещает динамическое изменение количества потоков, которые реально используются для вычислений (в зависимости от загрузки системы). Значение по умолчанию зависит от реализации. • OMP_NESTED - Разрешает или запрещает вложенный параллелизм (распараллеливание вложенных циклов). По умолчанию – запрещено.
  • 23. Директивы Формат директивы (С/C ++) #pragma omp < имя> [ <предложение> {[,] <предложение>}] имя — имя директивы; предложение — конструкция, задающая дополнительную информацию и зависящая от директивы;
  • 24. Директива parallel #pragma omp parallel [<предложение>] <структурный блок> • Поток, встречающий конструкцию parallel, создаёт команду потоков, становясь для неё основным. • Потокам команды присваиваются уникальные целые номера, начиная с 0 (основной поток). • Каждый поток исполняет код, определяемый структурным блоком, в конце которого неявно устанавливается барьер.
  • 25. Директива parallel #include <iostream> #include <omp.h> int main() { #pragma omp parallel std::cout << "Hello, world!" << std::endl; }
  • 26. Директива for #pragma omp for [<педложения>] <циклы for> Ограничения: • (Единственный) счётчик — целого типа, указатель, или итератор произвольного доступа. Должен изменяться только в заголовке цикла. • Условие цикла: сравнение переменной с инвариантным к циклу выражением при помощи <, <=, >, >=. • Изменение счётчика: при помощи ++, --, i += d, i -= d, i = i + d, i = d + i, i = i - d (d — инвариантное к циклу целое выражение)
  • 27. Директива for #pragma omp parallel { #pragma omp for for (ptrdiff_t i = 0; i < n; i++) dst[i] = sqrt(src[i]); }
  • 28. #pragma omp parallel for #pragma omp parallel for for (ptrdiff_t i = 0; i < n; i++) dst[i] = sqrt(src[i]);
  • 29. Другие директивы single - если в параллельной области какой-либо участок кода должен быть выполнен лишь один раз. sections - используется для задания конечного (неитеративного) параллелизма. master - выделяет участок кода, который будет выполнен только нитью- мастером. critical - оформляется критическая секция программы. Критическая секция запрещает одновременное исполнение структурированного блока более чем одним потоком. barrier - способ синхронизации, дает всем потокам указание ожидать друг друга перед тем, как они продолжат выполнение за барьером.
  • 30. Список OpenMP функций • omp_set_num_threads Установить количество потоков • omp_get_num_threads Вернуть количество потоков в группе • omp_get_max_threads Максимальное количество потоков • omp_get_thread_num ID потока • omp_get_num_procs Максимальное количество процессоров • omp_in_parallel В параллельном регионе? • omp_set_dynamic Activate dynamic thread adjustment • omp_get_dynamic Check for dynamic thread adjustment • omp_set_nested Activate nested parallelism • omp_get_nested Check for nested parallelism • omp_get_wtime Вернуть время • omp_get_wtick Number of seconds between clock ticks
  • 32. Platform for scientific computing and data management
  • 33. Какие могут быть задачи? • Научные расчеты • Анализ данных • Рендеринг • Моделирование • Прогнозирование • …
  • 34. Problems • Time-consuming deployment and support of the elastic infrastructure. • Complicated process of connection between the large number of computing tools.
  • 35. Solution • Platform-as-a-Service that provides elastic multi- core systems, HPC clusters and GPU clusters. • Software, templates, algorithms and data available at one place.
  • 37. Научный расчет. Как это работает в реальной жизни
  • 38. Научный расчет. Как это работает у нас
  • 40. Функционал, который есть сейчас • загрузка файлов в хранилище; • запуск вычислительных программ, написаных на С/С++, которые будут выполняться с помощью компилятора GCC с поддержкой OpenMP; • виртуальные машины облака Azure с количеством ядер от 1 до 32 и ОЗУ до 448 ГБ; • просмотр и скачивание файлов результатов расчета; • биллинг, пополнение счета при помощи пластиковых карт и промо-кодов.
  • 41. Программа бета- тестирования • Получить бесплатный доступ • Использовать новые функции первыми • Помогать сделать FlyElephant лучше http://flyelephant.net/beta/
  • 42. Функционал, который ждет нас в скором будущем • Поддержка Python, R, Java и MPI. • Система визуализации результатов • Система управления результатами расчетов • Внутренняя социальная сеть • Система API
  • 43. Отдельный интерфейс для учебного процесса Поддержка открытых научных исследований