1. Введение
- Тенденции развития вычислительных систем, обуславливающие необходимость применения распределённых (параллельных) методов вычислений. Примеры вычислительно ёмких задач из разных областей науки.
- Классификация параллельных систем
- SIMD, MISD...
- SMP, MMP
- Краткая история параллельных систем
- Современные высокопроизводительные системы как аппаратно-программные комплексы: начиная от расширений SSE, через многоядерность к узлам кластеров
- План курса
2. Параллелизм
- Способы распараллеливания программ
- По данным
- По управлению
- Проблема автоматизации распараллеливания: текущее состояние средств, способных выявлять некоторые виды параллелизма
- Понятия ускорения, эффективности (закон Амдала), масштабируемости распараллеленного алгоритма
- Напоминание о процессах и потоках (контексты, состояния)
- Приоритеты (java, Windows, Unix)
- Планирование
- Демоны
- Сироты
- Зомби
- Причины некоторых преимуществ потоков над процессами
- Особенности реализации процессов и потоков в различных ОС
3. Основы программирования потоков
- Posix-потоки (Posix-threads)
- Java-потоки (Green-threads)
- Boost-потоки (группы потоков)
- Корректное завершение потоков
- Сравнение различных потоков (таблица соответствия операций)
- Обработка исключений
- Spurious wakeups
4. Синхронизация
- Примитивы синхронизации
- Критическая секции
- Мьютекс (futex)
- Семафор
- Событие
- Interlocked-функции
- Условные переменные
- Виды мьютексов
- Рекурсивный/нерекурсивный
- Разделяемый (read/write), его целесообразность
- Spin_mutex
- Именованный
- Виды синхронизации
- Грубая
- Тонкая
- Оптимистичная
- Ленивая
- Неблокирующая (Lock-free на примере списка)
- Алгоритмы Петерсона и Лампорта
5. Поиск ошибок и анализ производительности
- Основные ошибки многопоточного программирования
- Гонки данных (Data Race)
- Взаимная блокировка (Deadlock)
- Потерянный сигнал
- Специфические ошибки
- Реакция потока на сигнал
- Блокировки при fork многопоточных программ
- Проблема ABA
- Инверсия приоритетов
- Принципы проектирования многопоточных приложений
- Средства поиска ошибок
- Intel Thread Checker
- Intel Parallel Inspector
- Valgrind (модуль helgrind)
- Средства анализа производительности
- Intel Thread Profiler
- Valgrind (модули callgrind, cachegrind)
6. OpenMP
- История стандарта
- Основные служебные функции
- Основные директивы препроцессора
- Создание потоков, параллельные секции (parallel)
- Работа с данными (shared, private...)
- Синхронизация (critical, atomic)
- Взаимодействие потоков (reduction, copyin...)
- Контроль числа потоков
- Применимость для вложенных вызовов
7. Intel TBB
- Структура библиотеки
- Аллокаторы памяти
- Потокобезопасные контейнеры
- Примитивы синхронизации
- Алгоритмы
- parallel_for
- parallel_reduce
- parallel_scan
- Деревья задач
- Планировщик TBB
- Возможность контроля пула потоков
- Динамическое перераспределение задач (work stealing)
- Порядок выполнения древовидных задач
8. Java.util.concurrent и Fork-Join Framework
- Пулы потоков, корректное завершение пула
- Контроль задач через Future
- Потокобезопасные контейнеры
- Примитивы синхронизации
- Алгоритмы планировки задач
9. Шаблоны || программирования
- Декомпозиция по задачам
- Геометрическая декомпозиция
- Декомпозиция рекурсивных задач (Recursive data)
- Модели программ
- SPMD
- Parallel loops
- Boss/Worker
- Pipeline
10. Консенсус
- Линеаризуемость
- Атомарный регистр
- Консенсусное число
- консенсусное число RMW-регистров
- универсальность CAS-операций
11. Неблокирующие алгоритмы
- Атомарный снимок регистров: lock-free алгоритм
- Примеры неблокирующих алгоритмов на контейнерах
12. Алгоритмы без ожидания
- Атомарный снимок регистров: wait-free алгоритм
- Примеры алгоритмов без ожидания на контейнерах
13. Распределённые системы
- Определение. Задачи. Принципы построения
- Открытость
- Прозрачность
- Масштабируемость
- Программные решения
- Распределенные операционные системы
- Сетевые операционные системы
- Программное обеспечение промежуточного уровня
- Модель клиент-сервер. Варианты архитектуры клиент-сервер
- Системы без выделенного центра. Многоагентные системы
- Взаимодействие компонентов
- Протоколы (TCP, UDP...)
- Удаленный вызов процедур
- Обращение к удаленным объектам (RMI)
- Связь посредством сообщений
- Виды кластерных систем
- Балансировки нагрузки
- Высокой надёжности
- Вычислительные
14. Вычислительные кластеры и стандарт MPI
- История и назначение стандарта
- Общая структура программы
- Обмен сообщениями
- С блокировкой
- Без блокировки
- Отложенные запросы на взаимодействие
- Тупиковые ситуации (deadlock)
- Взаимодействие процессов
- Группы и коммуникаторы
- Операции коллективного взаимодействия процессов
- Редукция
- Виртуальные топологии
- Средства анализа производительности
- Jumpshot
- Intel® Trace Analyzer и Intel® Trace Collector
15. Облачные вычисления
- Концепция GRID
- MapReduce на примере Hadoop
16. Оптимизации в компиляторах
- Статические оптимизации
- Оптимизации циклов:
- Развёртывание
- Повторение
- Вынесение инварианта
- Локальность кэша инструкций
- JIT-оптимизации
- Многопоточные оптимизации
- Объединение захвата примитивов
- Оптимистичный захват
- Адаптивные блокировки
- Замена виртуального вызова
17. Транзакционная память
- Принцип работы Software transactional memory
- Идея Hardware transactional memory
- Преимущества и круг задач.
18. Асинхронный ввод/вывод
- Шаблоны поведения реактора и проактора
- Преимущества асинхронной работы и реализация со стороны операционной системы
- Библиотеки асинхронного ввода/вывода.
Дополнительно
- Системы сборки проектов (maven + continuum + archiva)
- Сборка rpm пакетов (mock)
- Сервера приложений (WSDL + XSD + SOAP...)
- Архитектурные особенности ОСРВ (на примере QNX)