Параллельные и распределенные вычисления — кому и зачем они нужны?

Мы пообщались с Дмитрием Витальевичем Лукьяненко — д.ф.-м.н., доцентом кафедры математики, — о том, где востребованы параллельные и распределенные вычисления, почему писать программы для их реализации может быть сложнее, и что нужно знать, чтобы начать свой путь в этой области, а ещё обсудили соответствующий спецкурс и недавно вышедшую книгу по этой теме под его авторством.

Что такое параллельные вычисления и зачем они нужны?

Одна из целей обучения на физическом факультете — научиться решать сложные современные задачи. Когда-то любые задачи решались в самых простых постановках, но с развитием науки постепенно происходило их усложнение, что, как следствие, зачастую стало приводить к увеличению вычислительной сложности таких задач. Сейчас существует множество научных направлений, в которых нужно проводить огромные объёмы вычислений и оперировать большими массивами данных.

В качестве примера такой прикладной задачи, которая постепенно усложнялась на протяжении более чем столетия, можно привести задачу из области геофизики — поиск нефти. Как нефть искали раньше? Представим Альфреда Нобеля, приехавшего в Баку, где, образно говоря, он увидел лужу нефти, и её вычерпали. Когда такие «лужи» закончились, нефть начали искать по косвенным признакам. Копать или бурить скважины приходилось неглубоко и ошибки в определении её местоположения были вполне допустимы — цена ошибки была небольшой. Когда и такие залежи были исчерпаны, осталось только бурить достаточно глубокие скважины, а наугад это делать дорого. В этот момент и возникла вычислительно сложная задача по определению неоднородностей в недрах земли по косвенным измерениям, за счёт успешного решения которой можно было бы минимизировать число скважин и, как следствие, объём ресурсов, требуемых для решения такой задачи. К вычислениям какого объёма может приводить такая задача?

Пусть рассматривается какая-то трёхмерная область под землей, для простоты представляющая из себя параллелепипед, в которой хочется определить распределение неоднородностей. Допустим, в этой области вводится сетка размерности 100х100х100 узлов — пример достаточно грубой сетки для задач рассматриваемого класса. Каждой ячейке этой сетки соответствует своя неизвестная (усреднённая плотность породы в этой ячейке), итого 1 000 000 (то есть 10^6) неизвестных. Чтобы найти миллион неизвестных, нужно иметь данные экспериментальных наблюдений как минимум в миллионе точек, которые дают соответствующее количество уравнений, — в результате матрица решаемой системы уравнений будет иметь 10^6 ∙ 10^6 = 10^12 элементов. Если хранение каждого элемента требует 16 байтов (что соответствует вычислениям с «четверной точностью»), то итоговый объем составит 14.6 терабайта.

При этом, это не единственная область, в которой требуются высокопроизводительные вычисления: можно упомянуть задачи газовой динамики (моделирование работы реактивных двигателей), гидродинамики (моделирование движения судов), молекулярной динамики (моделирование веществ на атомном уровне) и многие другие.

Итого, зачастую возникают сразу две проблемы: 1) количество вычислений будет огромным, в результате чего время работы программы может превысить все разумные пределы, и 2) обрабатываемые данные могут не влезть на обычный компьютер (в случае упомянутой задачи потребуется порядка 300 вычислительных узлов суперкомпьютера «Ломоносов-2», на каждом из которых есть только 64 Гб оперативной памяти).

Для решения указанных проблем часто прибегают к следующей идее: разбивают большую задачу на множество мелких подзадач. Каждую из них обсчитывают независимо от других, но при этом «параллельно» с другими, на различных вычислительных устройствах (узлах), каждое из которых содержит по крайней мере один многоядерный процессор (а зачастую и вычислительную видеокарту). Как следствие, возникает необходимость в написании программ, которые могут организовывать взаимодействие между участвующими в вычислениях узлами. В отличие от написания программ, которые работают последовательно только на одном процессоре (ядре), процесс написания программ под многопроцессорные системы является гораздо более трудоёмким и кропотливым.

При этом надо сделать оговорку, что для решения многих прикладных задач есть готовые программные пакеты, использующие суперкомпьютерные технологии, но они не всегда выдерживают проверку временем. Наука уходит вперед, а в готовых пакетах не учитываются какие-то новые эффекты или специфика задачи. Таким образом, появляется необходимость самостоятельно писать соответствующие программы, реализующие численный эксперимент.

В чем заключается основная сложность программной реализации параллельных алгоритмов?

Главная сложность реализации этих идей — это организация совместной работы множества вычислительных узлов. Автоматически это не делается, нужно писать специальные программы. Поэтому возникает необходимость в разработке не просто параллельных алгоритмов (как разбить задачу на параллельные обрабатываемые подзадачи), а именно их программных реализаций. Этому посвящен соответствующий спецкурс на отделении прикладной математики — как писать программы под сложные вычислительные системы.

Что подразумевается под сложными вычислительными системами?

В былые времена это были просто объединенные сетью узлы, которые по сути являлись мощными персональными компьютерами, в каждом из которых находилось по одному центральному процессору и приличный объём оперативной памяти. Сейчас каждый типовой вычислительный узел содержит не только центральный процессор, который в нынешние времена по умолчанию является многоядерным, но может содержать и вычислительную видеокарту. Для оптимизации вычислений с использованием таких систем используется множество разных технологий, описанных в спецкурсе и книге.

