уровень операционной системы_5

## Тема 8. Развитие архитектуры и параллельных вычислений

###

### 8.1. Вопросы разработки компьютеров параллельного действия

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

Несмотря на то, что тактовая частота постоянно растет, скорость коммуникации нельзя увеличивать бесконечно по ряду причин. Серьезным узким местом становятся проводники, например, передача сигнала на 1 см требует 12 циклов процессора (при технологии 2010 года), а в современных процессорах даже вводятся лишние стадии в конвейер выполняющие только "ожидание" сигнала. Скорость света выступает ограничивающим фактором. Нельзя бесконечно уменьшать размеры транзисторов из-за законов квантовой механики (принципа неопределенности Гейзенберга). При высоких тактовых частотах проблему представляет расфазировка (skew) тактовых импульсов – ситуация, когда импульс синхронизации прибывает к разным компонентам в разное время. Высокие тактовые частоты требуют очень низкой расфазировки для корректного функционирования. С повышением частоты все более трудной становится задача рассеивания лишнего тепла. Повышение температуры в свою очередь может приводить к ухудшению надежности. Более того, повышение степени интеграции привело к тому, что уменьшение потребляемой мощности происходит уже не пропорционально уменьшению размеров транзисторов (Dennard law), а медленнее. Поэтому не все транзисторы, предоставляемые технологией изготовления, могут использоваться одновременно: приходится отключать некоторые области чипа (появляется т. н. dark silicon). Для самых современных технологий изготовления проблема имеет катастрофические последствия: для 22 нм 21% чипа должен быть отключен, а для технологии 8 нм ожидается более 50% –80%.

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

Параллелизм может вводиться на разных уровнях.

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

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

Для увеличения производительности в 100, 1000, 1000000 раз необходимо свести воедино многочисленные процессоры и обеспечить их эффективное взаимодействие. Этот принцип реализуется в виде больших мультипроцессорных и мультикомпьютерных систем. Объединение тысяч процессоров в единую систему порождает новые проблемы, некоторые из которых в дальнейшем будут рассматриваться.

В последнее время появилась возможность интеграции через Интернет. Результатом являются слабо связанные распределенные вычислительные сети или решетки.

Когда два процессора (или обрабатывающие элементы) находятся рядом и обмениваются большими объемами данных с небольшими задержками, они называются сильно связанными (tightly coupled). Соответственно, если два процессора располагаются далеко друг от друга и обмениваются небольшими объемами информации с большими задержками, они называются слабо связанными (loosely coupled).

Рассматриваемые системы параллельной обработки иллюстрируются рисунком 8.1.

Рис. 8.1

### 8.2 Внутрипроцессорный параллелизм

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

#### 8.2.1. Параллелизм уровня команд

Параллелизм уровня команд (Instruction Level Parallelism, ILP) – это потенциальное перекрытие нескольких инструкций во времени. Благодаря ILP такие инструкции могут выполняться параллельно, повышая производительность.

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

Однако 15 – 25% всех программных инструкций – условные и безусловные переходы, т.е. между переходами выполняются базовые блоки из 3 – 6 инструкций. С учетом того, что эти инструкции часто зависят друг от друга, выходит совсем немного параллелизма. Поэтому для получения существенного прироста производительности необходимо использовать параллелизм не только внутри, но и между базовыми блоками. Простейший способ увеличения ILP – использование параллелизма итераций цикла. Разворачивание циклов (Loop Unrolling) – увеличение числа инструкций базового блока (копирование тела цикла несколько раз). При этом уменьшается количество ветвлений.

Определение степени зависимости между инструкциями – критический фактор для определения уровня параллелизма в программе. Независимые инструкции могут выполняться одновременно. Зависимые должны выполняться по порядку, однако они могут частично перекрываться во времени.

Следует различать понятия зависимость и конфликт. Зависимость – свойство программы, конфликт, возникший (или не возникший) из зависимости – свойство организации архитектуры. Существует 3 типа зависимостей: зависимости по данным, зависимости по именам, зависимости по управлению.

Зависимость по данным возникает, в случаях:

1. Инструкция i создает результат, используемый инструкцией j.

2. Транзитивный вариант предыдущей ситуации.

