Магистратура
2020/2021
Параллельное программирование
Статус:
Курс обязательный (Системное программирование)
Направление:
09.04.04. Программная инженерия
Где читается:
Факультет компьютерных наук
Когда читается:
1-й курс, 1, 2 модуль
Формат изучения:
с онлайн-курсом
Прогр. обучения:
Системное программирование
Язык:
русский
Кредиты:
5
Контактные часы:
56
Программа дисциплины
Аннотация
Курс "Параллельное программирование" посвящен изучению теории и методов практической разработки параллельных программ для современных архитектур компьютеров. Особенностью курса является комплексное рассмотрение проблем параллелизма, как на уровне библиотек, предоставляемых прикладным программистам, так и на уровне близком к архитектуре микропроцессоров и графических ускорителей, что более важно для системных программистов.
Цель освоения дисциплины
- Целью курса является формирование у студентов теоретических знаний и навыков разработки, исследования производительности, оптимизации и отладки параллельных программ для современных архитектур процессоров и графических акселераторов.
Планируемые результаты обучения
- Иметь представление о подходах к обеспечению параллелизма
- Знать базовые принципы VLIW и Modulo scheduling.
- Знать базовые принципы векторного параллелизма
- Знать базовые принципы вычисления с плавающей точкой
- Знать базовые принципы оптимизации доступа к памяти
- Знать базовые принципы параллелизма при использовании многоядерных CPU
- Знать базовые принципы межконтекстного взаимодействия
- Знать базовые принципы OpenMP
- Знать базовые принципы анализа производительности CPU
- Знать базовые принципы программирования графических акселераторов
- Знать базовые принципы CUDA
- Знать базовые принципы OpenACC и OpenMP
Содержание учебной дисциплины
- Уровни параллелизма в современных компьютерах. Теоретические подходы: законы Амдаля, Густафсона. Оценки пиковой производительности. Memory wall. Performance/portability tradeoff.
- Параллелизм в пределах одного контекста выполнения. Параллелизм на уровне команд. VLIW. SIMD. Delayed branches. Компиляторные преобразования повышающие ILP. Modulo scheduling.
- Векторный параллелизм (SIMD). Ограничения компиляторного анализа. Возможности и ограничения явной векторизации через интринсики. Компромисс между производительностью и переносимостью. Структурирование кода для облегчения компиляторного анализа.
- Вычисления с плавающей точкой. Принципы IEEE-754. Ограничения и возможности компиляторной трансляции.
- Иерархия кешей. Оптимизация доступа к памяти. Префетчинг. Cache-aware и cache-oblivious алгоритмы. Возможные компиляторные оптимизации.
- Параллелизм на многоядерных CPU. Кеши и поддержка согласованности памяти. False sharing.
- Низкоуровневые примитивы межконтекстного взаимодействия: атомарные операции, семафоры, futex. Поддержка на уровне языка Си и особенности компиляторной поддержки.
- OpenMP. Классическая функциональность: параллелизм на уровне нитей. Анализ и трансляция OpenMP в компиляторе.
- Анализ производительности на CPU. Основные инструменты разработчика: valgrind (cachegrind), perf, ocperf. Использование компиляторных возможностей.
- Параллелизм на графических акселераторах. Явные интерфейсы программирования: CUDA, OpenCL. Инструменты разработки в CUDA.
- Оптимизация в CUDA. Оптимизация доступа к памяти. Компромисс между ILP, регистровым давлением, TLP. Warp-synchronous programming. Сравнение с подходами, применяемыми на CPU.
- OpenACC и OpenMP 4.0: параллелизм для акселераторов. Подходы к трансляции кода в различных реализациях. Специализация OpenMP-кода для акселераторов.
Промежуточная аттестация
- Промежуточная аттестация (2 модуль)0.3 * Домашнее задание (ДЗ) + 0.3 * Контрольная работа (КР) + 0.4 * Экзамен (Э)
Список литературы
Рекомендуемая основная литература
- McKenney, P. E. (2017). Is Parallel Programming Hard, And, If So, What Can You Do About It? (v2017.01.02a). Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsbas&AN=edsbas.8A6CB160
Рекомендуемая дополнительная литература
- Allen, R., & Kennedy, K. (2001). Optimizing Compilers for Modern Architectures : A Dependence-based Approach (Vol. 1st ed). San Francisco: Elsevier. Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsebk&AN=83617
- Chapman, B., Pas, R. van der, & Jost, G. (2008). Using OpenMP : Portable Shared Memory Parallel Programming. Cambridge, Mass: The MIT Press. Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsebk&AN=211305
- Gregg, B. (2014). Systems Performance : Enterprise and the Cloud. Upper Saddle River, NJ: Prentice Hall. Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsebk&AN=1599877
- Kirk, D., & Hwu, W. (2013). Programming Massively Parallel Processors : A Hands-on Approach (Vol. 2nd ed). San Francisco, Calif: Morgan Kaufmann. Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsebk&AN=516192
- W. Kahan, & Winston S. Churchill. (1981). Why Do We Need a Floating-Point Arithmetic Standard? Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsbas&AN=edsbas.5F5D3C27