Компьютеры SIMD и другие
Массивно параллельные и векторные процессоры
Общие сведения о системах SIMD. При решении научно-технических и инженерных задач часто возникает необходимость вычисления векторных величин. Вектором называют совокупность (массив, матрицу, группу) данных, расположенных в ячейках памяти с упорядоченными адресами. При векторной обработке данных с помощью одной команды выполняется операция (например, сложение) над всеми элементами вектора. Для реализации векторной обработки в состав процессора вводят дополнительные средства (векторные регистры, векторные команды и т.д.).
Векторные команды способствуют повышению быстродействия процессора за счет уменьшения потерь времени на организацию вычислительного цикла благодаря тому, что в команде:
=> для выполняемой операции задается конфигурация активных частей конвейера. Отметим, что в целях достижения повышенного быстродействия может быть использовано несколько арифметических конвейеров, а отдельные устройства конвейерной линии могут содержать собственные конвейеры для выполнения возложенных на них подфункций;
=> указывается начало вектора в памяти (или блоке регистров) и его длина, размер и тип элементов вектора (целое число, число с плавающей точкой и т.д.), а также местоположение вектора-результата. Таким образом, векторная команда наряду с обеспечением содержательной операции над элементами вектора выполняет функции управления вычислительным циклом.
Системы, ориентированные на вычислительные задачи векторных величин, называют системами SIMD (Single-Instruction-Multiple-Data — одиночный поток команд и множественный поток данных) или матричными системами [9J. В таких системах вся последовательность команд формируется в управляющем процессоре и направляется к процессорным элементам данных (процессорам — см. рис. 17.5Д § 17.2), состоящим из простейших узлов (ALU, память) в виде регулярной решетки и обеспечивающим простое взаимодействие с соседними узлами. В системах SIMD помимо векторных команд также используются сксмярные команды, выполняющие обычные команды над одиночными данными.
Рассмотрим два вида процессоров для обработки векторных величин. Несмотря на то что процессоры выполняют одни и те же команды (например, попарно складывают элементы для двух векторов), между ними имеются существенные отличия.
Процессоры для обработки массивов (Array Processor). Их также называют массивно-параллельными процессорами 116|. Процессоры состоят из большого числа элементарных процессоров, которые выполняют одну и ту же последовательность команд применительно к разным наборам данных. Блок управления процессора рассылает команды, которые выполняются всеми элементарными процессорами одновременно. При этом каждый элементарный процессор использует свои собственные данные из своей собственной памяти, загрузка которых осуществляется во время инициализации. Представителями массивно-параллельных процессоров являются ILLIACT IV, СМ-2 и Maspar МР-2. Несмотря на общую структуру, они отличаются друг от друга:
=> типом обрабатывающих (процессорных) элементов, в качестве которых применяются как простейшие 1-, 8- и 32-битные АЛУ, так и сложные устройства, способные выполнять операции с плавающей точкой. Например, в процессорах СМ-2 используются самые простые обрабатывающие элементы — 1-битные АЛУ. При выполнении операций каждое АЛУ получает 1-битные операнды из своей локальной памяти и биты из слова состояния программы. Результатом операции является 1 бит данных и несколько флаговых битов. В частности, для сложения двух целых 32-битных чисел блоку управления нужно транслировать команду 1-битного сложения 32 раза. Если на одну команду затрачивается 600 нс, то для сложения целых чисел потребуется 19,2 мкс. Благодаря наличию 65 536 обрабатывающих элементов процессор обеспечивает более 3 млрд сложений в секунду, затрачивая на одну операцию сложения 300 пикосекунд;
=> схемой соединения обрабатывающих элементов друг с другом. Практически применимы все топологии, приведенные на рис. 17.6 (§ 17.3), однако чаще всего используются прямоугольные решетки, поскольку они подходят для задач с матрицами и обеспечивают расширяемость системы;
=> способностью не выполнять или выполнять текущую команду. Блок управления сообщает, какую следующую команду должен выполнить обрабатывающий элемент. Однако во многих процессорах каждый обрабатывающий элемент может выбирать на основе некоторых локальных данных (например, на основе битов кода условия), выполнять ему эту команду или нет.
Массивно-параллельные процессоры выпускаются до сих пор, но занимают незначительную нишу компьютерного рынка, поскольку эффективны при решении только таких задач, которые требуют одновременного выполнения одних и тех же вычислений над разными наборами данных. Хотя массивно-параллельные процессоры могут выполнять некоторые операции гораздо быстрее, чем рассмотренные ниже векторные процессоры, однако они требуют большего количества аппаратного обеспечения и, кроме того, для них сложно писать программы [16].
Векторные процессоры (Vector Processor). Этот тип компьютеров предназначен для параллельного выполнения операций над векторными и скалярными величинами. Используется четыре формы операций: => Aj—f(B/) — операция, выполняемая над каждым элементом Bt одного вектора; результатом является элемент Адругого вектора. Примером может служить извлечение квадратного корня или вычисление тригонометрической функции;
=> a =/2(А) — операция над входным вектором А, представленным совокупностью элементов, в результате которой получается скаляр а,
например суммирование всех элементов Аа = X А/;
=> Aj =/з(В/, С/) — операция над элементами двух векторов, например сложение или умножение элементов В{ и С,;
=> Aj =/4(0, Bj) — операция скаляра а (операнда) с элементами В, вектора. Например, умножение каждого элемента Bj вектора на константу а.
Все обычные операции с векторами могут производиться с использованием этих четырех форм. Например, для получения скалярного произведения двух векторов сначала перемножаются соответствующие элементы векторов (/3), а затем складываются полученные результаты (f2).
Векторные процессоры содержат векторный регистр, состоящий из набора стандартных регистров, которые последовательно загружаются из памяти при помощи одной команды. Команда сложения попарно складывает элементы двух векторов, загружая их из двух векторных регистров в суммирующее устройство с конвейерной структурой. В результате на выходе суммирующего устройства формируется другой вектор, который помещается в векторный регистр или сразу используется в качестве операнда при выполнении другой операции с векторами. Для программистов векторный процессор похож на массивно-параллельный процессор. Он также эффективен при выполнении последовательности операций над парами элементов данных. Однако, в отличие от массивно-параллельного процессора, все операции сложения выполняются в одном блоке суммирования, который имеет конвейерную структуру.
Конвейерная структура обусловлена операциями с плавающей точкой, которые требуют выполнения нескольких шагов. В качестве примера рассмотрим выполнение операции вычитания 9,212x1011 из 1,082х 1012 [16J:
=> шаг 1 — вызов операндов 9,212x1011 и 1,082х1012;
=> шаг 2 — выравнивание порядков экспоненты. Для этого можно снизить порядок уменьшаемого (10,82х 1011) или увеличить порядок вычитаемого (0,9212х 1012). При этом уменьшение порядка может вызвать переполнение мантиссы (исчезновение старших разрядов мантиссы), а увеличение порядка может привести к антипереполнению (исчезновению младших разрядов мантиссы). Антипереполнение менее опасно, поскольку число антипереполнений можно округлить нулем. Поэтому целесообразно привести оба порядка к 12: 1,002x1012, 0,9212х1012;
=> шаг 3 — вычитание: 1,002x1012—0,9212x1012 = 0,0808x1012;
=> шаг 4 — нормализация результата: 8,08x1010.
Для выполнения многошаговых простейших операций лучше всего использовать конвейер.
Для того чтобы получить более детальное представление о векторных процессорах, рассмотрим суперкомпьютер Сгау-1, который выбран из-за его простоты и наглядности в отношении особенностей организации комбинаций конвейерной и векторной обработок данных.
Конвейерно-векторный суперкомпьютер Сгау-1. На рис. 20.1 изображена упрощенная структура суперкомпьютера Cray-1, в котором реализован конвейер команд, а также многочисленные конвейеры для различных арифметических и логических операций скалярной и векторной обработки 64-разрядных слов с плавающей точкой (порядок — 15, мантисса — 49 разрядов), 64- или 24-разрядных слов с фиксированной точкой и 22-разрядных адресов. Для уменьшения времени «разгона» конвейеры имеют небольшое число рабочих позиций (указано на рисунке в скобках).
Для поддержки конвейерной и векторной обработки используются быстрые регистры (с временем доступа 6 нс), освобождающие от необходимости обращения к оперативной памяти при выполнении векторных операций и обеспечивающие высокий темп загрузки конвейеров и информационные связи между ними. К ним относятся:
=> группа из восьми векторных 64-битных регистров, каждый из которых может содержать 64-элементный вектор с плавающей точкой.

Рис. 20.1. Конвейерно-векторный суперкомпьютер Сгау-1
Хранящиеся в регистрах операнды используются во всех векторных операциях. Хотя векторные регистры могут взаимодействовать с памятью, однако такие перемещения данных невыгодны, и их следует свести к минимуму;
=> восемь 24-разрядных адресных регистров;
=> восемь 64-битных регистров S предназначены для хранения скалярных величин (целых чисел и чисел с плавающей точкой). Содержимое этих регистров можно использовать в качестве операндов как для операций над целыми числами, так и для операций над числами с плавающей точкой;
=> дополнительные регистры, дублирующие адресные и скалярные регистры (на рисунке не показаны).
Суперкомпьютер Сгау-1 содержит 12 функциональных устройств, из которых:
=> два устройства предназначены для арифметических операций (сложения и умножения) с 24-битными адресами, поступающими из адресных регистров;
=> четыре устройства используются для скалярных операций с 64-бит- ными целыми числами;
=> шесть конвейеризированных устройств работают с векторами, при этом операции сложения, умножения и вычисления обратной величины выполняются как для скалярных, так и векторных величин с плавающей точкой.
Управляющее устройство содержит:
регистр длины вектора, который фиксирует длину обрабатываемого вектора из S элементов (S < 64);
=> 64-разрядный регистр векторной маски. Он определяет, какой из участвующих в операции регистров выдает результат. Кроме того, регистр векторной маски используется командой проверки элементов вектора. При ее выполнении разряды вектора маски устанавливаются в 1, если элементы вектора удовлетворяют заданному условию. Результат проверки используется другими командами при обработке данных;
=> четыре буфера команд на 64 командных слова каждый, счетчик команд и блок управляющих сигналов.
Команды имеют формат 16 или 32 разряда. 16-разрядные команды основных (в том числе векторных) операций имеют 7-разрядное поле кода операции и три 3-разрядных поля для номеров регистров операндов и результата. В 32-разрядной команде под адрес основной памяти или непосредственный операнд отведено 22 разряда. С помощью одной
16-битной команды можно сложить, вычесть или умножить два вектора. Операция деления отсутствует, однако имеется операция вычисления обратной величины. Как и многие другие векторные компьютеры, Сгау-1 допускает операции сцепления. Например, чтобы вычислить выражение R1=R1*R2+R3, где Rl, R2 и R3 — содержимое векторных регистров, компьютер произведет векторное умножение элемента за элементом, сохранит результат в каком-нибудь регистре, а затем выполнит векторное сложение. При сцеплении, как только первые элементы перемножены, произведение сразу направляется в сумматор вместе с первым элементом регистра R3. Сохранения промежуточного результата не требуется. Такая технология повышает производительность.
В оперативной памяти системы, имеющей емкость от 1М до 4М слов (слово 64 + 9 контрольных разрядов), применено 16-кратное чередование адресов, за счет чего цикл обращения составляет 50 нс.
В однопроцессорном компьютере Сгау-1 достигнута производительность 80... 130 Мфлоп/с. В более поздних моделях фирмы CRAY используются от 2 до 8 процессоров, и производительность составляет более 1000 Мфлоп/с.