Зависимость по данным выражает возможность возникновения конфликта, порядок вычисления результатов, максимальный уровень параллелизма, который может быть использован.

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

Виды:

1. Антизависимость – возникает, если команда_2 записывает в ячейку памяти, которую команда_1 считывает, и команда_1 выполняется первой.

2. Зависимость по выходу – возникает, когда команда_1 и команда_2 пишут результат в одну и ту же ячейку памяти. Порядок выполнения этих команд должен сохраняться.

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

Зависимости по управлению определяют порядок выполнения команд по отношению к команде условного перехода.

Имеются два ограничения, связанные с зависимостями по управлению:

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

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

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

ILP может выявляться компилятором и аппаратно. На широком использовании ILP базируются суперскалярные и VLIW-архитектуры.

#### 8.2.2. Суперскалярные и VLIW-процессоры

Низкоуровневый параллелизм достигается, в частности, выдачей (issue) нескольких команд за один тактовый цикл. Процессоры, в которых реализуется этот принцип, делятся на две категории: суперскалярные и VLIW (Very Long Instruction Word – процессоры со сверхдлинным словом). Схема суперскалярного процессора приведена на рис. 8.2. Суперскалярные процессоры способны за один такт вызывать для выполнения несколько команд (обычно от 2 до 6), что определяется как аппаратной реализацией, так и последовательностью команд.

Другой вид параллелизма реализуется во VLIW-системах. Первые системы действительно отличались длинным словом с командами, которые обращались к различным функциональным блокам, как это показано на рис. 8.3.а. В одной команде этой VLIW-системы содержится пять кодов операций и пять пар операндов. Таким образом, код операции – 6 бит, регистр – 5 бит, память – 32 бита, а общая длина команды 134 бита.

Такое решение показало себя недостаточно гибким, т.к. не каждая команда использовала все доступные функциональные модули, в результате появлялось большое количество пустых операций (на рис. 8.3 б пустые операции nop обозначены «-»).

- - - L - | - - - L - | I - - L - | I I F – S | I – F L S | I I F - S | - - - L - | - - F L S
| Одна команда |  |  |  |  |  |

Рис. 8.3.б

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

Преимущества такого подхода:

· Упрощается аппаратное обеспечение;

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

Однако такое радикальное изменение архитектуры в практику внедрить оказалось нелегко, что подтверждается сложностями распространения процессора Itanium.

##### 8.2.1.1. VLIW-процессор TriMedia

VLIM-процессор TriMedia производства Philips – встроенный процессор для устройств обработки изображений, а также видео- и аудиоустройств.

В состав одной TriMedia-команды может входить до 5 операций. В полностью оптимальных условиях за один цикл запускается одна команда и выбирается пять операций. Номинальная тактовая частота – 226 или 336 МГц, но т.к. выполняется сразу пять операций, то быстродействие выше. Для примера рассматривается процессор ТМ3260. Стандартная команда изображена на рис. 8.4.

Слот 1 | Слот 2 | Слот 3 | Слот 4 | Слот 5
Сложение | Сдвиг | Мультимедиа | Загрузка | Сохранение
Команда

Рис. 8.4.

Команды варьируются от обычных 8-, 16, 32-битных стандартных целочисленных команд до команд с плавающей точкой и команд параллельной обработки мультимедиа. Исполнение пяти операций за цикл и наличие команд параллельной обработки позволяет процессору TriMedia программно декодировать потоковое цифровое видео, поступающее с видеокамеры, сохраняя исходные размеры и частоту кадров.

Память TriMedia с байтовой организацией. Полуслова (16 бит), слова (32 бита) выровнены. Порядок следования байтов может быть как прямым, так и обратным, порядок устанавливается операционной системой. Кэш-память – разделенная, 8-входовая, ассоциативная, длина строки 64 байт. Кэш команд – 64 Кбайт, данных – 16 Кбайт.

Регистры: 128 универсальных 32-разрядных. Значения R0 и R1 равны соответственно машинному нулю и единице. Остальные функционально эквивалентны и могут применяться для любых целей. Кроме того имеется 4 специальных регистра: счетчик команд, слово состояния программы и два регистра, связанных с прерываниями. Имеется 64 разрядный счетчик, подсчитывающий число циклов процессора с момента последнего сброса. При частоте процессора в 300 МГц он рассчитан на 2000 лет.

