Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Суперкомпьютеры и системы. Мультипроцессоры. Учебное пособие
.pdf
интенсивно используемых элементов данных основной памяти совместно с их адресами – строки кэша. Любое значение, требующееся
процессору и не обнаруженное в кэше (промах кэша), выбирается из
основной памяти и заносится вместе со своим адресом в кэш. В течение всего этого интервала времени процессор вынужденно простаивает. Для размещения новой строки выбирается (и вытесняется в основную память, если ее значение было изменено) наименее нужная в последующем строка (обычно считается, что это такая строка, к которой
процессор дольше всего не обращался). Последующие обращения процессора для выборки/модификации элемента данных по этому адресу
будут сопровождаться его обнаружением в кэше (попадание в кэш).
Изменение процессором значения в кэше либо сразу сопровождается
записью его в основную память (сквозная запись), либо откладывается
до момента вытеснения из кэша (обратная запись). Введение кэша позволяет увеличить степень параллелизма в работе процессора и основной памяти. В последующем появились кэши нескольких разных уровней, различающиеся сочетанием объема и быстродействия (чем ближе
к процессору, тем выше быстродействие, но меньше объем) и назначением (кэш команд, из которого возможна только выборка, и кэш данных, реализующий как чтение, так и запись). Появление кэш-памяти в
многоядерных и многопроцессорных системах привело к возникновению проблемы консистентности (согласованности) памяти, обсуждаемой в разделе 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
