Тема 7 — Векторни процесори
1. Въведение
Обработката на данни, структурирани като масиви, е в основата на редица изчислително интензивни приложения — обработка на изображения, анализ на сеизмични данни, управление на ядрени реактори и прогнозиране на климата. За ефективното решаване на тези задачи са разработени два принципно различни архитектурни подхода.
Първият подход се основава на времевото съвместяване — конвейеризацията на командите, обработващи вектори. Компютрите, реализиращи този подход, се наричат векторни процесори, а системите на тяхна база — векторни компютри. Исторически, първите успешни векторни процесори са CDC Cyber 100 и TI ASC, използващи адресация памет-памет. Революционен пробив прави CRAY-1 (1974 г.), въвеждайки 8 векторни регистъра, всеки с 64 думи по 64 бита. Компютрите на Cray Research стават синоним на суперкомпютър, а подобни регистрово-ориентирани решения предлагат и японски компании като Fujitsu, Hitachi и NEC.
| Процесор | Пикова производителност | Такт | Макс. памет |
|---|---|---|---|
| Fujitsu VPP 300/700 | 2.2 GFLOPS | 7 ns | 2 GB |
| Fujitsu VPP 500 | 9.6 GFLOPS | 3 ns | 16 GB |
| NEC SX4 | 2.0 GFLOPS | 8 ns | 2 GB |
| NEC SX5 | 8.0 GFLOPS | 4 ns | 8 GB |
| Alpha EV5 | 12.0 GFLOPS | 1.6 ns | 2 GB |
Вторият подход — пространственото повторение — е в основата на SIMD компютрите (виж тема 8), при които множество процесори работят паралелно върху различни данни при едни и същи команди.
![]()
Cray-1 — първият суперкомпютър с регистрово-ориентиран векторен процесор (1974 г.), изложен в Музея на науката в Лондон.
2. Принципи на векторната обработка
Векторът е набор от скаларни данни от един и същ тип, съхранявани в паметта с фиксирано адресно нарастване между съседните елементи — т.нар. стъпка. Векторна обработка възниква, когато аритметични или логически операции се прилагат едновременно върху цял вектор от данни.
Преобразуването от скаларен към векторен код се нарича векторизация, а компилаторите, извършващи това преобразуване — векторизиращи компилатори. Разликата в изчислителния модел е принципна. За скаларен процесор сумирането на два вектора A и B изглежда така:
for (i = 0; i < n; i++) c[i] = a[i] + b[i];Всяка итерация минава поотделно през декодиращия конвейер. При векторния процесор същата задача се изразява с единствена команда:
C = A + BВместо многократно декодиране на отделни команди, процесорът декодира само веднъж и след това прилага конвейерна обработка директно върху елементите на данните.
3. Структура на векторния процесор
Векторният процесор представлява набор от хардуерни ресурси: векторни регистри, функционални конвейери, обработващи елементи и броячи за векторни операции. Съществуват два вида векторни процесори:
- Пълен векторен процесор — интегрирано устройство (компютър), обработващо едновременно вектори и скалари.
- Присъединен векторен процесор — специализирано устройство, свързано към скаларен компютър чрез канал; от негова гледна точка векторният процесор се третира като периферно устройство. Предимство: по-ниска цена и избирателно включване; недостатък: по-ниска скорост на обмен.
Основните компоненти на векторния процесор включват:
- Векторни регистри — вътрешна памет с бърз достъп, обикновено 8–32 регистъра с по 64–2048 думи (64 бита всяка).
- Функционални конвейерни устройства — специализирани блокове ADD, MUL, DIV, способни да стартират нова операция всеки такт.
- Устройства LOAD / STORE — пренасят векторни думи между регистрите и оперативната памет.
- Регистър и устройство MASK — обработват двоичен вектор-маска за адресиране на разредени данни.
Структурата осигурява паралелизъм на три нива: конвейерно изпълнение в рамките на всяко функционално устройство, конвейерно изпълнение на цялата векторна команда, и едновременно изпълнение на независими векторна и скаларна команди.
Оперативната памет трябва да поддържа поток от данни, съответстващ на темпа на конвейера — за C = A + B е необходима поне три пъти по-широка пропускателна лента в сравнение с еквивалентния скаларен случай. Стратегиите за постигане на това са разслоена памет (независими модули с конкурентен достъп) и вътрешна високоскоростна памет (аналог на кеша).
4. Векторни команди
4.1. Код на операцията
Броят на векторните кодове е 2–3 пъти по-голям от броя на аналогичните скаларни кодове, поради три причини:
- Един термин като “векторно събиране” покрива различни операции:
c[i] = a[i] + b[i],c[i] = c[i] + s, редукцияs = Σa[i]и комбинирана форма — всяка е отделна команда. - Съществуват съставни команди, комбиниращи чести последователности:
V = S*V + S*V,V = V*V + V*V. Те изискват паралелна или конвейерна работа на няколко аритметични конвейера. - Специфични нови команди от типа “Сравни два вектора за равенство” произвеждат двоичен резултатен вектор (вижте т. 4.3).
4.2. Адресация на операндите
Векторните команди имат предимно триадресен формат — две полета за изходните вектори и едно за резултатния. Трите разновидности на адресацията са:
- Памет-памет — инвариантна спрямо дължината на вектора, но по-бавна (използвана в CDC Cyber 200/205).
- Регистър-регистър — най-бърза, но налага ограничения върху дължината на векторите. Крайният размер на регистъра предизвиква характерна “трионообразна” зависимост на производителността от дължината на вектора — при непълно запълнен регистър в последното обръщение се губи ефективност.
- Памет-регистър (смесена) — компромис, съчетаващ предимствата на двата предходни метода (IBM 3090).
Наред с адреса е необходима допълнителна информация: начален адрес, размерност, брой елементи по всяка размерност и тип на данните.
Плътна адресация бива последователна, непоследователна-регулярна (напр. стълб на матрица, съхранена по редове — изисква стъпка m в генератора на адреси) и подматрична.
Разредена адресация се използва при операции зависещи от данните, разредени вектори и косвено четене от таблици. Реализира се чрез два механизма:
- Двоичен вектор (маска) — вектор с дължина, равна на обработвания, чиито елементи са 0 или 1. Бит 1 означава, че съответният елемент участва в операцията. Поддържа три функции: свиване (компактиране на избраните елементи), разширение (обратна функция) и селективно запомняне.
- Векторни индекси — вектор от числа, използвани като адреси или отмествания; генераторът на адреси прави два достъпа до паметта — веднъж за индексите, веднъж за данните.
4.3. Фиксиране на състоянието след изпълнение
Три подхода съществуват за регистриране на статуса след векторни команди:
- Разширяване на полетата на регистъра на признаците с информация за нулев резултат, брой нули и позиция на първата.
- Формиране на вектор с кодовете на признаците, съхраняван в паметта.
- Нищо не се запомня (най-разпространен) — вместо това наборът команди се допълва с команди от вида “Сравни векторите за равенство” или “Провери вектора за отрицателен елемент”, произвеждащи двоичен резултатен вектор.
5. Програмиране на векторния процесор
Програмирането на векторен процесор се основава на изграждането на граф от векторни команди. Всяка команда приема входни вектори и произвежда двоичен вектор като резултат. Командите, наредени хоризонтално, се изпълняват последователно; наредените вертикално — паралелно.
Пример. Намери всички елементи на вектора X, равни на 0 или отрицателни, но ненадвишаващи съответните елементи на Y.
Решението включва шест векторни команди:
- Сравнение
X ≤ 0→ BV1 - Сравнение
X > Y→ BV2 - Сравнение
Y < 0→ BV3 - Отрицание на BV2 → BV4
- Логическо И на BV1 и BV4 → BV5
- Логическо ИЛИ на BV5 и BV3 → BV6 (краен резултат)
Резултантният вектор BV6 посочва позициите на елементите от X, удовлетворяващи условието. Командите от стъпки 2 и 3 са независими и могат да се изпълняват паралелно.
Резюме
- Векторните процесори прилагат конвейерна обработка на данните, за разлика от скаларните, при които конвейерът обработва само команди.
- Основните хардуерни ресурси са векторните регистри, функционалните конвейерни устройства (ADD, MUL, DIV) и устройствата LOAD/STORE.
- Трите нива на паралелизъм са: в рамките на функционалното устройство, на ниво векторна команда, и между независими векторна и скаларна команда.
- Адресацията регистър-регистър е най-бърза, но поражда трионообразна зависимост на производителността от дължината на вектора при непълно запълване на регистъра.
- Разредената адресация (двоичен вектор и векторни индекси) позволява ефективна работа с разредени матрици и зависими от данните операции.
- Програмирането изисква изграждане на граф от векторни команди, при което независимите клонове се изпълняват паралелно.