Параллельные вычисления
Паралле́льные вычисле́ния (англ. parallel computing), область науки, изучающая методы и средства организации решения задачи (обработки данных, вычислений) с помощью нескольких одновременно работающих вычислительных устройств: компьютеров, процессоров, вычислительных ядер, узлов кластера, функциональных устройств, ускорителей и т. п. При такой организации устройства могут брать на себя выполнение частей общей работы, в результате чего, если какие-то части будут выполняться устройствами одновременно, возможно сокращение времени выполнения всей работы по сравнению с её выполнением одним устройством. Уменьшение времени решения важно для целого множества вычислительно сложных задач, решение которых в последовательном режиме требует дней, недель и лет, что на практике может оказаться неприемлемо длительным промежутком времени, а параллельные вычисления дают возможность решать их быстрее, иногда ускоряя процесс в сотни и тысячи раз.
Элементы параллелизма в архитектуре компьютеров начали появляться одновременно с зарождением и развитием вычислительной техники. В компьютерах компании IBM – IBM 701 (1953) и IBM 704 (1954) была реализована разрядно-параллельная память и разрядно-параллельная арифметика, в компьютере IBM 709 появились независимые устройства ввода-вывода, а в компьютере IBM 7030 Stretch (1960) впервые реализованы опережающий просмотр команд вперёд и расслоение памяти – и всё это различные проявления параллелизма. В компьютере Atlas (1962) впервые реализован конвейер команд, позволивший сократить среднее время выполнения команды с 6 мкс до 1,6 мкс. В компьютере CDC 6600 (1964) появились независимо работающие функциональные устройства, которые в последующих поколениях семейства дополнительно стали ещё и конвейерными. Внедрение идей параллелизма в архитектуру со временем только расширялось, и сегодня параллелизм является основным способом повышения производительности вычислительных систем.
Для успешного применения параллельных вычислений необходимо выполнение двух условий: наличие нескольких одновременно работающих вычислительных устройств и наличие множества операций, которые можно параллельно выполнять на этих устройствах. Параллельно работающие устройства – это свойство архитектуры компьютера, наличие подходящих для выполнения операций – свойство алгоритма или программы. Число доступных вычислительных устройств определяет максимальное ускорение, которое можно получить при выполнении множества независимых операций на заданном наборе вычислительных устройств по сравнению с выполнением этого же множества операций на одном устройстве. По этой причине для увеличения производительности современных вычислительных систем в их архитектуре стараются объединять всё больше и больше одновременно работающих узлов, процессоров, ядер, ускорителей и других подобных устройств. Вычислительные системы, имеющие максимальную производительность, называются суперкомпьютерами, и такие системы, как правило, обладают и максимальной степенью параллельности в архитектуре. Например, в рамках одного сервера могут объединяться от 2 до 8 процессоров, каждый процессор может иметь в своём составе от 4 до 64 и более процессорных ядер, причём каждое ядро может дополнительно иметь суперскалярную архитектуру, элементы векторной и конвейерной обработки, поддерживать одновременную многопоточность (англ. simultaneous multithreading). В дополнение к этому сервер может содержать несколько ускорителей вычислений, например графических процессоров, каждый из которых содержит от сотен до тысяч специализированных лёгких ядер, кратно увеличивая степень потенциального параллелизма. Именно по такому принципу построено большинство высокопроизводительных вычислительных систем, например суперкомпьютеры Frontier, Fugaku, Sunway TaihuLight или суперкомпьютер МГУ «Ломоносов-2».
Параллельные вычисления опираются на 2 вида параллельной обработки данных: параллельная обработка и конвейерная обработка. В первом случае параллельные устройства работают полностью независимо друг от друга. У конвейера все ступени работают одновременно, но обработка данных на разных ступенях идёт с перекрытием во времени, когда результаты промежуточной обработки последовательно передаются от одной ступени конвейера к другой.
На практике далеко не всегда операции можно выполнять параллельно, во многих случаях порядок строго задан (подобно тому, например, как, для того чтобы сварить борщ, нужно сначала принести из магазина продукты). В вычислительных науках одни операции алгоритма можно выполнить только после выполнения других из-за наличия между ними информационной зависимости (ситуации, когда аргумент для одной операции вычисляется другой операцией), и это всегда уменьшает ресурс параллелизма алгоритма. Для оценки возможного ускорения решения задач на параллельной вычислительной системе часто используют закон Амдала, связывающий ускорение с числом доступных устройств и долей последовательно выполняемых операций. Для идеально параллельного алгоритма время решения задачи на идеально работающей вычислительной системе, состоящей из одинаковых процессоров, сократится в раз по сравнению со временем её решения на одном таком же процессоре. Однако чем выше доля последовательных операций в алгоритме, тем сильнее ускорение решения данной задачи будет отходить от максимального значения Более того, неизбежно возникают накладные расходы на организацию и поддержку собственно параллельных вычислений, что может дополнительно ещё больше уменьшить получаемое ускорение.
Параллельные вычисления привносят новое понятие, которое не возникает в случае классической последовательной организации вычислений, – синхронизация параллельно работающих программных сущностей: программ, процессов, нитей, потоков и др. При этом различные механизмы синхронизации могут быть использованы и для обеспечения определённого порядка выполнения параллельных процессов или их взаимодействия, и для обеспечения их корректного доступа к одним и тем же данным. Примерами элементов синхронизации могут служить семафоры, барьеры, критические секции и др.
Важно и то, что параллельные вычисления заставляют по-иному взглянуть на все основные этапы решения задач на вычислительных системах, поскольку практически все вычислительные системы стали параллельными. Для того чтобы в решении задачи использовать огромный потенциал параллелизма, заложенный в архитектуре компьютера, и тем более суперкомпьютера, у используемого алгоритма должны быть соответствующие параллельная структура и ресурс параллелизма. Традиционные технологии программирования заменяются на технологии параллельного программирования. Весь программный стек компьютерных систем должен быть адаптирован таким образом, чтобы эффективно поддерживать высокую степень параллелизма программ и архитектуры компьютеров.
Согласование элементов параллелизма между всеми этапами решения задач особенно важно для суперкомпьютерных систем и является важной составляющей суперкомпьютерного кодизайна, цель которого – максимально полно использовать большой потенциал, заложенный в архитектуре суперкомпьютеров. В процессе подобного согласования может оказаться, что для эффективного решения задачи на конкретной вычислительной системе необходимо полностью поменять алгоритмический подход, поскольку прежний не отвечал особенностям архитектуры используемого компьютера. Процесс согласования может показать, что необходимо перейти на иную технологию параллельного программирования, лучше отражающую особенности архитектуры, или же внести изменения в исходный текст программы, опираясь на критерии качества параллельных программ.
Поскольку разнообразие параллельных вычислительных систем велико и каждая система обладает своими особенностями, предлагают различные классификации архитектуры компьютеров, объединяя в отдельные классы компьютеры с похожими характерными свойствами. Одна из наиболее распространённых – классификация Флинна, опирающаяся всего лишь на 2 понятия: поток команд и поток данных, каждый из которых может быть либо единичным, либо множественным.
Наряду с параллельными вычислениями часто рассматривают и близкое по смыслу понятие «конкурентное исполнение» (англ. concurrency). Конкурентное исполнение, как и параллельные вычисления, подразумевает выполнение множества процессов (заданий, программ, нитей), но, в отличие от параллельных вычислений, всё это множество может выполняться на единственном устройстве, например на одном процессорном ядре. Если параллельные вычисления нацелены на ускорение вычислений и уменьшение времени решения задач, то конкурентное исполнение может быть направлено на поддержку распределения ресурсов между процессами в режиме разделения, более полную загрузку вычислителя или же на поддержку функционирования моделей сложных объектов и систем.
Параллельная обработка данных имеет множество проявлений в самых разных областях науки и окружающего мира. Более того, параллелизм не просто проявляется, он свойственен окружающему миру. Клетки живого организма функционируют параллельно, как функционируют параллельно города и предприятия, как живут люди. Для обеспечения надёжности работы устройств часто используют дублирование отдельных компонентов, позволяющее сохранить работоспособность системы в целом. Если не хватает пропускной способности автомобильной трассы, то вводят дополнительные полосы, нужно построить большой объект быстрее – привлекают дополнительные бригады, нужно увеличить выпуск продукции – вводят дополнительные производственные мощности, работающие одновременно с существующими и т. д. и т. п. Понятие параллельных вычислений применительно к окружающему миру естественным образом расширяется на более общие понятия параллельных методов решения задач, параллельной обработки данных и параллельного функционирования разного рода систем с сохранением многих базовых понятий параллельных вычислений, таких как производительность, эффективность, масштабируемость, синхронизация и др.