Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Другие конструкции процессора включают в себя некоторые нескольких инструкций для векторной обработки на нескольких (vectorised) наборов данных, как правило , известных как MIMD ( М есколько I nstruction, М есколько Д ата) и реализованных с VLIW ( V ERy L Ong Я nstruction Вт ORD). В векторном / VLIW- процессоре Fujitsu FR-V сочетаются обе технологии.

История [ править ]

Ранние работы [ править ]

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

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

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

Суперкомпьютеры [ править ]

Первое успешное внедрение векторной обработки произошло в 1966 году, когда были представлены Control Data Corporation STAR-100 и усовершенствованный научный компьютер Texas Instruments (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 MFLOPS - намного быстрее, чем любая машина того времени.

Процессорный модуль 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 [ править ]

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

Описание [ править ]

В общих чертах, процессоры могут обрабатывать одну или две части данных за раз. Например, в большинстве процессоров есть инструкция, которая по сути гласит: «добавить 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  Декабрь  счетчик  ; декремент  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  mul32x4  v1 ,  a ,  v1  ; v1: = v1 * a  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% работы выполняет векторный блок. Это следует за достижимым ускорением:

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

Программирование гетерогенных вычислительных архитектур [ править ]

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

См. Также [ править ]

  • Архитектура SX
  • ГПГПУ
  • Вычислить ядро
  • Потоковая обработка
  • SIMD
  • Автоматическая векторизация
  • Цепочка (векторная обработка)
  • Компьютер для работы с функциями
  • RISC-V , открытый стандарт ISA со связанным расширением вектора переменной ширины.
  • Бочковой процессор
  • Блок тензорной обработки

Ссылки [ править ]

  1. Малиновский, Б.Н. (1995). История компьютерных технологий в их лицах . Киев: Фирма "КИТ". ISBN 5-7707-6131-8.
  2. ^ Кунцман, DM; Кале, LV (2011). «Программирование гетерогенных систем». 2011 IEEE International Symposium on Parallel and Distributed Processing Workshops and Phd Forum . п. 2061. DOI : 10,1109 / IPDPS.2011.377 . ISBN 978-1-61284-425-1.
  3. ^ Джон Дарлинтон; Мустафа Ганем; Йике Го; Хинг Винг То (1996), "Управляемая организация ресурсов в гетерогенных параллельных вычислениях", Журнал высокопроизводительных вычислений , 4 (1): 13–23, CiteSeerX 10.1.1.37.4309 

Внешние ссылки [ править ]

  • История развития параллельных вычислений (с 1955 по 1993 год)