В процессоре ТМ3260 есть 11 функциональных блоков: операции с константами, АЛУ целочисленных операций, сдвиги, загрузка и сохранение, умножение (целых и с плавающей точкой), АЛУ с пл. точкой, сравнение с ПТ, извлечение корня и деления с ПТ, ветвления, АЛУ ЦОС, умножитель для ЦОС.

Рассмотрим некоторые особенности. Блок загрузки и сохранения выполняет работу с памятью, процессор TriMedia является RISC-процессором с расширенной функциональностью.

Для специальных мультимедийных операций, которые, фактически, выполняются блоком ЦОС (Digital Signal Processor DSP). Используется арифметика с насыщением.

Т. к. некоторые операции и командные слоты не совместимы, то в команду может быть включено менее 5-ти операций. В зависимости от фактического числа операций размер команды может составлять от 2 до 28 байт (включая служебные данные фиксированного размера).

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

В целом процессор TriMedia оказывается высокоэффективным инструментом обработки экспериментальных данных.

#### 8.2.2. Внутрипроцессорная многопоточность

Для современных компьютеров характерно следующее. Если при запросе к памяти требуемые данные не обнаружены в кэшах первого или второго уровней, то на загрузку слова в кэш уходит длительное время, во время которого конвейер простаивает. Одна из методик решения такой проблемы называется внутрипроцессорной многопоточностью (on-chip multithreading). Она позволяет процессору одновременно управлять несколькими программными потоками, тем самым маскируя простои. Общая идея: если программный поток 1 блокируется, процессор может обеспечить полную загрузку аппаратуры, запустив программный поток 2. В отличие от ILP внутрипроцессорная многопоточность опирается на явное указание параллелизма. Каждый поток характеризуется состоянием (инструкции, данные, значения регистров и т. д.). Существуют следующие способы реализации внтурипроцессорной многопоточности: мелкомодульная, крупномодульная, синхронная.

Мелкомодульная многопоточность (fine-grained multithreading), применительно к процессору, способному вызывать одну команду за такт иллюстрируется рис. 8.5.

Поток 1 | А1 | А2 |  |  | А3 | А4 | А5 |  |  | А6 | А7 | А8
Поток 2 | В1 |  |  | В2 |  |  | В3 | В4 | В5 | В6 | В7 | В8
Поток 3 | С1 | С2 | С3 | С4 |  |  | С5 | С6 |  |  | С7 | С8
Мелкомодульная | А1 | В1 | С1 | А2 | В2 | С2 | А3 | В3 | С3 | А4 | В4 | С4
Крупномодульная | А1 | А2 |  | В1 |  | С1 | С2 | С3 | С4 |  | А3 | А4

Рис. 8.5.

Простой конвейера маскируется путем исполнения потоков «по кругу», т. е. в смежных тактах они запускаются по циклу. В случае, когда время обращения в память составляет 2 такта, при трех потоках гарантируется полная загрузка аппаратуры. Т.е при простое в n тактов необходимо иметь n+1 поток.

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

Далеко не всегда число доступных потоков равно числу ступеней конвейера. Поэтому некоторые разработчики предпочитают методику, называемую крупномодульной многопоточностью (coarse-grained multithreading). В этом случае программный поток А выполняется до тех пор, пока не возникнет простой. При этом теряется один такт. Затем происходит переключение на другую задачу. При переключении потока теряется один такт. Кажется, что крупномодульная многопоточность менее эффективна. Это справедливо для большого числа доступных потоков (n+1), а при малом числе потоков крупномодульная многопоточность оптимальна.

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

##### 8.2.2.1. Многопоточность в Pentium IV

Для повышения производительности Pentium без внесения изменений в программный интерфейс рассматривались пять простейших способов.

1. Повышение тактовой частоты.

2. Размещение на одной микросхеме двух процессоров.

3. Введение новых функциональных блоков.

4. Удлинение конвейера.

5. Использование многопоточности.

Увеличение тактовой частоты порождает проблемы увеличения энергопотребления и перегрева микросхемы.

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

