• A
  • A
  • A
  • АБB
  • АБB
  • АБB
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта
Магистратура 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