Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Суперкомпьютеры и системы. Мультипроцессоры. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
интенсивно используемых элементов данных основной памяти сов­местно с их адресами – строки кэша. Любое значение, требующееся процессору и не обнаруженное в кэше (промах кэша), выбирается из основной памяти и заносится вместе со своим адресом в кэш. В тече­ние всего этого интервала времени процессор вынужденно простаива­ет. Для размещения новой строки выбирается (и вытесняется в основ­ную память, если ее значение было изменено) наименее нужная в по­следующем строка (обычно считается, что это такая строка, к которой процессор дольше всего не обращался). Последующие обращения про­цессора для выборки/модификации элемента данных по этому адресу будут сопровождаться его обнаружением в кэше (попадание в кэш). Изменение процессором значения в кэше либо сразу сопровождается записью его в основную память (сквозная запись), либо откладывается до момента вытеснения из кэша (обратная запись). Введение кэша поз­воляет увеличить степень параллелизма в работе процессора и основ­ной памяти. В последующем появились кэши нескольких разных уров­ней, различающиеся сочетанием объема и быстродействия (чем ближе к процессору, тем выше быстродействие, но меньше объем) и назначе­нием (кэш команд, из которого возможна только выборка, и кэш дан­ных, реализующий как чтение, так и запись). Появление кэш-памяти в многоядерных и многопроцессорных системах привело к возникнове­нию проблемы консистентности (согласованности) памяти, обсуждае­мой в разделе 3.
Конвейерное исполнение машинных операций. В компьютерах третьего поколения отчетливо выявилась блочная структура централь­ного процессора [4, 8]. Выделились блоки выборки команд, дешифра­ции команд, вычисления исполнительных адресов обрабатываемых данных, целочисленной арифметики, арифметики с плавающей точкой. Исполнение каждой CISC-операции последовательно загружает рабо­той один блок за другим, во время работы каждого загруженного блока остальные простаивают. Идея конвейерной обработки состоит в том, чтобы за счет усложнения устройства управления процессора и сов­мещения во времени загрузки разных его блоков обеспечить исполне­ние сразу нескольких машинных операций. Следует отметить, что реа­лизация конвейерной обработки требует разрешения очень сложных вопросов синхронизации этапов выполнения таких последовательно­стей машинных операций, в которых одна из последующих использует результат работы предыдущей. Другая трудность возникает при кон­вейерном исполнении разветвляющихся последовательностей команд, поскольку заранее не может быть точно известно, по какой из ветвей
11
необходимо двигаться. Этим перечень трудностей не исчерпывается, существуют еще и другие сложные проблемы.
Суперскалярность. Это дальнейшее развитие конвейерной обра- ботки, совмещенное с широкой выборкой из памяти нескольких ко­манд за одно обращение [3, 4, 9]. В состав суперскалярного процессора вводятся несколько однотипных блоков, например: три блока целочис­ленной арифметики и два блока арифметики с плавающей точкой. Ес­ли в программе одна за другой следуют несколько операций арифме­тической обработки данных, то их можно выполнять одновременно на разных блоках (естественно, при условии информационной независи­мости от параллельно исполняемых операций).
Векторизация. Программы с большим временем работы, как пра- вило, содержат циклические участки, в которых однотипным образом обрабатываются массивы данных (вектора). Это приводит к идее вве­дения векторных регистров и реализации векторных команд, каждая из которых выполняется сразу несколькими однотипными блоками про­цессора. Например (если имеется n блоков арифметики):
‒ загрузить массив из n элементов в векторный регистр;
‒ сложить каждый элемент векторного регистра с элементами дру­гого массива, выбираемыми из памяти;
‒ умножить каждый элемент векторного регистра на заданное число;
‒ сохранить n элементов векторного регистра в памяти.
Векторизация позволяет существенно уменьшить долю накладных расходов на выборку и дешифрацию команд и на переходы от одной итерации цикла к другой [3, 4].
Все эти архитектурные решения наряду с увеличением быстродей­ствия элементной базы обеспечивали рост производительности в рам­ках основной парадигмы последовательного выполнения команд про­граммы и реализовывались в разных сочетаниях во многих компьюте­рах. На рис. 2.3 в качестве примера такого сочетания представлена функциональная структура одного из первых суперкомпьютеров тре­тьего поколения CRAY-1.
Появление четвертого поколения компьютеров связано с микро­процессорной революцией. Технологической базой компьютеров стали большие и сверхбольшие интегральные схемы. Возникла и стала широ­ко распространяться RISC-структура систем машинных операций (от Restricted / Reduced Instruction Set Computer). Для RISC-процессоров характерны следующие особенности, облегчающие реализацию внут­реннего параллелизма: фиксированный размер и простой формат ма­шинной команды, большое количество регистров общего назначения,
12
все операции обработки данных существуют только в формате «ре-
(
гистр–регистр», для работы с памятью обычно существуют только две операции – прочитать в регистр из памяти и записать из регистра в па­мять. Популярные семейства процессоров, имеющих сложные системы команд, такие как Intel-x86, стали реализовываться в виде CISC­обертки вокруг RISC-ядра. Это означает, что устройство управления процессора преобразует каждую выбранную CISC-команду в последо­вательность (обычно от двух до шести) RISC-команд и затем обеспе­чивает их выполнение.
Подсистема управления командой
Процессор
(подсистема конвейеров)
Конвейеры
операций
над адресами (2)
Конвейеры скалярных
операций (4)
Конвейеры
операций
с плавающей
точкой (3)
Конвейеры векторных
операций (3)
Рис. 2.3. Функциональная структура компьютера CRAY-1
Буферы (кэши) команд
Подсистема
регистров
Адресные
регистры 24 бита
8 × 24)
Скалярные
регистры 64 бита
(8 × 64)
Векторные
регистры 64 бита
(8 × 64)
Подсистема памяти
и ввода-вывода
Оперативная память
Устройство управления
вводом-выводом
Каналы
ввода-вывода
Кэширование памяти, конвейеризация, суперскалярность и вектор­ные расширения стали реализовываться уже не в единичных наиболее продвинутых компьютерах, а в массовых, широко распространенных.
13
Соответственно, достижение рекордных показателей производитель­ности суперкомпьютеров стало возможным только путем реализации такого явного параллелизма, который невозможно не принимать во внимание при разработке прикладной программы.
Более того, стало достаточно очевидным, что производительность одного последовательно выполняющего машинные операции вычисли­тельного устройства, построенного по принципам фон Неймана, имеет верхний предел. Время выполнения таких операций зависит от частоты переключений транзисторов, составляющих устройство, и от скорости распространения электромагнитной волны по проводникам между транзисторами. Увеличение частоты переключений приводит к повы­шению тепловыделения и росту взаимных помех и не может быть бес­предельным. Хорошо известно, что тактовая частота процессоров, по­стоянно увеличивавшаяся вплоть до конца 1990-х годов, остановилась на значении порядка трех гигагерц. Скорость распространения элек­тромагнитной волны в проводниках можно считать постоянной, по­этому для уменьшения времени распространения сигнала нужно уменьшать расстояние между транзисторами, т. е. уменьшать их раз­меры и плотнее упаковывать транзисторы на кристалле. Однако и раз­меры транзисторов, а следовательно, и плотность их размещения на чипе тоже имеют свои предельные значения, которые оказались прак­тически достигнуты вскоре после начала третьего тысячелетия.
Таким образом, дальнейший рост производительности оказался возможным только на пути объединения нескольких (многих) после­довательных компьютеров в параллельную вычислительную систему. Вероятно, существуют пределы и для этой тенденции. Одним из фак­торов, способных затормозить дальнейший рост производительности суперкомпьютеров, является энергопотребление. Наиболее энергоэф­фективные суперкомпьютеры на каждый терафлопс (триллион опера­ций с плавающей точкой в секунду) потребляют мощность от 0.16 до
0.5 кВт (не считая примерно таких же затрат электроэнергии на отве­дение выделяемого тепла). Общая потребляемая одним суперкомпью­тером мощность составляет десятки тысяч киловатт. Рост производи­тельности, например на три порядка, должен привести к тому, что су­перкомпьютер будет потреблять уже десятки миллионов киловатт, что сопоставимо с энергопотреблением довольно большого города.
14
3. ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ С ОБЩЕЙ ПАМЯТЬЮ
Переход к вычислительным системам с явным параллелизмом, кото­рые во многих источниках определяются как пятое поколение компью­теров, привел к возникновению значительных трудностей в программи­ровании. Прикладному программисту для решения его задачи оказалось необходимым знать и уметь использовать принципы параллелизма как основной способ исполнения программы. Это далеко не просто, по­скольку видов параллелизма, как и способов его использования, суще­ствует довольно много.
Предпринималось очень много попыток автоматизировать процесс распараллеливания последовательной программы. К сожалению, суще­ственных успехов на этом пути достичь не удалось. Кроме того, дела­лось большое количество попыток разработать удобные и эффективные языки параллельного программирования (как вариант – модификации / расширения известных широко распространенных языков последователь­ного программирования). В этом направлении достижения можно считать более весомыми, однако единого универсального решения проблемы найти пока также не удалось. Существующие языки и технологии парал­лельного программирования являются довольно узкоспециализирован­ными для того или иного вида параллелизма или даже конкретного вида оборудования. В то же время современные суперкомпьютеры обычно представляют собой конгломерат разнообразных параллельных техноло­гий. В итоге прикладному программисту для эффективного применения параллельной вычислительной системы приходится овладевать целым стеком различных языков и технологий.
Экспериментальные параллельные вычислительные системы раз­личных классов появлялись на всех этапах создания и использования средств вычислительной техники и всегда оказывали большое влияние на выбор дальнейших путей их развития. Одними из первых таких си­стем были представители класса «Один поток команд, много потоков
15
данных» Illiac-IV, ICL-DAP, Connection Machine, MasPar и другие. Не­достаточно развитая элементная база того времени не позволила ком­пьютерам этой архитектуры добиться кардинальных преимуществ над системами других классов по производительности. В то же время сто­имость этих экспериментальных образцов была чрезвычайно высокой. Поэтому интерес к системам класса ОКМД (SIMD) на долгое время пропал. Тем не менее системы этого класса возродились на новом вит­ке спирали развития в качестве вычислительных акселераторов и гра­фических процессоров, которые будут рассмотрены в разделе 4, сего­дня они вносят весьма существенный вклад в производительность многих суперкомпьютеров.
В настоящем разделе обсуждаются некоторые архитектуры парал­лельных систем класса МКМД, структура которого показана на рис. 3.1.
Мультипроцессоры
UMA
SMP PVP ccNUMA ncNUMA
Рис. 3.1. Структура класса «Много потоков команд, много
COMA NUMA МРР COW
потоков данных»
МКМД
Мультикомпьютеры
Класс МКМД делится на два больших подкласса: мультипроцессо­ры – системы с общедоступной памятью, прямо адресуемой во всех процессорах, и мультикомпьютеры – системы с распределенной памя­тью, совместное функционирование которых обеспечивается путем обмена сообщениями.
Существует три типа мультипроцессоров, отличающихся друг от друга механизмами доступа к общей памяти. Они называются UMA (Uniform Memory Access – однородный доступ к памяти), NUMA (Nonuniform Memory Access – неоднородный доступ к памяти) и СОМА (Cache Only Memory Access – доступ только к кэш-памяти).
16
Мультикомпьютеры (иногда этот подкласс обозначают как NORMA – NO-Remote Memory Access) представлены двумя типами: МРР (Massively Parallel Processor – массивно-параллельные процессо­ры) и COW (Cluster of Workstations – кластер рабочих станций). Архи­тектурно они совершенно одинаковы, различия между ними состоят в том, являются ли общедоступными на рынке составляющие их компо­ненты (процессоры, блоки памяти, сетевые устройства …).
К категории МРР (Massively Parallel Processor – процессор с массо­вым параллелизмом) относятся дорогостоящие суперкомпьютеры, ко­торые состоят из большого количества мощных процессоров, связан­ных высокоскоростной, как правило, проприетарной коммуникацион­ной сетью или сразу несколькими сетями.
Вторая категория мультикомпьютеров включает в себя обычные персональные компьютеры или рабочие станции (иногда смонтирован­ные в стойки), которые связываются в соответствии с той или иной коммерческой коммуникационной технологией. С точки зрения логики принципиальной разницы здесь нет, но мощный суперкомпьютер стои­мостью в миллионы и десятки миллионов долларов безусловно исполь­зуется иначе, чем собранная обычными пользователями компьютерная сеть, которая обходится во много раз дешевле любой МРР-машины. Эти «доморощенные» системы иногда называют сетями рабочих станций (Network of Workstations – NOW), кластерами рабочих станций (Cluster of Workstations – COW) или просто кластерами (Cluster).
За тот период времени, в течение которого составляется рейтинг Top-500 суперкомпьютеров, существенно изменились архитектуры наиболее высокопроизводительных вычислительных систем, что отра­жено в таблице. Если системы класса ОКМД и системы, основанные на одиночных процессорах, исчезли из категории «супер» уже к 1997 го­ду, то системы подкласса SMP держались в ней до 2001 года. Системы подкласса Constellation – созвездие – являются чем-то средним между MPP-системами и кластерами. Constellation – это кластер, содержащий большие SMP-системы в качестве вычислительных узлов, причем ко­личество узлов меньше, чем количество процессоров на узел. Посте­пенно по мере развития кластерных технологий связь между количе­ством узлов и процессоров в узле потеряла свое значение и все класте­ры, содержащие SMP-системы в узлах, перестали относить к категории Constellation. Поэтому системы этого подкласса в данном пособии не рассматриваются.
17
Создание высокопроизводительных параллельных вычислительных систем было постоянно связано с необходимостью решать очень слож­ные технические проблемы самого разнообразного характера: органи­зация взаимодействия все возрастающего количества процессоров друг с другом, согласование скоростей работы процессоров, модулей памя­ти и соединяющих их коммуникационных сетей, разработка и выбор оптимальной топологии таких сетей и т. д.
Количество архитектур суперкомпьютеров по годам
Год
1993 92 32 233 143 1994 45 27 216 212 1995 22 7 194 261 16 1996 3 7 183 288 19 1997 263 226 10 1 1998 255 226 17 2 1999 169 258 66 7 2000 11 346 115 28 2001 57 257 143 43 2002 203 204 93 2003 163 127 210 2004 99 107 294 2005 103 36 361 2006 108 31 361 2007 91 3 406 2008 88 2 410 2009 81 2 417 2010 84 2 414 2011 89 1 410 2012 89 411 2013 77 423 2014 71 429 2015 74 424 2016 68 432
Single
Processor
SIMD SMP MPP Constellation Cluster
18
При этом для всех параллельных вычислительных систем с обще­доступной памятью, т. е. мультипроцессоров, характерно возникнове­ние очень серьезной проблемы согласованности (консистентности) памяти [10, 11], которой не существует в однопроцессорных компью­терах. В таких системах основная память, как правило, состоит из не­скольких блоков / модулей / банков. Процессоры могут иметь один или несколько кэшей разных уровней.
Суть возникающей при этом проблемы иллюстрируется таким частным случаем: пусть процессоры P времени t дый в своем кэше. Пусть t
и t2 соответственно изменяют значение переменной X каж-
1
< t2. Обозначим через x0 значение этой пе-
1
ременной до вышеуказанных изменений; через x рованное первым процессором; через x
и P2 в очень близкие моменты
1
– значение, сформи-
– значение, сформированное
2
1
вторым процессором. Пусть для простоты других изменений значения переменной X не выполняется. Если процессоры P которых, в принципе, могут быть P ментов времени t
и t2 несколько раз читают из памяти переменную X,
1
и P2) в близких окрестностях мо-
1
и P4 (в качестве
3
то какие последовательности прочитанных ими значений можно счи­тать допустимыми с точки зрения использования в исполняемых про­цессорами программах? Близость моментов времени означает, что длительность интервалов между ними сопоставима с длительностью цикла памяти или такта работы процессора.
В принципе, можно представить себе, что каждый из процессоров независимо от других может получить любую из следующих последо­вательностей значений: {x
, x0, x1}, {x2, x1, x0}. При двух процессорах, читающих переменную X,
{x
2
, x1, x2}, {x0, x2, x1}, {x1, x0, x2}, {x1, x2, x0},
0
количество разных вариантов для рассматриваемого случая равно 36:
, x1, x2}, {x0, x1, x2}}, {{x0, x1, x2}, {x0, x2, x1}}, …. Для простоты здесь
{{x
0
не приведены ситуации, когда некоторый процессор получает не три разных значения, а два (например, {x одно ({x
, x2, x2}).
2
, x0, x2} или {x0, x2, x2}) или даже
0
Ясно, что не все возможные сочетания таких последовательностей выборки данных из памяти допустимы с точки зрения исполняемой про­граммы. Некоторые из них могут приводить к ошибкам вычислений, поскольку разные процессоры при выполнении одной и той же про­граммы могут получать разные последовательности значений одной пе­ременной. Поэтому требуется обеспечить определенную согласован­ность состояний памяти с точки зрения программ, выполняющихся в разных процессорах, пусть даже ценой некоторого уменьшения общего быстродействия.
19
Различают следующие основные модели согласованности (здесь нужно отметить, что в будущем возможно появление других более со­вершенных моделей, поскольку от модели согласованности памяти существенно зависят характеристики системы, и исследования в этом направлении непрерывно продолжаются):
строгая согласованность;
последовательная согласованность;
процессорная согласованность;
слабая согласованность;
свободная согласованность.
В случае строгой согласованности память всей системы обслужи­вает полностью каждый очередной запрос на запись значения и только затем переходит к следующему запросу. В этом случае для рассматри­ваемого примера каждый процессор, троекратно читая переменную X в моменты времени, близкие к t довательностей значений: {x
и t2, будет получать одну из трех после-
1
, x0, x2}, или {x0, x2, x2}, или {x0, x1, x
0
}.
2
Отличаясь простотой и удобством для программирования, данная мо­дель оказывается малоэффективной, поскольку при ее использовании исключается возможность применения ряда эффективных механизмов многоуровневого кэширования и конвейеризации памяти.
Последовательная согласованность – это модель, обеспечиваю­щая одинаковое представление порядка обработки одновременно по­ступающих запросов к памяти для каждого процессора вычислитель­ной системы. Другими словами, если память одному процессору выдает последовательность значений {x гой процессор не сможет получить последовательности вида {x или {x {x
, x1, x0}, …. Только {x0, x2, x1}, или {x0, x1, x1}, или {x2, x2, x1}, или
2
, x1, x1}.
1
, x2, x1} переменной X, то никакой дру-
0
, x1, x2},
0
Процессорная согласованность предполагает, что, во-первых, каждый из процессоров читает то значение переменной, которое он записал в последней операции, и, во-вторых, что последовательность значений одного элемента памяти «видна» всем процессорам одинако­вой. Если процессор P
выполняет запись значений {x0, x1, x2} в пере-
1
менную X именно в таком порядке, то все другие процессоры увидят эти значения именно в этой последовательности. Иными словами, ни­когда не произойдет такого, чтобы какой-либо процессор сначала уви­дел значение x
, а затем значение x1. Тем не менее остается много «сте-
2
20