Почему писать программы для параллельных вычислений сложнее?

Во-первых, есть разные подходы к написанию программ. Самый распространенный — SPMD (single program, multiple data). Согласно названию метода, пишется одна программа, которая запускается одновременно на всех вычислительных узлах. При этом каждый вычислительный узел знает свой номер и количество узлов, участвующих в вычислениях, а распределение данных и заданий на вычисления происходит управляющим процессом с использованием номеров этих узлов. Сложность заключается в том, что человек, который пишет программу, должен помнить — одной и той же переменной в программе на разных вычислительных узлах может соответствовать совершенно различные данные (например, переменной A на разных процессах могут соответствовать матрицы совершенно различных размеров, а на некоторых она вообще является пустым множеством).

Другая сложность — тестирование и отладка работы программы. Обычно, если последовательная программа на модельном примере дает верный результат, то это считается успехом; в параллельном программировании это не так. Может получиться так, что программа выдает верный результат, но существенного выигрыша в скорости по сравнению с последовательным алгоритмом нет. Это связано с временем, которое вычислительные узлы действительно проводят за расчетами — хорошим считается показатель в 60-80% от общего времени работы программы. Оставшееся время тратится на взаимодействие между вычислительными узлами или на их простой. Поэтому в курсе уделяется особое внимание способам оптимизации взаимодействия вычислительных узлов посредством коммуникационной сети.

Рассматриваемые в курсе программы подходят только для суперкомпьютеров?

Программы, которые пишутся на курсе, могут запускаться и на персональном компьютере (на нём же в нынешние времена есть многоядерный процессор) и на суперкомпьютере. Другое дело, что от количества и качества вычислительных узлов будет непосредственно зависеть выигрыш во времени расчетов. В курсе есть лекции, посвященные оптимизации программ под конкретную вычислительную систему.

Расскажите про «Ломоносов-2» — кто и как может им пользоваться?

Суперкомпьютер «Ломоносов-2»
Суперкомпьютер «Ломоносов-2»

Обычно доступ к суперкомпьютерам выдается очень ограниченному числу людей в закрытых организациях — именно они находятся наверху списка самых мощных вычислительных систем мира. У нас же в НИВЦ МГУ есть один из лучших в мире суперкомпьютер «Ломоносов-2» (входит в топ-500), и доступ к нему может получить любой студент, аспирант или сотрудник.

Доступ — это значит, что вы сидите дома или в лаборатории, удаленно подключаетесь к суперкомпьютеру, загружаете свою программу и ставите её в очередь на счёт, через какое-то время получаете результаты расчётов. Конечно, для получения доступа нужно обосновать необходимость использования именно суперкомпьютера.

Почему вы решили написать книгу в дополнение к спецкурсу?

Технологии параллельных вычислений постоянно адаптируются и улучшаются, вместе с ними меняется и спецкурс. Например, классические языки, которые используются при написании программ для суперкомпьютеров, это C и Fortran. Однако, за последние 5-6 лет эти языки догнал в смысле своих возможностей и Python. Поэтому спецкурс в нынешние времена для написания примеров параллельных программ использует Python — наиболее популярный язык программирования у молодого поколения (хотя все примеры строятся таким образом, что бы их было легко адаптировать под другие языки программирования). Этот же язык программирования использует и книга.

Понятно, что книга не может поспевать за стремительными изменениями, которые возможны в самом ближайшем будущем, однако, она отлично подходит для освоения базы, знание которой будет являться фундаментом для создания программных реализаций, использующих будущие технологии.

Курс читается магистрам и студентам старшего курса специалитета, ибо они уже могут быть вовлечены в научную работу, включающую в себя использование параллельных вычислений. Подробное, детальное изложение курса в книге с большим количеством примеров способствует пониманию и усвоению материала не только для студентов старших курсов, но и для студентов младших курсов, только начинающих открывать для себя красоту параллельных вычислений.

Если вы заинтересовались темой, можете ознакомиться со спецкурсом «Параллельные вычисления» на Youtube или образовательном портале Teach-in, или прочитать книгу Дмитрия Витальевича «Практика параллельного программирования с использованием MPI».

Параллельные и распределенные вычисления — кому и зачем они нужны?, image #2

Д.В. Лукьяненко. Практика параллельного программирования с использованием MPI. URSS. 2024. 330 с. ISBN 978-5-00237-034-4

Аннотация:

Целью учебного курса является знакомство читателей с практикой параллельного программирования при реализации параллельных алгоритмов решения вычислительно ёмких научных задач. Особенности программной реализации изучаемых алгоритмов демонстрируются с использованием языка программирования Python и пакета mpi4py, который для организации взаимодействия различных вычислительных процессов позволяет использовать технологию передачи сообщений MPI. Технология MPI на данный момент является основным средством программирования в параллельных вычислениях на системах с распределённой памятью. Примеры программ в курсе строятся таким образом, что они могут быть легко переписаны с использованием языков программирования С/С++/Fortran.

Данный материал представляет интерес для широкого круга студентов и аспирантов, начинающих приобщаться к области высокопроизводительных вычислений.

252 views·4 shares