Векторный процессор

редактировать

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

По состоянию на 2016 год большинство массовых процессоров реализуют архитектуры, которые содержат инструкции SIMD для формы векторной обработки нескольких (векторизованных) наборов данных. Общие примеры включают инструкции Intel x86 MMX, SSE и AVX, расширения AMD 3DNow!, расширение Sparc VIS., PowerPC, AltiVec и MIPS. Методы векторной обработки также работают в аппаратном обеспечении игровой консоли и в графических ускорителях . В 2000 году IBM, Toshiba и Sony совместно создали Cell processor.

. Другие конструкции ЦП включают несколько инструкций для векторной обработки на нескольких (векторизованные) наборы данных, обычно известные как MIMD (Multiple I nstruction, M ultiple D ata) и реализованные с помощью VLIW (Very L ong ​​I инструкция W or). Fujitsu FR-V VLIW / векторный процессор объединяет обе технологии.

Содержание
  • 1 История
    • 1.1 Ранняя работа
    • 1.2 Суперкомпьютеры
    • 1.3 GPU
  • 2 Описание
    • 2.1 Векторные инструкции
  • 3 Производительность и ускорение
  • 4 Разнородное программирование вычислительные архитектуры
  • 5 См. также
  • 6 Ссылки
  • 7 Внешние ссылки
История

Ранние работы

Разработка векторной обработки началась в начале 1960-х в Westinghouse в своем проекте «Соломон». Целью Соломона было резко повысить математическую производительность за счет использования большого количества простых математических сопроцессоров под управлением одного главного CPU. ЦП подал одну общую инструкцию на все арифметико-логические блоки (ALU) , по одной на цикл, но с разными точками данных для каждого из них, над которыми нужно работать. Это позволило машине Соломона применить единственный алгоритм к большому набору данных , подаваемому в виде массива.

В 1962 году Вестингауз отменил проект, но его работа была возобновлена ​​в Университете Иллинойса под названием ILLIAC IV. Их версия проекта первоначально предусматривала установку 1 GFLOPS с 256 ALU, но, когда она была наконец поставлена ​​в 1972 году, она имела только 64 ALU и могла достигать скорости только от 100 до 150 MFLOPS. Тем не менее, он показал, что основная концепция была правильной, и при использовании в приложениях с интенсивным использованием данных, таких как вычислительная гидродинамика, ILLIAC был самой быстрой машиной в мире. Подход ILLIAC с использованием отдельных ALU для каждого элемента данных не является общим для более поздних проектов и часто упоминается в отдельной категории, массовые параллельные вычисления.

A компьютер для работы с функциями был представлен и разработан Карцевым в 1967 году.

Суперкомпьютеры

Первое успешное внедрение векторной обработки произошло в 1966 году, когда оба Были представлены Control Data Corporation STAR-100 и Texas Instruments Advanced Scientific Computer (ASC).

Базовый ASC (т. Е. «Однотрубный») ALU использовал конвейерную архитектуру, которая поддерживала как скалярные, так и векторные вычисления, с максимальной производительностью, достигающей примерно 20 MFLOPS, что легко достигается при обработке длинных векторов. Расширенные конфигурации ALU поддерживали "два канала" или "четыре канала" с соответствующим увеличением производительности в 2 или 4 раза. Пропускной способности памяти было достаточно для поддержки этих расширенных режимов.

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

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

В дизайне Cray для реализации векторных инструкций использовался конвейерный параллелизм, а не несколько ALU. Кроме того, в дизайне были полностью отдельные конвейеры для разных инструкций, например, сложение / вычитание было реализовано на другом оборудовании, чем умножение. Это позволяло передавать пакет векторных инструкций по конвейеру в каждый из субъединиц ALU, метод, который они назвали векторной цепочкой. Cray-1 обычно имел производительность около 80 MFLOPS, но при работе до трех цепей он мог достигать максимума 240 MFLOPS и в среднем около 150 - намного быстрее, чем любая машина той эпохи.

Процессорный модуль Cray J90 с четырьмя скалярными / векторными процессорами

