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


Векторный процессор — это процессор, в котором операндами некоторых команд могут выступать упорядоченные массивы данных — векторы. Отличается от скалярных процессоров, которые могут работать только с одним операндом в единицу времени. Абсолютное большинство процессоров является скалярным или близким к нему. Векторные процессоры были распространены в сфере научных вычислений, где они являлись основой большинства суперкомпьютеров начиная с 1980-х до 1990-х. Но резкое увеличение производительности и активная разработка новых процессоров привели к вытеснению векторных процессоров из сферы повседневных процессоров.

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

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

Реализация Cray расширила возможности вычислений, позволяя выполнять несколько различных операций сразу. Для примера рассмотрим код, складывающий 2 набора чисел и умножающий на третий, в Cray эти операции осуществились бы так:

Таким образом, математические операции выполняются гораздо быстрее, основным ограничивающим фактором становится время, необходимое для извлечения данных из памяти.

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