
3. Структура векторного процессора
Обобщенная структура векторного процессора приведена на рис. 7.6. На схеме показаны основные узлы процессора, без детализации некоторых связей между ними.
Рис. 7.6. Упрощенная структура векторного процессора
Обработка
всех n
компонентов
векторов-операндов задается одной век-
торной командой.
Элементы векторов представляются
числами в форме с пла-вающей запятой
(ПЗ). АЛУ векторного процессора может
быть реализовано в виде единого
конвейерного устройства, способного
выполнять все предусмот-ренные операции
над числами с ПЗ. Однако более распространена
иная струк-тура, в которой АЛУ состоит
из отдельных блоков сложения и умножения,
а иногда и блока для вычисления обратной
величины, когда операция деления
реализуется в виде
.
Каждый из таких блоков также
конвейеризирован. Кроме того, в состав
векторной
вычислительной системы обычно
включается и скалярный процессор,
что позволяет параллельно выполнять
векторные и скалярные команды.
Для хранения векторов-операндов вместо множества скалярных регист- ров используются векторные регистры, представляющие собой совокупность скалярных регистров, объединенных в очередь типа FIFO, способную хранить 50–100 чисел с плавающей запятой. Набор векторных регистров (Va, Vb, Vc,…) имеется в любом векторном процессоре. Система команд векторного процес- сора поддерживает работу с векторными регистрами и обязательно включает в себя команды:
загрузки векторного регистра содержимым последовательных ячеек па- мяти, указанных адресом первой ячейки этой последовательности;
выполнения операций над всеми элементами векторов, находящихся в векторных регистрах;
сохранения содержимого векторного регистра в последовательности ячеек памяти, указанных адресом первой ячейки этой последовательности.
Примером одной из наиболее распространенных операций, возлагаемых на векторный процессор, может служить операция перемножения матриц. Рас-смотрим перемножение двух матриц А и В размерности 3×3.
Элементы матрицы результата С связаны с соответствующими элемента- ми исходных матриц A и B операцией скалярного произведения:
.
Так, элемент с11 вычисляется как
с11 = a11 × b11 + a12 × b21 +a13 × b31.
Это требует трех операций умножения и после инициализации с11 нулем – трех операций сложения. Общее число умножений и сложений для рассмат-риваемого примера составляет 9×3=27. Если рассматривать связанные операции умножения и сложения как одну кумулятивную операцию с + a × b, то для умно-жения двух матриц n × n необходимо n3 операций типа «умножение-сложение». Вся процедура сводится к получению n2 скалярных произведений, каждое из которых является итогом n операций «умножение-сложение», учитывая, что пе-ред вычислением каждого элемента сij его необходимо обнулить. Таким образом, скалярное произведение состоит из k членов:
С = А1 В1+ А2 В2 + А3 В3 + A4 B4 + … + Ak Bk.
Векторный процессор с конвейеризированными блоками обработки для вычисления скалярного произведения показан на рис. 7.7.
Рис. 7.7. Векторный процессор для вычисления скалярного произведения
Векторы А и В, хранящиеся в памяти начиная с адресов adrA и adrB, за-гружаются в векторные регистры VA и VB соответственно. Предполагается, что конвейерные умножитель и сумматор состоят из четырех сегментов, которые вначале инициализируются нулем, поэтому в течение первых восьми циклов, пока оба конвейера не заполнятся, на выходе сумматора будет 0. Пары (Ai, Bi) подаются на вход умножителя и перемножаются в темпе одна пара за цикл. После первых четырех циклов произведения начинают суммироваться с дан- ными, поступающими с выхода сумматора. В течение следующих четырех цик-лов на вход сумматора поступают суммы произведений из умножителя с нулем. К концу восьмого цикла в сегментах сумматора находятся четыре первых про-изведения A1B1, …, A4B4, а в сегментах умножителя – следующие четыре про- изведения: A5B5, …, A8B8. К началу девятого цикла на выходе сумматора будет A1B1, а на выходе умножителя – А5В5. Таким образом, девятый цикл начнется со сложения в сумматоре А1В1 и А5В5. Десятый цикл начнется со сложения A2B2 + A6B6 и т.д. Процесс суммирования в четырех секциях выглядит так:
C = A1B1 + A5B5 + A9B9 + A13 B13 + …
+ A2B2 + A6B6 + A10 B10 + A14 B14 + …
+ A3B3 + A7B7 + A11 B11 + A15 B15 + …
+ A4B4 + A8B8 + A12 B12 + A16 B16 + …
Когда больше не остается членов для сложения, система заносит в умно-житель четыре нуля. При этом в четырех сегментах конвейера сумматора со-держатся четыре скалярных произведения, соответствующие четырем суммам, приведенным в четырех строках показанного выше уравнения. Далее четыре частичных суммы складываются для получения окончательного результата.
Программа для вычисления скалярного произведения векторов А и В, хра-нящихся в областях памяти с начальными адресами adrA и adrB, имеет вид:
V_load VA, adrA
V_load VB, adrB
V_multiply VC, VA, VB
Первые две векторные команды V_load загружают векторы из памяти в векторные регистры VA и VB. Векторная команда умножения V_multiply вычисляет произведение для всех пар одноименных элементов векторов и записывает полученный вектор в векторный регистр VC.
Важным элементом векторного процессора (ВП) является регистр длины вектора. Этот регистр определяет, сколько элементов фактически содержит об-рабатываемый в данный момент вектор, то есть сколько индивидуальных опе-раций с элементами нужно сделать. В некоторых ВП присутствует также ре- гистр максимальной длины вектора, определяющий максимальное число эле-ментов вектора, которое может быть одновременно обработано аппаратурой процессора. Этот регистр используется при разделении очень длинных векторов на сегменты, длина которых соответствует максимальному числу элементов, обрабатываемых аппаратурой за один прием.
Часто приходится выполнять такие операции, в которых участвуют не все элементы векторов. Векторный процессор обеспечивает данный режим с помо-щью регистра маски вектора. В этом регистре каждому элементу вектора со-ответствует один бит. Установка бита в единицу разрешает запись соответст-вующего элемента вектора результата в выходной векторный регистр, а сброс в ноль – запрещает.
Элементы векторов в памяти расположены регулярно и при выполнении векторных операций достаточно указать значение шага по индексу. Существу- ют случаи, когда необходимо обрабатывать только ненулевые элементы век- торов. Для поддержки подобных операций в системе команд ВП предусмот- рены операции упаковки/распаковки (gather/scatter). Операция упаковки форми-рует вектор, содержащий только ненулевые элементы исходного вектора, а опе-рация распаковки производит обратное преобразование. Обе этих задачи век-торный процессор решает с помощью вектора индексов, для хранения кото- рого используется регистр вектора индексов, по структуре аналогичный ре-гистру маски. В векторе индексов каждому элементу исходного вектора со-ответствует один бит. Нулевое значение бита свидетельствует, что соответст-вующий элемент исходного вектора равен нулю.
Применение векторных команд окупается по двум причинам. Во-первых, вместо многократной выборки одних и тех же команд достаточно произвести выборку только одной векторной команды, что позволяет сократить издержки за счет устройства управления и уменьшить требования к пропускной способ-ности памяти. Во-вторых, векторная команда обеспечивает процессор упорядо-ченными данными. Когда инициируется векторная команда, ВС знает, что ей нужно извлечь n пар операндов, расположенных в памяти регулярным образом. Таким образом, процессор может указать памяти на необходимость начать изв-лечение таких пар. Если используется память с чередованием адресов, эти пары могут быть получены со скоростью одной пары за цикл процессора и направ- лены для обработки в конвейеризированный функциональный блок. При отсут-ствии чередования адресов или других средств извлечения операндов с высо- кой скоростью преимущества обработки векторов существенно снижаются.