Далее последовали другие примеры. Control Data Corporation попыталась снова выйти на рынок высокого класса со своей машиной ETA-10, но она плохо продавалась, и они использовали это как возможность полностью уйти из области суперкомпьютеров. В начале и середине 1980-х японские компании (Fujitsu, Hitachi и Nippon Electric Corporation (NEC) представили векторные машины на основе регистров, аналогичные Cray-1., как правило, немного быстрее и намного меньше. Основанные на Орегоне Системы с плавающей запятой (FPS) построили дополнительные процессоры массивов для миникомпьютеров, позже построив свои собственные мини-суперкомпьютеры.

На протяжении всего времени Cray продолжал оставаться лидером по производительности, постоянно побеждая конкурентов с серией машин, которые привели к появлению Cray-2, Cray X-MP и Cray Y-MP. С тех пор рынок суперкомпьютеров больше сосредоточился на массово-параллельной обработке, чем на улучшенных реализациях векторных процессоров. Однако, осознавая преимущества векторной обработки, IBM разработала Виртуальная векторная архитектура для использования в суперкомпьютерах, соединяющих несколько скалярных процессоров для работы в качестве векторного процессора.

Хотя векторные суперкомпьютеры похожи на Поскольку в наши дни Cray-1 менее популярны, NEC продолжает выпускать компьютеры этого типа и по сей день, выпуская компьютеры серии SX. Совсем недавно SX-Aurora TSUBASA размещает процессор и 24 или 48 гигабайт памяти в модуле HBM 2 внутри карты, которая физически похожа на графический сопроцессор, но вместо того, чтобы служить в качестве сопроцессора это главный компьютер с ПК-совместимым компьютером, к которому он подключен, выполняя функции поддержки.

GPU

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

Описание

В общих чертах, ЦП могут манипулировать одним или двумя частями данных за раз. Например, в большинстве процессоров есть инструкция, которая по сути говорит «добавить A к B и поместить результат в C». Данные для A, B и C могут быть - по крайней мере теоретически - закодированы непосредственно в инструкции. Однако при эффективной реализации редко бывает так просто. Данные редко отправляются в необработанном виде, а вместо этого «указываются» путем передачи адреса в ячейку памяти, в которой хранятся данные. Декодирование этого адреса и извлечение данных из памяти занимает некоторое время, в течение которого ЦП обычно простаивает, ожидая появления запрошенных данных. По мере увеличения скорости ЦП эта задержка памяти исторически становилась большим препятствием для производительности; см. Стена памяти.

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

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

Чтобы проиллюстрировать, насколько это может отличаться, рассмотрим простую задачу сложения двух групп по 10 чисел. На обычном языке программирования можно написать «цикл», который по очереди выбирает каждую из пар чисел, а затем складывает их. Для ЦП это будет выглядеть примерно так:

; Гипотетическая RISC-машина; сложить 10 чисел в a до 10 чисел в b, сохраняя результаты в c; предположим, что a, b и c являются ячейками памяти в соответствующих регистрах move $ 10, count; count: = 10 loop: load r1, a load r2, b add r3, r1, r2; r3: = r1 + r2 сохранить r3, c добавить a, a, $ 4; перейти к добавлению b, b, $ 4 добавить c, c, 4 $ dec count; декремент jnez count, loop; возвратиться назад, если счетчик еще не равен 0 ret

Но для векторного процессора эта задача выглядит значительно иначе:

; предположим, что у нас есть векторные регистры v1-v3 размером больше 10 move $ 10, count; count = 10 vload v1, a, count vload v2, b, count vadd v3, v1, v2 vstore v3, c, count ret

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

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

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

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

Векторные инструкции

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

Самовоспроизводящиеся инструкции обнаружены в ранних векторных компьютерах, таких как STAR, где вышеупомянутое действие было бы описано в одной инструкции (что-то вроде vadd c, a, b, $ 10). Они также присутствуют в архитектуре x86 как перфиксы REP. Однако только очень простые вычисления могут быть эффективно выполнены на оборудовании без очень большого увеличения стоимости. Поскольку все операнды должны находиться в памяти, задержка, вызванная доступом, также становится огромной.

Cray-1 представил идею использования регистров процессора для хранения векторных данных в пакетах. Таким образом, с каждым пакетом можно проделать гораздо больше работы за счет того, что программисту придется вручную загружать / сохранять данные из / в память для каждого пакета. Современные компьютеры SIMD улучшают Cray за счет прямого использования нескольких ALU для большей степени параллелизма по сравнению с использованием только обычного скалярного конвейера. Маски можно использовать для выборочной загрузки или сохранения ячеек памяти для версии параллельной логики.

Графические процессоры, которые имеют множество небольших вычислительных блоков, используют вариант SIMD, называемый Single Instruction Multiple Threads (SIMT). Это похоже на современные SIMD, за исключением того, что «векторные регистры» очень широкие, а конвейеры имеют тенденцию быть длинными. Часть «многопоточность» влияет на способ обмена данными между вычислительными модулями. Кроме того, графические процессоры и другие внешние векторные процессоры, такие как NEC SX-Aurora TSUBASA, могут использовать меньшее количество векторных единиц, чем предполагает ширина: вместо 64 единиц для 64-числового регистра может использоваться аппаратное обеспечение. сделать конвейерный цикл более 16 единиц для гибридного подхода.

Разницу между традиционным векторным процессором и современным SIMD-процессором можно проиллюстрировать с помощью этого варианта функции «DAXPY»:

void iaxpy (size_t n, int a, const int x, int y) {for (size_t i = 0; i < n; i++) y[i] = a * x[i] + y[i]; }

Код, похожий на STAR, остается кратким, но теперь нам требуется дополнительный слот памяти для обработки информации. Также требуется вдвое большее время задержки из-за дополнительных требований доступа к памяти.

; Предположим, что tmp предварительно выделен vmul tmp, a, x, n; tmp [i] = a * x [i] vadd y, y, tmp, n; y [i] = y [i] + tmp [i] ret

Эта современная SIMD-машина может выполнять большую часть операций в пакетном режиме. Код в основном похож на скалярную версию. Мы предполагаем, что здесь x и y правильно выровнены и что n кратно 4, так как в противном случае потребовался бы некоторый установочный код для вычисления маски или запуска скалярной версии. Затраченное время было бы в основном таким же, как и для векторной реализации c = a + b, описанной выше.

vloop: load32x4 v1, x load32x4 v2, y mul32 x4 v1, a, v1; v1: = v1 * add32x4 v3, v1, v2; v3: = v1 + v2 store32x4 v3, y addl x, x, $ 16; a: = a + 16 addl y, y, $ 16 subl n, n, 4 доллара; n: = n - 4 jgz n, vloop; цикл назад, если n>0 out: ret
Производительность и ускорение

Пусть r будет векторным коэффициентом скорости, а f будет коэффициентом векторизации. Если векторной единице требуется время для добавления массива из 64 чисел в 10 раз быстрее, чем у его эквивалентного скалярного аналога, r = 10. Кроме того, если общее количество операций в программе равно 100, из которых только 10 являются скалярными. (после векторизации), тогда f = 0,9, т.е. 90% работы выполняет векторный блок. Это соответствует достижимой скорости:

r / [(1 - f) ∗ r + f] {\ displaystyle r / [(1-f) * r + f]}r / [(1-f) * r + f]

Итак, даже если производительность единицы вектора очень высоки (r = ∞ {\ displaystyle r = \ infty}r = \ infty ), мы получаем ускорение менее 1 / (1 - f) {\ displaystyle 1 / (1-f)}1 / (1-f) , что предполагает, что отношение f имеет решающее значение для производительности. Это соотношение зависит от эффективности компиляции, например, от смежности элементов в памяти.

Программирование архитектур гетерогенных вычислений

Различные машины были разработаны для включения как традиционных, так и векторных процессоров, таких как Fujitsu AP1000 и AP3000. Программирование таких разнородных машин может быть трудным, поскольку разработка программ, наилучшим образом использующих характеристики различных процессоров, увеличивает нагрузку на программиста. Это увеличивает сложность кода и снижает переносимость кода, требуя, чтобы код, специфичный для оборудования, перемежался по всему коду приложения. Балансировка нагрузки приложения между процессорами может быть проблематичной, особенно с учетом того, что они обычно имеют разные характеристики производительности. Существуют различные концептуальные модели для решения проблемы, например, с использованием языка координации и строительных блоков программы (программных библиотек или функций более высокого порядка). Каждый блок может иметь свою собственную реализацию для каждого типа процессора. Пользователи просто программируют, используя эти абстракции, и интеллектуальный компилятор выбирает лучшую реализацию на основе контекста.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-18 10:28:47
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте