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

45
Основы распараллеливания С/С++ программ при помощи OpenMP

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

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

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

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

Обо мне

• Преподаватель ОНПУ кафедры Системного программного обеспечения

• Основатель FlyElephant и GeeksLab.

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

План• Часть 1. Основы распараллеливания С/С++ программ при помощи OpenMP

• Часть 2. Знакомство с FlyElephant

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

История вычислительной техники

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

История вычислительной техники

Cray-1

1976 год

133 Мфлопса

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

История вычислительной техники

IBM POWER4

2001 год

2 ядра

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

История вычислительной техники

GPU и CUDA

2007 год

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

История вычислительной техники

Intel MIC - 2010 год32 ядра

Ребрендинг в Xeon Phi2012 год61 ядро

~1 TFLOPS

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

Инфраструктура

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

Модели параллельных программ

Вычислительные системы с общей памятью

Системы с распределенной памятью

Гибридные системы

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

Системы с общей памятью• Преимущества:

• Не требуется обмен данными

• Просто писать программы

• Компактность систем

• Недостатки:

• Проблема совместного доступа к памяти

• Проблема синхронности кэшей

• Ограниченный обьем ОЗУ

• Проблема масштабируемости

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

Системы с распределённой памятью• Преимущества:

• Простота и дешевизна построения

• Эффективное решение задач, требующих малого обмена данными

• Возможность решать задачи, требующие очень больших объёмов оперативной памяти

• Возможность масштабирования

• Недостатки:

• Проблема обмена данными

• Сложное программирование

• Большой размер систем

• Большое энергопотребление

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

Гибридные системы

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

Инструментарий

OpenMPOpen Multi-Processing

MPIMessage Passing Interface

Hadoop

Spark

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

OpenMP

Page 17: Вебинар: Основы распараллеливания С++ программ при помощи 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++

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

Преимущества OpenMP• Лёгкость использования.

• Кросс-платформенность для систем с общей памятью.

• Сокрытие низкоуровневых операций.

• Инкрементное распараллеливание.

• Поддержка параллельной и последовательной версий программ.

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

Компоненты• Переменные окружения.

• Директивы компилятора — расширения языков С/C++ и Fortran.

• Функции.

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

Модель Fork-Join

master thread

master thread

master thread

F FJ J

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

OpenMP и GCCGCC v4.1

-openmp

g++ test.cpp -o test -fopenmp

#include<omp.h>

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

Переменные окружения• OMP_NUM_THREADS - Устанавливает количество потоков в параллельном блоке. По умолчанию, количество потоков равно количеству виртуальных процессоров.

• OMP_SCHEDULE - Устанавливает тип распределения работ в параллельных циклах с типом runtime.

• OMP_DYNAMIC - Разрешает или запрещает динамическое изменение количества потоков, которые реально используются для вычислений (в зависимости от загрузки системы). Значение по умолчанию зависит от реализации.

• OMP_NESTED - Разрешает или запрещает вложенный параллелизм (распараллеливание вложенных циклов). По умолчанию – запрещено.

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

ДирективыФормат директивы (С/C ++)

#pragma omp < имя> [ <предложение> {[,] <предложение>}]

имя — имя директивы;

предложение — конструкция, задающая дополнительную информацию и зависящая от директивы;

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

Директива parallel#pragma omp parallel [<предложение>]

<структурный блок>

• Поток, встречающий конструкцию parallel, создаёт команду потоков, становясь для неё основным.

• Потокам команды присваиваются уникальные целые номера, начиная с 0 (основной поток).

• Каждый поток исполняет код, определяемый структурным блоком, в конце которого неявно устанавливается барьер.

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

Директива parallel#include <iostream>

#include <omp.h>

int main()

{

#pragma omp parallel

std::cout << "Hello, world!" << std::endl;

}

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

Директива for#pragma omp for [<педложения>]

<циклы for>

Ограничения:

• (Единственный) счётчик — целого типа, указатель, или итератор произвольного доступа. Должен изменяться только в заголовке цикла.

• Условие цикла: сравнение переменной с инвариантным к циклу выражением при помощи <, <=, >, >=.

• Изменение счётчика: при помощи ++, --, i += d, i -= d, i = i + d, i = d + i, i = i - d (d — инвариантное к циклу целое выражение)

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

Директива for#pragma omp parallel

{

#pragma omp for

for (ptrdiff_t i = 0; i < n; i++)

dst[i] = sqrt(src[i]);

}

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

#pragma omp parallel for#pragma omp parallel for

for (ptrdiff_t i = 0; i < n; i++)

dst[i] = sqrt(src[i]);

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

Другие директивыsingle - если в параллельной области какой-либо участок кода должен быть выполнен лишь один раз.

sections - используется для задания конечного (неитеративного) параллелизма.

master - выделяет участок кода, который будет выполнен только нитью-мастером.

critical - оформляется критическая секция программы. Критическая секция запрещает одновременное исполнение структурированного блока более чем одним потоком.

barrier - способ синхронизации, дает всем потокам указание ожидать друг друга перед тем, как они продолжат выполнение за барьером.

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

Список 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

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

Platform for scientific computing and data management

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

Какие могут быть задачи?

• Научные расчеты

• Анализ данных

• Рендеринг

• Моделирование

• Прогнозирование

• …

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

Problems

• Time-consuming deployment and support of the elastic infrastructure.

• Complicated process of connection between the large number of computing tools.

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

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.

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

Научный расчет. Как это работает в реальной жизни

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

Научный расчет. Как это работает у нас

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

Функционал, который есть сейчас

• загрузка файлов в хранилище;

• запуск вычислительных программ, написаных на С/С++, которые будут выполняться с помощью компилятора GCC с поддержкой OpenMP;

• виртуальные машины облака Azure с количеством ядер от 1 до 32 и ОЗУ до 448 ГБ;

• просмотр и скачивание файлов результатов расчета;

• биллинг, пополнение счета при помощи пластиковых карт и промо-кодов.

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

Программа бета-тестирования

• Получить бесплатный доступ

• Использовать новые функции первыми

• Помогать сделать FlyElephant лучше

http://flyelephant.net/beta/

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

Функционал, который ждет нас в скором будущем

• Поддержка Python, R, Java и MPI.

• Система визуализации результатов

• Система управления результатами расчетов

• Внутренняя социальная сеть

• Система API

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

Отдельный интерфейс для учебного процесса

Поддержка открытых научных исследований

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