Введение новых функциональных блоков не представляет сложности, но в этом случае важно сохранить баланс. Нет смысла вводить большое число функциональных блоков, если скорость выдачи команд ниже производительности блоков.

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

Преимущество многопоточности состоит во введении дополнительных программных потоков, которые позволяют использовать те аппаратные ресурсы, которые в противном случае простаивали бы. Эксперименты показали, что при увеличении площади микросхемы на 5% при реализации многопоточности для многих приложений производительность возрастает на 25%. Первым процессором Intel с поддержкой многопоточности стал Xeon 2002 года. Впоследствии, начиная с частоты 3,066 ГГц, многопоточность была внедрена в линейку Pentium IV. Intel называет реализацию многопоточности hypertreading.

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

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

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

Дублирование ресурсов (resource duplication) – для каждого программного потока требуется свой счетчик команд. Вводится вторая таблица отображения архитектурных регистров (EAX, EBX и т.д.) на физические регистры. Аналогично дублируется контроллер прерываний.

Жесткое разделение ресурсов (partitioned resource sharing) разделение слотов между потоками, например, половина слотов – потоку 1, вторая половина – потоку 2. Это легко реализуется, обеспечивает полную независимость потоков. При полном разделении ресурсов один процессор фактически превращается в два. Недостатки: может сложиться ситуация, когда один из потоков не использует все ресурсы, а другому не хватает.

Противоположность жесткому разделению – полное разделение ресурсов (full resource sharing). В этом случае доступ к ресурсам может получить любой программный поток, а обслуживание осуществляется в порядке поступления запросов. Проблемы могут возникнуть при наличии потоков с различными скоростями выполнения операций (например, один поток использует операции сложения, а второй деления и извлечение корня). Тогда, медленный поток выстроит очередь к конвейеру и полностью заполнит ее. Быстрый поток будет простаивать. Полное разделение решает проблему неоптимального использования ресурсов, но создает проблему дисбаланса их использования.

Промежуточная схема – пороговое разделение ресурсов (threshold resource sharing). Каждый поток получает требуемые ресурсы, но в допустимых пределах (например, 75%).

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

#### 8.2.3. Однокристальные мультипроцессоры

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

##### 8.2.3.1. Гомогенные однокристальные мультипроцессоры

Для малых однокристальных мультипроцессоров имеются два типовых решения.

В первом случае (рис. 8.6 а) присутствует одна микросхема и два конвейера. Теоретически скорость выполнения команд удваивается. Допускается совместное использование ресурсов.

Во втором случае (рис. 8.6 б) в микросхеме предусмотрены два независимых ядра, каждое из которых содержит полноценный процессор. Для реализации этого способа требуется изменение конструкции микросхемы.

##### 8.2.3.1. Гетерогенные однокристальные мультипроцессоры

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

В качестве примера рассмотрим портативный DVD-плеер. Компьютер выполняет следующие действия:

1. управление дешевым и ненадежным сервоприводом, регулирующим положение головки;

2. преобразование аналогового сигнала в цифровую форму;

3. коррекция ошибок;

4. дешифрирование и управление правами;

5. декомпрессия данных видеоформата MPEG-4;

6. декомпрессия звуковых данных;

7. кодирование выходных данных для воспроизведения в телевизионных системах NTSC, PAL или SECAM.

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

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

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

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

В качестве примера рассмотрим архитектуру CoreConnect компании IBM (рис. 8.8). Она предназначена для объединения ядер в однокристальных гетерогенных процессорах и выполняет приблизительно ту же роль, что и шина PCI для Pentium. Но, в отличие от PCI архитектура CoreConnect разрабатывалась без учета обратной совместимости с устаревшими аппаратными компонентами. CoreConnect включает три шины.

Шина процессора представляет собой высокоскоростную синхронную конвейеризированную шину с 32, 64 или 128 информационными шинами, работающими на частоте 66, 133 или 183 МГц. Пропускная способность 23,4 Гбит/с (для сравнения PCI – 4,2 Гбит/с). Конвейеризация позволяет запрашивать шину в процессе передачи данных. Ядра могут одновременно передавать данные по разным линиям. Шина оптимизирована для передачи коротких блоков и призвана обеспечить взаимодействие между быстрыми данными.

