Практика параллельного программирования с использованием MPI

Дмитрий Витальевич Лукьяненко

Обложка:


Предисловие 9
Лекция 1. Введение в основы MPI 14
1.1. Последовательная реализация умножения матрицы на вектор 16
1.2. Параллельный алгоритм умножения матрицы на вектор 18
1.3. Программная реализация параллельного алгоритма умножения матрицы на вектор 19
1.3.1. Модели и технологии параллельного программирования 19
1.3.2. Основы MPI — простейшая тестовая программа 19
1.3.3. Считывание из файла входных параметров и их распределение по различным процессам 22
1.3.4. Знакомство с базовыми функциями передачи/приёма сообщений между отдельными процессами Send и Recv 24
1.3.5. Знакомство с функцией коллективного взаимодействия процессов Bcast 29
1.3.6. Считывание из файла матрицы и её распределение по различным процессам 31
1.3.7. Считывание из файла вектора и распределение по различным процессам 34
1.3.8. Параллельное умножение матрицы на вектор 35
1.3.9. Сбор частей массива с разных процессов в единый массив 37
1.3.10. Оптимизация сбора информации с помощью функции Probe 38
1.3.11. Знакомство с функциями коллективного взаимодействия процессов Gather(v) и Scatter(v) 41
1.4. Обобщение программы на случай использования произвольного числа процессов 44
1.5. Возможные пути оптимизации программной реализации 50
1.5.1. Упоминание о функциях передачи сообщений Bsend и Rsend 51
Лекция 2. Введение в основы MPI. Продолжение 53
2.1. Последовательная реализация вычисления скалярного произведения векторов 53
2.2. Параллельный алгоритм вычисления скалярного произведения векторов 55
2.3. Программная реализация параллельного алгоритма вычисления скалярного произведения векторов 56
2.3.1. Знакомство с функциями коллективного взаимодействия процессов Reduce и Allreduce 61
2.4. Параллельный алгоритм умножения транспонированной матрицы на вектор 63
2.5. Программная реализация параллельного алгоритма умножения транспонированной матрицы на вектор 64
2.5.1. Знакомство с дополнительными полезными функциями коллективного взаимодействия процессов 68
2.5.2. Знакомство с функцией коллективного взаимодействия процессов Reduce_scatter 68
2.5.3. Знакомство с функцией коллективного взаимодействия процессов Allgatherv 68
2.6. Подведение промежуточных итогов 69
Лекция 3. Параллельная реализация метода сопряжённых градиентов для решения СЛАУ 70
3.1. Последовательная реализация метода сопряжённых градиентов 71
3.2. Параллельная реализация метода сопряжённых градиентов 74
3.2.1. Подготовка на процессах данных для вычислений 74
3.2.2. Вычислительная часть 81
3.2.3. Обсуждение преимуществ и недостатков предложенной программной реализации 85
3.3. Упрощённая параллельная реализация метода сопряжённых градиентов 87
3.3.1. Обсуждение преимуществ и недостатков предложенной программной реализации 91
Лекция 4. Эффективность и масштабируемость параллельных программ 93
4.1. Закон Амдала 93
4.1.1. Теоретический анализ реализованных на предыдущей лекции параллельных алгоритмов 95
4.2. Реальное ускорение программных реализаций параллельных алгоритмов, разобранных на предыдущей лекции 98
4.2.1. Способы определения времени работы параллельных программ 98
4.2.2. Характеристики используемой для тестирования параллельных программ многопроцессорной системы 99
4.2.3. Результаты тестовых вычислений 100
4.3. Эффективность и масштабируемость параллельных программ 104
4.4. Пути повышения эффективности и масштабируемости 107
Лекция 5. Операции с группами процессов и коммуникаторами 109
5.1. Параллельный алгоритм умножения матрицы на вектор в случае двумерного деления матрицы на блоки 110
5.2. Параллельный алгоритм умножения транспонированной матрицы на вектор в случае двумерного деления матрицы на блоки 113
5.3. Группы и коммуникаторы 115
5.3.1. Операции с группами процессов 116
5.3.2. Операции с коммуникаторами 118
5.4. Продвинутая параллельная реализация метода сопряжённых градиентов в случае двумерного деления матрицы системы на блоки 122
5.4.1. Подготовка на процессах данных для вычислений 123
5.4.2. Вычислительная часть 140
5.5. Оценка эффективности и масштабируемости параллельной программы 145
5.6. Обсуждение преимуществ и недостатков предложенной программной реализации 147
Лекция 6. Виртуальные топологии 149
6.1. Виртуальные топологии 149
6.1.1. Знакомство с базовыми функциями по работе с декартовой топологией 150
6.1.2. Знакомство с функциями передачи/приёма сообщений между отдельными процессами Sendrecv и Sendrecv_replace 155
6.2. Параллельная реализация метода сопряжённых градиентов с использованием виртуальной топологии типа двумерного тора 159
6.2.1. Подготовка на процессах данных для вычислений 161
6.2.2. Вычислительная часть 168
6.3. Оценка эффективности и масштабируемости параллельной программы 173
6.4. Обсуждение преимуществ и недостатков предложенной программной реализации 176
Лекция 7. Параллельный вариант метода прогонки для решения СЛАУ с трехдиагональной матрицей 177
7.1. Последовательная реализация метода прогонки 178
7.2. Параллельный вариант метода прогонки 180
7.2.1. Теоретический анализ параллельного алгоритма 185
7.3. Параллельная реализация метода прогонки 186
7.3.1. Подготовка на процессах данных для вычислений 187
7.3.2. Вычислительная часть 190
Лекция 8. Подходы к распараллеливанию алгоритмов решения задач для уравнений в частных производных. Часть 1 197
8.1. Последовательный алгоритм решения задачи для УрЧП, основанный на реализации явной схемы 197
8.2. Программная реализация последовательного алгоритма решения 200
8.3. Параллельный алгоритм решения, основанный на реализации явной схемы 203
8.4. Программная реализация параллельного алгоритма решения 205
8.5. Оценка эффективности и масштабируемости параллельной программы 212
8.6. Обсуждение путей усовершенствования программной реализации 214
Лекция 9. Подходы к распараллеливанию алгоритмов решения задач для уравнений в частных производных. Часть 2 216
9.1. Последовательный алгоритм решения задачи для УрЧП, основанный на реализации неявной схемы 216
9.2. Программная реализация последовательного алгоритма решения 221
9.3. Параллельный алгоритм решения, основанный на реализации неявной схемы 225
9.4. Программная реализация параллельного алгоритма решения 229
9.5. Оценка эффективности и масштабируемости параллельной программы 239
Лекция 10. Подходы к распараллеливанию алгоритмов решения задач для уравнений в частных производных. Часть 3 242
10.1. Последовательный алгоритм решения задачи для двумерного по пространству УрЧП, основанный на реализации явной схемы 242
10.2. Программная реализация последовательного алгоритма решения 245
10.3. Параллельный алгоритм решения, основанный на реализации явной схемы 249
10.4. Программная реализация параллельного алгоритма решения 253
10.5. Оценка эффективности и масштабируемости параллельной программы 265
10.6. Обсуждение путей усовершенствования программной реализации 267
Лекция 11. Асинхронные операции 270
11.1. Тупиковые ситуации и последовательный обмен сообщениями вместо одновременного 270
11.2. Знакомство с функциями передачи/приёма сообщений между отдельными процессами без блокировки Isend и Irecv 275
11.3. Пересылка сообщений на фоне вычислений 280
11.4. Возможности стандарта MPI-3: операции коллективного взаимодействия процессов без блокировки 285
Лекция 12. Отложенные запросы на взаимодействие 286
12.1. Многократная пересылка одинаково структурированных данных 286
12.2. Знакомство с функциями формирования отложенных запросов на взаимодействия Send_init и Recv_init 289
12.3. Усовершенствование программных реализаций решения задач для уравнений в частных производных 293
12.4. Усовершенствование одной из программных реализаций метода сопряжённых градиентов 297
12.5. Возможности стандарта MPI-4: коллективные отложенные запросы на взаимодействие 299
Лекция 13. Технологии гибридного параллельного программирования 301
13.1. Типовые конфигурации современных вычислительных систем 301
13.2. Тестовый пример 305
13.3. Модификация примера с использованием технологии OpenMP 306
13.4. Модификация примера с использованием технологии CUDA 308
13.5. Оценка эффективности и масштабируемости предложенных программных реализаций 311
Лекция 14. Основные причины плохой масштабируемости параллельных программ 315
14.1. Причины плохой масштабируемости параллельных программ 316
14.1.1. Точный порядок приёма данных 316
14.1.2. Одновременная пересылка большого количества данных 319
14.1.3. Разделение этапов счёта и пересылок 321
14.1.4. Плохое соответствие топологии вычислений и сетевой топологии 322
14.1.5. Недостаточная пропускная способность PCI для работы с GPU 323
14.1.6. Неправильные системные настройки при запуске гибридных программ 324
14.2. Итоговые общие рекомендации 324
Литература 326