Бакалавриат
2020/2021
Высокопроизводительные вычисления
Статус:
Курс по выбору (Прикладная математика и информатика)
Направление:
01.03.02. Прикладная математика и информатика
Где читается:
Факультет компьютерных наук
Когда читается:
3-й курс, 1, 2 модуль
Формат изучения:
без онлайн-курса
Охват аудитории:
для своего кампуса
Преподаватели:
Коновалов Евгений Владиславович,
Маминов Артем Дмитриевич,
Посыпкин Михаил Анатольевич
Язык:
русский
Кредиты:
5
Контактные часы:
60
Программа дисциплины
Аннотация
Количество ядер в современных процессорах уже измеряется десятками, в графических ускорителях – тысячами, а в суперкомпьютерах ¬– миллионами. Многоядерные вычислительные системы широко применяются в машинном обучении, науках о материалах, биоинформатике, автоматизации проектирования, вычислительной химии и физике. Эффективно использовать эту значительную вычислительную мощность – непростая задача, требующая применения современных подходов, составляющих основное содержание предлагаемого спецкурса. Курс состоит из шести разделов. Первая вводная часть курса посвящена таким базовым концепциям параллельных вычислений, а также обзору современного устройства процессоров, ускорителей, способов организации оперативной памяти и высокопроизводительных сетей передачи данных. В небольшой второй части курса изучаются векторные устройства микропроцессоров и способам разработки программ для них. Основное внимание уделено архитектуре и программной поддержке технологии AVX. В третьей части рассматриваются средства разработки многопоточных программ. На примере различных алгоритмов изучаются такие инструменты, как POSIX Threads, современные расширения C++ (стандарты 11,14,17,20) для параллельных вычислений. Четвертая часть посвящена архитектуре и средствам разработки программ для графических ускорителей (GPU). Основное внимание уделяется программному стеку CUDA. Современные высокоуровневые средства разработки многопоточных программ для центральных процессоров и ускорителей рассматриваются в пятом разделе. Изучаются инструменты OpenMP, OpenACC и OpenCL. В пятой, заключительной части, рассматриваются технологии разработки программ для наиболее мощных высокопроизводительных систем – вычислительных кластеров. Основное внимание уделено самому распространенному средству разработки программ для таких систем – библиотеке MPI, интеграции MPI и CUDA.
Цель освоения дисциплины
- Получение студентами знаний в области параллельных и распределенных вычислений, выработка у студентов навыков разработки, отладки и исследования производительности параллельных программ.
Планируемые результаты обучения
- Знать основные типы высокопроизводительных архитектур
- Знать определения и уметь вычислять базовые характеристики производительности параллельных алгоритмов
- Владеть базовыми средствами многопоточного программирования
- Знать архитектуру, принципы разработки программ и инструменты для программирования графических ускорителей
- Владеть высокоуровневыми инструментами многопоточного программирования
- Владеть средствами разработки программ для систем с распределенной памятью
Содержание учебной дисциплины
- Теоретические основы высокопроизводительных вычисленийРассматривается мотивация, история возникновения, такие базовые концепции высокопроизводительных вычислений, как ускорение, эффективность, масштабируемость. Существенное внимание будет уделено причинам снижения эффективности приложений: зависимостям по данным между инструкциями и накладным расходам на взаимодействие компонентов параллельной программы. Планируется рассмотреть модели высокопроизводительных вычислений, позволяющие теоретически оценивать время работы и ускорение приложений.
- Введение в архитектуру микропроцессоровВ теме рассматривается устройство современных многоядерных процессоров. Изучается общая схема микропроцессора и вычислительного ядра. На примере различных процессоров демонстрируются основные компоненты современных процессоров: функциональные устройства, регистры, буферы для работы с памятью, различные виды кэшей. Рассматриваются фазы обработки команд (ступени) в конвейерах, зависимости по данным и их устранение на аппаратном уровне. Внимание также уделяется таким механизмам, как предсказание ветвлений, переупорядочивание команд. Изучаются векторные устройства, позволяющие обрабатывать одновременно несколько однотипных данных одной командой. Детально рассматривется организация памяти, виды и принципы работы кэш-памяти, коггерентность кэшей в многоядерных системах. Рассматриваются основные компоненты современных графических ускорителей: потоковые процессоры, особенности режима SIMT, иерархия памяти (глобальная, константная, локальная, регистровая, кэш-память). Затрагиваются современные «тензорные» команды, нацеленные на задачи машинного обучения. Наиболее мощные современные суперкомпьютеры имеют кластерную архитектуру. Кластер представляет собой совокупность вычислительных узлов, соединенных высокопроизводительной сетью. В рамках данного раздела рассматривается устройство современных скоростных сетей. Изу-чаются принципы устройства сетей Ethernet и InfiniBand, механизмы классического взаимодействия путем передачи сообщений и прямого удаленного доступа к памяти (RDMA), «выгрузка» логики взаимодействия (offloading), классические топологии высокопроизводительных сетей.
- Базовые средства многопоточного программированияНаиболее распространенной и широко доступной платформой для высокопроизводительных вычислений являются многоядерные системы с общей памятью. К этому классу относятся практи-чески любой персональный компьютер. Поэтому особое внимание в курсе уделяется основной па-радигме разработки программ для подобных систем: многопоточному программированию. Рас-сматриваются понятия потока и процесса с точки зрения операционной системы. Для кратко рас-сматриваются классическая библиотека для разработки многопоточных программ: POSIX Threads, на примере которой изучаются способы создания потоков и их синхронизация: семафоры, мьютек-сы, блокировки на чтение-запись, условные переменные. POSIX Threads является простым, эффективным, но достаточно неудобным в использовании средством разработки многопоточных приложений, на смену которому пришли многопоточные расширения современных диалектов языка С++. В рамках этой темы рассматриваются классы и ме-тоды для создания и синхронизации потоков. Изучаются атомарные данные, операции над ними, и модели констистентности памяти. Изучается концепция безблокировочного взаимодействия пото-ков (lock-free programming).
- Программирование графических ускорителейРассматривается CUDA – базовый пакет для программирования графических ускорителей. Изучается процесс сборки, запуска и отладки программ для графических ускорителей. Рассматриваются концепции вычислительного ядра, потоков, блоков. Определяется модель исполнения CUDA-программы – модель SIMT, понятие расхождения потоков и его влияния на производительность. Рассматриваются виды памяти, используемые в графических ускорителях: глобальная, локальная, константная, кэш-память. Также уделяется внимание передаче данных с «хоста» на «устройство» посредством копирования или с использованием отображаемой памяти устройства. Изучаются способы повышения эффективности использования памяти с помощью агрегации обра-щений к памяти и других приемов. Также дается обзор поддержки машинного обучения в совре-менных графических процессорах, рассматриваются «тензорные» операции.
- Высокоуровневые средства многопоточного программированияМногопоточное программирование на основе OpenMP. OpenMP позволяет распараллеливать программы, прилагая минимальные усилия. Код про-граммы изменяется с помощью специальных директив, указывающих компилятору, каким образом провести распараллеливание последующего цикла или блока. Рассматриваются директивы органи-зации параллельного выполнения, синхронизации, распределения работы, векторизации. Недавно появившийся инструментарий OpenACC построен на той же парадигме директив транслятору, что и OpenMP, но в отличие от последнего, позволяет разрабатывать программы, ко-торые могут выполняться как на многоядерном центральном процессоре, так и на графическом ускорителе. Рассматриваются основные инструменты для работы с OpenACC, базовые директивы для инициации параллельного выполнения, распределения вычислительной нагрузки и обмена данными между потоками. Программная среда OpnCL позволяет разрабатывать программы для широкого класса много-ядерных платформ, включая центральные процессоры и графические ускорители, а также FPGA. В курсе рассматривается архитектура среды OpenCL, основные концепции, понятия устройства и яд-ра. Изучаются методы разработки параллельных программ, способных задействовать различные устройства в разнородной высокопроизводительной среде.
- Средства разработки программ для систем с распределенной памятьюОсновным средством разработки программ для систем с распределенной памятью, т.е. вычислительных кластеров, является библиотека MPI (Message Passing Interface). В курсе рассматривается структура библиотеки, способ сборки и запуска MPI-программы. Изучаются понятия коммуникатора, средств управления коммуникаторами в MPI-приложении. Система типов в MPI-программах, базовые и производные типы. Взаимодействие процессов в MPI. Рассматриваются парные и коллективные взаимодействия MPI-процессов, синхронные и асинхронные взаимодействия. Рассматриваются односторонние обмены, использующие возможно-сти прямого удаленного доступа к памяти. Рассматривается практика разработки и отладки MPI-программ, источники ошибок в MPI-программах, взаимные блокировки, недетерминизм. Разделённое глобальное адресное пространство (partitioned global address space, сокр. PGAS) – одна из перспективных моделей разработки программ для систем с распределенной памятью, при которой вся память параллельного вычислительного комплекса является адресуемой и разделена на логические разделы, каждый из которых локален для какого-то процесса или потока. В курсе рассматривается программный интерфейс OpenSHMEM, разработанный международным консорциумом. Изучаются библиотечные вызовы для записи и чтения данных, синхронизации и коллективных обменов. Концепции PGAS иллюстрируются на различных примерах.
- Технологии векторных вычислений в процессорах Intel: SSE, AVXКраткое введение в ассемблер, структура программы, стек, регистры, передача аргументов функции. Принципы организации векторных вычислений, концепция SIMD. Эволюция векторных операций: от SSE до AVX-512. Векторные регистры. Векторные операции SSE для работы целочисленной и вещественной арифметикой. Системы команд AVX, AVX-2 для целочисленной и вещественной арифметики, инструкции FMA. Расширение AVX-512.
Элементы контроля
- Лабораторная работа 1
- Лабораторная работа 2
- Лабораторная работа 3
- Лабораторная работа 4
- Экзамен
Промежуточная аттестация
- Промежуточная аттестация (2 модуль)0.125 * Лабораторная работа 1 + 0.125 * Лабораторная работа 2 + 0.125 * Лабораторная работа 3 + 0.125 * Лабораторная работа 4 + 0.5 * Экзамен
Список литературы
Рекомендуемая основная литература
- Petersen, W. P., & Arbenz, P. (2004). Introduction to Parallel Computing. Oxford: Oxford University Press. Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsebk&AN=176951
- Биллиг В.А. - Параллельные вычисления и многопоточное программирование - Национальный Открытый Университет "ИНТУИТ" - 2016 - 310с. - ISBN: - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/100361
- Модели параллельного программирования: Практическое пособие / Федотов И.Е. - М.:СОЛОН-Пр., 2017. - 392 с.: 60x88 1/8. - (Библиотека профессионала) ISBN 978-5-91359-222-4
Рекомендуемая дополнительная литература
- Основы многопоточного и параллельного программирования: Учебное пособие / Карепова Е.Д. - Краснояр.:СФУ, 2016. - 356 с.: ISBN 978-5-7638-3385-0