Для передачи данных между низкоскоростными устройствами используется периферийная шина. Периферийная шина также является синхронной, ее пропускная способность 300 Мбит/с.

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

Помимо CoreConnect существуют и другие архитектуры:

· AMBA – Advanced Microcontroller Bus Architecture (расширенная шинная архитектура);

· VCI – Virtual Component Interconnect (взаимодействие виртуальных компонентов);

· OCP-IP – Open Core Protocol-International Partnership (международный консорциум по открытому протоколу ядра).

### 8.3 Сопроцессоры

Рассмотрим варианты повышения производительности компьютера за счет введения второго, специализированного процессора. Возможны различные конструктивные реализации сопроцессоров, но все варианты объединяет подчиненная роль сопроцессора по отношению к основному процессору.

#### 8.3.1. Сетевые сопроцессоры

К сети подключаются самые различные устройства. Для конечных пользователей это персональные компьютеры, игровые консоли, карманные компьютеры, сотовые телефоны. Кроме того в сетях функционирует бесчисленное количество разнообразных промежуточных устройств, в их число входят маршрутизаторы, коммутаторы, брандмауэры, прокси-серверы, системы балансировки нагрузки. К этим промежуточным системам предъявляются самые жесткие требования – именно они обеспечивают передачу максимального числа пакетов в секунду. Жесткие требования налагаются на серверы, что же касается пользовательских компьютеров, то к ним особых требований нет.

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

Использование заказных интегральных схем (ASIC – Application-Specific Integrated Circuit). С созданием таких схем связаны проблемы: их долго проектировать и не менее долго производить (около месяца уходит лишь на изготовление кремниевой маски), кроме того, процесс очень сложен и дорог (расходы на изготовление маски для технологии 45 нм оцениваются в среднем в 1 – 5 млн $). Это жестко запрограммированные устройства, для внесения изменений необходимо разрабатывать новую схему. Целесообразно проектировать, если гарантирован массовый сбыт.

Использование программируемых вентильных матриц (FPGA – Field Programmable Gate Array). Такая матрица представляет собой набор вентилей, из которых путем перекоммуникации строится требуемая схема. Достоинства: время производства меньше, стоимость изготовления существенно ниже. FPGA можно перепрограммировать, что позволяет вносить исправления даже после выпуска устройства, а также использовать FPGA для прототипирования ASIC. Кроме того, в настоящее получает распространение динамическая реконфигурация (т. е. устройство может изменять свою функциональность «налету»). Недостатки: достаточно дорогие для больших партий, более медленные, чем схемы ASIC. Находят применение в узкоспециализированных областях.

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

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

Сетевые процессоры оптимизированы для обработки большого числа входящих и исходящих пакетов. По каждой сетевой линии приходят миллионы пакетов, а маршрутизатор поддерживает десятки таких линий. Такое быстродействие может обеспечить процессор в высоким уровнем параллелизма. В процессор обязательно входит несколько PPE-контроллеров (Protocol/Programmable/Packet Processing Engine – программируемая система обработки пакетов и протоколов), каждая из которых состоит из RISC-ядра и внутренней памяти небольшого объема для хранения программы и нескольких переменных.

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

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

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

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

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

Следующий путь – увеличение числа PРE-контроллеров.

Еще один подход – увеличение числа дополнительных специализированных процессоров и интегральных схем.

Можно сократить время прохождения пакетов за счет увеличения количества линий в существующих шинах.

#### 8.3.2. Мультимедиа-процессоры

Мультимедийные процессоры рассмотрим на примере процессора Nexiperia (Philips) – это семейство микросхем для различных тактовых частот. Он представляет собой гетерогенный однокристальный мультипроцессор и включает несколько ядер: управляющий VLIW-процессор TriMedia, а также отдельные ядра для обработки изображений, звука, видео и сетевых операций. Может использоваться как самостоятельный центральный процессор для CD-, DVD-, MP3-плееров, видеокамер и т.п., а также в качестве сопроцессора. В любом режиме Nexiperia работает под управлением собственной операционной системы реального времени.

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

