В звездообразной топологии каждый ЦП располагает выделенной системной шиной, а поэтому отсутствует необходимость в разделении доступа. Системные шины всех ЦП подключаются непосредственно к набору микросхем. Хотя такая архитектура и позволяет минимизировать зависимость производительности ЦП от пропускной способности системной шины, но налагает очень высокие требования на НМС и системную плату в целом, усложняя их проектирование и увеличивая стоимость производства. Тем не менее и этот подход не позволяет подключить большое количество ЦП — звездообразная топология применяется, как правило, в системах с двумя или четырьмя процессорами.
Довольно интересный пример звездообразной топологии — четырехпроцессорные серверы Fujitsu PRIME-POWER 450. В их основу положен принцип скоростного универсального коммутатора, работающего на тактовой частоте 220 МГц, который и выполняет все основные функции набора микросхем. К нему по выделенным 128-бит 220-МГц шинам (110 МГц с применением технологии DDR) подключаются ЦП SPARC64 V с тактовой частотой 2 ГГц и выше. Далее к нему же подключаются два контроллера оперативной памяти (DDR SDRAM 110 МГц), каждый из которых располагает своим 128-бит каналом данных, и два моста шины PCI — по 110-МГц 64-бит каналам. Эта схема обеспечивает скоростной обмен данными между всеми узлами, но добавление, например, еще четырех ЦП и двух контроллеров оперативной памяти потребует серьезной перепроектировки коммутатора.
У систем с коммутируемой топологией нет проблем масштабируемости, свойственных вышеперечисленным шинным архитектурам. В этой архитектуре ЦП подключаются не к НМС (который может отсутствовать), а к коммутатору, соединенному с другими коммутаторами. Механизм подключения может быть как простым (широкая общая шина), так и иерархическим (древовидная иерархическая структура). На основании такой топологии можно проектировать системы с большим количеством ЦП (до 1024).
Рассмотрим коммутируемую топологию на примере 16-процессорных серверов HP AlphaServer GS160. В основе архитектуры лежит так называемый Quad Building Block (QBB), содержащий четыре ЦП Alpha 21264B (EV68C) с тактовой частотой до 1,22 ГГц, до 16 Мбайт B-cache на каждый ЦП, четыре модуля регистровой SDRAM ЕСС общим объемом до 32 Гбайт, два модуля стабилизатора питания, два 64-бит 33-МГц РСI-интерфейса, собственно коммутатор и интерфейс GlobalPort для связи с другими коммутаторами.
Четыре таких QBB объединяют в двухуровневую древовидную структуру через главный коммутатор, находящийся на отдельном модуле и обеспечивающий пропускную способность между двумя отдельно взятыми QBB по 1,75 Гбайт/с в каждом направлении.
Особняком стоят системы, в которых контроллер оперативной памяти, а часто и контроллеры периферийных шин интегрированы в ядро ЦП, а поэтому необходимость в системной шине отпадает. Такие системы строятся по NUMA-архитектуре, о которой пойдет речь дальше. Их можно рассматривать как представителей коммутируемой топологии.
Доступ к памяти в многопроцессорных системах
Независимо от количества ЦП в системе и топологии системной шины, им придется разделять доступ к общему пространству оперативной памяти, за исключением случаев, когда используется сегментирование аппаратных ресурсов некоторого сервера или суперкомпьютера для запуска нескольких копий ОС. В настоящее время существуют три типа доступа к оперативной памяти в многопроцессорных системах:
классический SMP (Symmetrical Multi-Processing, симметричная многопроцессорность);
распределенный SMP (distributed SMP);
NUMA (Non-Uniform Memory Access, неоднородный доступ к памяти).
Первоначальная модель симметричней многопроцессорности, теперь называемая классической, предусматривала, что все ЦП в системе имеют доступ к физически единому пространству оперативной памяти, обслуживаемому специальным контроллером. Все ЦП равнозначны по уровню прав доступа, какие-либо механизмы приоритетности отсутствуют, системная логика обрабатывает запросы в порядке поступления, и только на нее возложены все функции по работе с оперативной памятью. Соответственно задержки при доступе к памяти одинаковы для всех ЦП при обращении к любой области памяти. Это наиболее простая модель организации доступа к памяти в многопроцессорных системах, но не самая производительная и не позволяющая подключать большое количество ЦП из-за объективных проектировочных ограничений.
Принцип распределенной многопроцессорности предполагает формирование из имеющихся в системе ЦП логических групп, каждая из которых располагает своим (локальным) объемом оперативной памяти. Естественно, что для обеспечения целостности и нормального функционирования всего пространства оперативной памяти эти логические группы должны быть как-то связаны между собой. Задержки при доступе к памяти будут соответственно различны в зависимости от того, происходит обращение к локальной или удаленной области памяти.
Следует понимать, что, несмотря на некоторое сходство, распределенная SMP — не частный случай коммутируемой архитектуры: в последней могут быть реализованы как SMP, так и NUMA. Например, в вычислительном комплексе Intel Profusion восемь ЦП Intel Xeon разделены на две группы по четыре ЦП и связаны коммутатором, к которому подключается НМС с контроллером оперативной памяти. Таким образом, при обращении к памяти все процессоры равноправны и Intel Profusion представляет собой классическую SMP-систему. А вот описанный выше сервер HP AlphaServer GS160 спроектирован по принципу распределенной многопроцессорности.
Принцип неоднородного доступа (NUMA) состоит в явном разделении на локальную и удаленную память для каждого ЦП. Так как главный недостаток коммутируемой архитектуры — относительно низкая скорость обмена информацией между коммутаторами, возникла идея интегрировать контроллер памяти в ядро ЦП. Модули оперативной памяти в этом случае подключаются напрямую к ЦП (без НМС). В многопроцессорной системе такому ЦП придется запрашивать информацию из оперативной памяти других ЦП и отвечать на их запросы. Модель памяти называется неоднородной, потому что скорость доставки данных из локальной оперативной памяти ЦП будет значительно выше,, чем из оперативной памяти, подключенной к другому ЦП, причем разница будет все более ощутимой с увеличением количества ЦП в системе.
Модели с распределенной многопроцессорностью и неоднородным доступом позволяют создавать более масштабируемые решения, чем классическая SMP. Однако они предъявляют некоторые специфические требования к ОС, которая должна оптимизировать загрузку процессоров таким образом, чтобы процесс, выполняемый на одном ЦП, как можно реже использовал информацию, находящуюся в локальной оперативной памяти другого ЦП.
Современные серверные процессоры
Intel Xeon
Сегодня наиболее распространенные серверные ЦП — семейство Intel Xeon с архитектурой NetBurst, выполненные по технологии Hyper-Threading (все современные), совместимые по набору команд с другими ЦП архитектуры х86. Фактически это серверные версии соответствующих ЦП семейства Pentium 4, отличающиеся возможностью работы в многопроцессорном режиме и корпусом Socket 604 (ранее Socket 603). В семейство входят два типа процессоров: Xeon DP (Dual Processor) и Xeon MP (Multi Processor). Как следует из названий, Xeon DP может быть использован максимум в двухпроцессорных конфигурациях, а Xeon МР — в четырехпроцессорных. Впрочем, с помощью технологий, подобных Intel Profusion, указанные ограничения могут быть преодолены. Все ЦП рассчитаны на системы с топологией общей шины. В настоящее время существенных отличий между Xeon DP и Xeon MP не наблюдается, различаются только частоты системной шины: 200 и 166 МГц соответственно.
Архитектура NetBurst обеспечивает очень высокие тактовые частоты благодаря длинным конвейерам основных ФУ — 20 стадий целочисленных конвейеров для ЦП, изготавливаемых по 180-нм и 130-нм проектным нормам и 31 стадия для ЦП, выполненных по 90-нм техпроцессу (в обоих случаях не считая стадий декодирования). Так как все ЦП архитектуры NetBurst (Xeon, Pentium 4 и Celeron) имеют общую функциональную логику, незначительно изменяемую при переходе на новые проектные нормы, то все те недостатки, присущие ядрам ЦП Pentium 4 (Willamette, Northwood, Prescott), свойственны и модельному ряду Xeon. Известно, что для достижения стабильной работы на высоких частотах конвейерам NetBurst часто приходится отрабатывать «холостые» такты для синхронизации соседних стадий. Кроме того, большая длина конвейера делает его более чувствительным к ошибкам при предсказании условных переходов, так как больше времени уходит на сброс и перезаполнение конвейера.
Декодер х86-команд не синхронизирован с конвейерами ФУ и производит выборку (в том числе и упреждающую) в кэш микрокоманд (trace cache) со скоростью одна команда х86 за такт. Это оказывается эффективным при многократном исполнении одного и того же кода с достаточной временной локализацией (нет необходимости декодировать команды многократно), хотя упреждающее декодирование может засорять кэш. Согласно данным Intel, размер этого кэша 12 288 микрокоманд. Данные о длине микрокоманд в документации не представлены, но, по некоторым данным, она составляет до 10 байт в зависимости от версии ядра. Если же учесть, что после декодирования одна команда х86 преобразовывается обычно в две-три внутренние микрокоманды, то кэша микрокоманд хватит для хранения 4—6 тыс. х86-команд.
Ядро NetBurst имеет Е-box, состоящий из трех конвейеров (два для выполнения простых микрокоманд и один для обработки сложных и редко используемых). При этом два «простых» конвейера входят в состав так называемого Rapid Execution Engine, работающего на удвоенной частоте ядра.
А-box также состоит из трех конвейеров (один обрабатывает микрокоманды загрузки целочисленных данных, один — сохранения целочисленных данных и один — загрузки/сохранения/перемещения вещественных данных). Оба адресных конвейера по работе над целочисленными данными также являются частью Rapid Execution Engine. F-box представлен одним универсальным конвейером, предназначенным для проведения расчетных операций над командами из наборов х87, ММХ и SSE. Обслуживают перечисленные конвейеры шесть планировщиков, осуществляющих выборку из кэша микрокоманд и помещающих их в соответствующие очереди. Каждый планировщик обслуживает отдельный конвейер: по одному на каждый «быстрый» целочисленный, один — на комплексный целочисленный, один — на оба целочисленных адресных, один — на вещественный адресный и один — на вещественный конвейер. Вполне естественно, что оба планировщика, обслуживающих целочисленные конвейеры, — часть Rapid Execution Engine, в отличие от обслуживающего целочисленные адресные конвейеры — он работает на частоте ядра ЦП. Для увеличения производительности целочисленных конвейеров файл их регистров работает на удвоенной частоте ядра ЦП.