Блок-схема процессора PNX 1500 семейства Nexiperia приведена на рис. 8.10. Процессор имеет четыре основные секции, отвечающие за управление, ввод, обработку и вывод информации. Роль центрального процессора играет 32-разрядный VLIW-процессор TriMedia, работающий на частоте 300 МГц. Функциональность определяет программа, написанная на С или С++.

Если не считать двух кэшей на процессоре TriMedia, на микросхеме нет памяти, а имеется интерфейс для подключения от 8 до 256 Мбайт памяти DDR SDRAM.

Четыре ядра процессора могут работать параллельно, что еще больше повышает его производительность.

#### 8.3.3. Криптопроцессоры

Безопасность, особенно сетевая, является еще одной областью применения сопроцессоров. Вопрос касается не только защиты от несанкционированного доступа, но и безопасности передаваемых данных, что требует создания безопасных (шифрованных) каналов. Т.е. требуется шифрование и дешифрование передаваемых данных, а эта процедура требует большого объема вычислений в масштабе реального времени.

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

Эти процессоры могут представлять собой карты расширения.

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

### 8.4. Мультипроцессоры и мультикомпьютеры

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

### 8.4.1. Мультипроцессоры

В первом случае все процессоры разделяют общую физическую память как показано на рис. 8.11. Такая система называется мультипроцессором или системой с совместно используемой памятью. Мультипроцессорная модель распространяется и на программное обеспечение. Все процессы, работающие вместе на мультипроцессоре, разделяют одно адресное пространство.

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

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

В качестве примеров мультипроцессоров можно назвать Sun Enterprise 10000, Sequent NUMA-Q, SGI Origin, HP/Convex Exemplar.

### 8.4.2. Мультикомпьютеры

Во втором типе параллельной архитектуры каждый компьютер имеет свою собственную память, доступную только этому процессору. Такая разработка называется мультикомпьютером или системой с распределенной памятью. Она изображена на рис. 8.12. Мультикомпьютеры в большинстве случаев являются системами со слабой связью. Ключевое отличие мультикомпьютера от мультипроцессора состоит в том, что каждый процессор в мультикомпьютере имеет свою собственную локальную память и никакой другой процессор не может получить доступ к этой памяти. Мультикомпьютеры содержат отдельное физическое адресное пространство для каждого центрального процессора.

Поскольку процессоры в мультикомпьютере не могут взаимодействовать путем совместного обращения в общую память, то здесь необходим другой механизм взаимодействия. Они посылают друг другу сообщения, используя сеть межсоединений. В качестве примеров мультикомпьютеров можно назвать IBM SP/2, Intel/Sandia Option Red, Wisconsin COW.

При отсутствии памяти совместного использования в аппаратном обеспечении предполагается определенная структура программного обеспечения. В мультикомпьютере невозможно иметь одно виртуальное адресное пространство.

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

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

С точки зрения аппаратной реализации, гораздо проще и дешевле построить большой мультикомпьютер, чем мультипроцессор с таким же количеством процессоров. Реализация общей памяти, разделяемой несколькими сотнями процессоров, - это весьма сложная задача, а построить мультикомпьютер, содержащий 10000 процессоров и более, довольно легко.

### 8.4. 3. Гибридные системы

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

Один из подходов основан на том, что современные компьютерные системы состоят из ряда уровней. Это дает возможность реализовать общую память на любом из нескольких уровней, как это показано на рис. 8.13.

Второй подход – использовать аппаратное обеспечение мультикомпьютера и операционную систему, которая моделирует разделенную память, обеспечивая единое виртуальное адресное пространство, разбитое на страницы. При таком подходе, который называется DSM (Distributed Shared Memory – распределенная совместно используемая память), каждая страница расположена в одном из блоков памяти. Каждая машина содержит свою собственную виртуальную память и собственные таблицы страниц. Если процессор совершает операцию считывания или записи над одной из страниц, которой у него нет, происходит прерывание операционной системы. Затем ОС находит нужную страницу и требует, чтобы процессор, обладающий нужной страницей, преобразовал ее в исходную форму и послал по сети межсоединений. Когда страница достигла пункта назначения, она отображается в память и выполнение программы продолжается. По существу, операционная система просто вызывает недостающие страницы не с диска, а из памяти.

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