Чем векторный процессор отличается от обычного

Обновлено: 06.07.2024

Они оба могут обрабатывать несколько команд одновременно, но я полагаю, что есть фундаментальная разница, которая объясняет, почему есть два имени, и мы не просто переключились на использование суперскалярных всегда?

кроме того, если я правильно понял, как скалярные, так и векторные инструкции присутствуют в современном процессоре, поэтому я полагаю, что эти два не являются взаимоисключающими (скалярные инструкции, такие как mov или add, будут выполняться суперскалярно и, например, будет вычисляться точечное произведение вектор-ли каким-то особым образом черной магии)?

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

на векторный процессор содержит инструкции, специально предназначенные для работы с целыми группами нескольких значений данных одновременно (называется массивы или векторы). Большинств самомоднейшие высокопроизводительные обработчики содержат некоторую форму возможности обработки вектора; например;SSE ADDPS инструкция, доступная в большинстве x86 процессоров вычисляет сумму двух векторов каждый содержит четыре значения с одной точностью. Компилятор, разработчик и поддержка операционной системы обычно требуются для использования векторных инструкций, и не каждый процессор, даже в текущих поколениях, поддерживает самые передовые векторные инструкции (например, процессоры Intel Celeron и Pentium, даже с Кабы Озеро, не поддерживают AVX).

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

1 альтернативный и довольно необычный подход к проектированию заключается в том, чтобы иметь несколько исполнительных модулей, но позволить компилятору определить, какие инструкции выдавать каждому исполнительному модулю для каждого тактового цикла. Это называется очень длинная инструкция word и обычно встречается только на специализированных процессорах.

Так как никто не пришел с ответом, я думаю, что понял это в то же время.

скалярный процессор - это обычный процессор, выполняющий скалярные команды, которые работают над одним номером за раз. Ничего особенного.

Superscalar - термин, используемый для обозначения конкретной оптимизации, позволяющей скалярным инструкциям выполняться параллельно, на различные" обычные " исполнительные единицы (например, несколько Alu). Она делится на несколько "потоков" (я только что сделал этот термин придумал), которые выполняются одновременно.

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

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

обратите внимание, как я никогда не говорил, что любая из категорий взаимоисключающие? Это не так. Векторные единицы измерения будут выполнять векторные инструкции, а процессор попытается найти наилучший способ распараллеливания скалярных. Фактически, все современные процессоры поддерживают обе векторные инструкции (SSE*, 3DNow!, AVX. ) и скалярных (х86), которая будет выполнена в "суперскалярной" способом.

Компьютеры, даже персональные, становятся все сложнее. Не так уж давно в гудящем на столе ящике все было просто — чем больше частота, тем больше производительность. Теперь же системы стали многоядерными, многопроцессорными, в них появились специализированные ускорители, компьютеры все чаще объединяются в кластеры.
Зачем? Как во всем этом многообразии разобраться?
Что значит SIMD, SMP, GPGPU и другие страшные слова, которые встречаются все чаще?
Каковы границы применимости существующих технологий повышения производительности?

Введение

Откуда такие сложности?

Компьютерные мощности быстро растут и все время кажется, что все, существующей скорости хватит на все.
Но нет — растущая производительность позволяет решать проблемы, к которым раньше нельзя было подступиться. Даже на бытовом уровне есть задачи, которые загрузят ваш компьютер надолго, например кодирование домашнего видео. В промышленности и науке таких задач еще больше: огромные базы данных, молекулярно-динамические расчеты, моделирование сложных механизмов — автомобилей, реактивных двигателей, все это требует возрастающей мощности вычислений.
В предыдущие годы основной рост производительности обеспечивался достаточно просто, с помощью уменьшения размеров элементов микропроцессоров. При этом падало энергопотребление и росли частоты работы, компьютеры становились все быстрее, сохраняя, в общих чертах, свою архитектуру. Менялся техпроцесс производства микросхем и мегагерцы вырастали в гигагерцы, радуя пользователей возросшей производительностью, ведь если «мега» это миллион, то «гига» это уже миллиард операций в секунду.
Но, как известно, рай бывает либо не навсегда, либо не для всех, и не так давно он в компьютерном мире закончился. Оказалось, частоту дальше повышать нельзя — растут токи утечки, процессоры перегреваются и обойти это не получается. Можно, конечно, развивать системы охлаждения, применять водные радиаторы или совсем уж жидким азотом охлаждать — но это не для каждого пользователя доступно, только для суперкомпьютеров или техноманьяков. Да и при любом охлаждении возможность роста была небольшой, где-то раза в два максимум, что для пользователей, привыкших к геометрической прогрессии, было неприемлемо.
Казалось, что закон Мура, по которому число транзисторов и связанная с ним производительность компьютеров удваивалась каждые полтора-два года, перестанет действовать.
Пришло время думать и экспериментировать, вспоминая все возможные способы увеличения скорости вычислений.

Формула производительности

Возьмем самую общую формулу производительности:


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


Первая часть полученного произведения — количество инструкций, выполняемых за один такт (IPC, Instruction Per Clock), вторая — количество тактов процессора в единицу времени, тактовая частота.
Таким образом, для увеличения производительности нужно или поднимать тактовую частоту или увеличивать количество инструкций, выполняемых за один такт.
Т.к. рост частоты остановился, придется увеличивать количество исполняемых «за раз» инструкций.

Включаем параллельность

Как же увеличить количество инструкций, исполняемых за один такт?
Очевидно, выполняя несколько инструкций за один раз, параллельно. Но как это сделать?
Все сильно зависит от выполняемой программы.
Если программа написана программистом как однопоточная, где все инструкции выполняются последовательно, друг за другом, то процессору (или компилятору) придется «думать за человека» и искать части программы, которые можно выполнить одновременно, распараллелить.

Параллелизм на уровне инструкций

Возьмем простенькую программу:
a = 1
b = 2
c = a + b

Первые две инструкции вполне можно выполнять параллельно, только третья от них зависит. А значит — всю программу можно выполнить за два шага, а не за три.
Процессор, который умеет сам определять независимые и непротиворечащие друг другу инструкции и параллельно их выполнять, называется суперскалярным.
Очень многие современные процессоры, включая и последние x86 — суперскалярные процессоры, но есть и другой путь: упростить процессор и возложить поиск параллельности на компилятор. Процессор при этом выполняет команды «пачками», которые заготовил для него компилятор программы, в каждой такой «пачке» — набор инструкций, которые не зависят друг от друга и могут исполняться параллельно. Такая архитектура называется VLIW (very long instruction word — «очень длинная машинная команда»), её дальнейшее развитие получило имя EPIC (explicitly parallel instruction computing) — микропроцессорная архитектура с явным параллелизмом команд)
Самые известные процессоры с такой архитектурой — Intel Itanium.
Есть и третий вариант увеличения количества инструкций, выполняемых за один такт, это технология Hyper Threading В этой технологии суперскалярный процессор самостоятельно распараллеливает не команды одного потока, а команды нескольких (в современных процессорах — двух) параллельно запущенных потоков.
Т.е. физически процессорное ядро одно, но простаивающие при выполнении одной задачи мощности процессора могут быть использованы для выполнения другой. Операционная система видит один процессор (или одно ядро процессора) с технологией Hyper Threading как два независимых процессора. Но на самом деле, конечно, Hyper Threading работает хуже, чем реальные два независимых процессора т.к. задачи на нем будут конкурировать за вычислительные мощности между собой.

Технологии параллелизма на уровне инструкций активно развивались в 90е и первую половину 2000х годов, но в настоящее время их потенциал практически исчерпан. Можно переставлять местами команды, переименовывать регистры и использовать другие оптимизации, выделяя из последовательного кода параллельно исполняющиеся участки, но все равно зависимости и ветвления не дадут полностью автоматически распараллелить код. Параллелизм на уровне инструкций хорош тем, что не требует вмешательства человека — но этим он и плох: пока человек умнее микропроцессора, писать по-настоящему параллельный код придется ему.

Параллелизм на уровне данных

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

Мы уже упоминали скалярность, но кроме скаляра есть и вектор, и кроме суперскалярных процессоров есть векторные.
Векторные процессоры выполняют какую-то операцию над целыми массивами данных, векторами. В «чистом» виде векторные процессоры применялись в суперкомьютерах для научных вычислений в 80-е годы.
По классификации Флинна, векторные процессоры относятся к SIMD — (single instruction, multiple data — одиночный поток команд, множественный поток данных).
В настоящее время в процессорах x86 реализовано множество векторных расширений — это MMX, 3DNow!, SSE, SSE2 и др.
Вот как, например, выглядит умножение четырех пар чисел одной командой с применением SSE:

float a[4] = < 300.0, 4.0, 4.0, 12.0 >;
float b[4] = < 1.5, 2.5, 3.5, 4.5 >;
__asm movups xmm0, a ; // поместить 4 переменные с плавающей точкой из a в регистр xmm0
movups xmm1, b ; // поместить 4 переменные с плавающей точкой из b в регистр xmm1
mulps xmm1, xmm0 ; // перемножить пакеты плавающих точек: xmm1=xmm1*xmm0
movups a, xmm1 ; // выгрузить результаты из регистра xmm1 по адресам a
>;

Таким образом, вместо четырех последовательных скалярных умножений мы сделали только одно — векторное.
Векторные процессоры могут значительно ускорить вычисления над большими объемами данных, но сфера их применимости ограничена, далеко не везде применимы типовые операции над фиксированными массивами.
Впрочем, гонка векторизации вычислений далеко не закончена — так в последних процессорах Intel появилось новое векторное расширение AVX (Advanced Vector Extension)
Но гораздо интереснее сейчас выглядят

Графические процессоры


Теоретическая вычислительная мощность процессоров в современных видеокартах растет гораздо быстрее, чем в обычных процессорах (посмотрим знаменитую картинку от NVIDIA)

Не так давно эта мощность была приспособлена для универсальных высокопроизводительных вычислений с помощью CUDA/OpenCL.
Архитектура графических процессоров (GPGPU, General Purpose computation on GPU – универсальные расчеты средствами видеокарты), близка к уже рассмотренной SIMD.
Она называется SIMT — (single instruction, multiple threads, одна инструкция — множество потоков). Так же как в SIMD операции производятся с массивами данных, но степеней свободы гораздо больше — для каждой ячейки обрабатываемых данных работает отдельная нить команд.
В результате
1) Параллельно могут выполняться сотни операций над сотнями ячеек данных.
2) В каждом потоке выполняется произвольная последовательность команд, она может обращаться к разным ячейкам.
3) Возможны ветвления. При этом, правда, параллельно могут выполняться только нити с одной и той же последовательностью операций.

GPGPU позволяют достичь на некоторых задачах впечатляющих результатов. но существуют и принципиальные ограничения, не позволяющие этой технологии стать универсальной палочкой-выручалочкой, а именно
1) Ускорить на GPU можно только хорошо параллелящийся по данным код.
2) GPU использует собственную память. Трансфер данных между памятью GPU и памятью компьютера довольно затратен.
3) Алгоритмы с большим количеством ветвлений работают на GPU неэффективно

Мультиархитектуры-

Итак, мы дошли до полностью параллельных архитектур — независимо параллельных и по командам, и по данным.
В классификации Флинна это MIMD (Multiple Instruction stream, Multiple Data stream — Множественный поток Команд, Множественный поток Данных).
Для использования всей мощности таких систем нужны многопоточные программы, их выполнение можно «разбросать» на несколько микропроцессоров и этим достичь увеличения производительности без роста частоты. Различные технологии многопоточности давно применялись в суперкомпьютерах, сейчас они «спустились с небес» к простым пользователям и многоядерный процессор уже скорее правило, чем исключение. Но многоядерность далеко не панацея.

Суров закон, но это закон

Параллельность, это хороший способ обойти ограничение роста тактовой частоты, но у него есть собственные ограничения.
Прежде всего, это закон Амдала, который гласит
Ускорение выполнения программы за счет распараллеливания её инструкций на множестве вычислителей ограничено временем, необходимым для выполнения её последовательных инструкций.

Ускорение кода зависит от числа процессоров и параллельности кода согласно формуле


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


Например, если выполнение последовательного кода занимает всего 25% от времени выполнения всей программы, то ускорить эту программу более чем в 4 раза не получится никак.
Давайте построим график зависимости ускорения нашей программы от количества параллельно работающих вычислителей-процессоров. Подставив в формулу 1/4 последовательного кода и 3/4 параллельного, получим

Грустно? Еще как.
Самый быстрый в мире суперкомпьютер с тысячами процессоров и терабайтами памяти на нашей, вроде бы даже неплохо (75%!) параллелящейся задаче, меньше чем вдвое быстрее обычного настольного четырехядерника.
Причем всё еще хуже, чем в этом идеальном случае. В реальном мире затраты обеспечение параллельности никогда не равны нулю и потому при добавлении все новых и новых процессоров производительность, начиная с некоторого момента, начнет падать.
Но как же тогда используется мощь современных очень-очень многоядерных суперкомпьютеров?
Во многих алгоритмах время исполнения параллельного кода сильно зависит от количества обрабатываемых данных, а время исполнения последовательного кода — нет. Чем больше данных требуется обработать, тем больше выигрыш от параллельности их обработки. Потому «загоняя» на суперкомп большие объемы данных получаем хорошее ускорение.
Например перемножая матрицы 3*3 на суперкомпьютере мы вряд ли заметим разницу с обычным однопроцессорным вариантом, а вот умножение матриц, размером 1000*1000 уже будет вполне оправдано на многоядерной машине.
Есть такой простой пример: 9 женщин за 1 месяц не могут родить одного ребенка. Параллельность здесь не работает. Но вот та же 81 женщина за 9 месяцев могут родить (берем максимальную эффективность!) 81 ребенка, т.е.получим максимальную теоретическую производительность от увеличения параллельности, 9 ребенков в месяц или, в среднем, тот же один ребенок в месяц на 9 женщин.
Большим компьютерам — большие задачи!

Мультипроцессор

Мультипроцессор — это компьютерная система, которая содержит несколько процессоров и одно видимое для всех процессоров. адресное пространство.
Мультипроцессоры отличаются по организации работы с памятью.

Системы с общей памятью


В таких системах множество процессоров (и процессорных кэшей) имеет доступ к одной и той же физической оперативной памяти. Такая модель часто называется симметричной мультипроцессорностью (SMP). Доступ к памяти при таком построении системы называется UMA (uniform memory access, равномерный доступ) т.к. любой процессор может обратиться к любой ячейке памяти и скорость этого обращения не зависит от адреса памяти. Однако каждый микропроцессор может использовать свой собственный кэш.

Несколько подсистем кэш-памяти процессоров, как правило, подключены к общей памяти через шину

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

Когерентность кэша

Допустим, у нас есть многопроцессорный компьютер. Каждый процессор имеет свой кэш, ну, как на рисунке вверху. Пусть некоторую ячейку памяти читали несколько процессоров — и она попала к ним в кэши. Ничего страшного, пока это ячейка неизменна — из быстрых кэшей она читается и как-то используется в вычислениях.
Если же в результате работы программы один из процессоров изменит эту ячейку памяти, чтоб не было рассогласования, чтоб все остальные процессоры «видели» это обновление придется изменять содержимое кэша всех процессоров и как-то тормозить их на время этого обновления.
Хорошо если число ядер/процессоров 2, как в настольном компьютере, а если 8 или 16? И если все они обмениваются данными через одну шину?
Потери в производительности могут быть очень значительные.

Многоядерные процессоры


Как бы снизить нагрузку на шину?
Прежде всего можно перестать её использовать для обеспечения когерентности. Что для этого проще всего сделать?
Да-да, использовать общий кэш. Так устроены большинство современных многоядерных процессоров.

Посмотрим на картинку, найдем два отличия от предыдущей.
Да, кэш теперь один на всех, соответственно, проблема когерентности не стоит. А еще круги превратились в прямоугольники, это символизирует тот факт, что все ядра и кэши находятся на одном кристалле. В реальной действительности картинка несколько сложнее, кэши бывают многоуровневыми, часть общие, часть нет, для связи между ними может использоваться специальная шина, но все настоящие многоядерные процессоры не используют внешнюю шину для обеспечения когерентности кэша, а значит — снижают нагрузку на нее.
Многоядерные процессоры — один из основных способов повышения производительности современных компьютеров.
Уже выпускаются 6 ядерные процессоры, в дальшейшем ядер будет еще больше… где пределы?
Прежде всего «ядерность» процессоров ограничивается тепловыделением, чем больше транзисторов одновременно работают в одном кристалле, тем больше этот кристалл греется, тем сложнее его охлаждать.
А второе большое ограничение — опять же пропускная способность внешней шины. Много ядер требуют много данных, чтоб их перемалывать, скорости шины перестает хватать, приходится отказываться от SMP в пользу

NUMA (Non-Uniform Memory Access — «неравномерный доступ к памяти» или Non-Uniform Memory Architecture — «Архитектура с неравномерной памятью») — архитектура, в которой, при общем адресном пространстве, скорость доступа к памяти зависит от ее расположения Обычно у процессора есть " своя" память, обращение к которой быстрее и «чужая», доступ к которой медленнее.
В современных системах это выглядит примерно так


Процессоры соединены с памятью и друг с другом с помощью быстрой шины, в случае AMD это Hyper Transport, в случае последних процессоров Intel это QuickPath Interconnect
Т.к. нет общей для всех шины то, при работе со «своей» памятью, она перестает быть узким местом системы.
NUMA архитектура позволяет создавать достаточно производительные многопроцессорные системы, а учитывая многоядерность современных процессоров получим уже очень серьезную вычислительную мощность «в одном корпусе», ограниченную в основном сложностью обеспечения кэш-когерентности этой путаницы процессоров и памяти.
Но если нам нужна еще большая мощность, придется объединять несколько мультипроцессоров в

Мультикомпьютер

Сводим все воедино

Ну вот, вкратце пробежались почти по всем технологиям и принципам построения мощных вычислительных систем.
Теперь есть возможность представить себе строение современного суперкомпьютера.
Это мультикомпьютер-кластер, каждый узел которого — NUMA или SMP система с несколькими процессорами, каждый из процессоров с несколькими ядрами, каждое ядро с возможностью суперскалярного внутреннего параллелизма и векторными расширениями. Вдобавок ко всему этому во многих суперкомпьютерах установлены GPGPU — ускорители.
У всех этих технологий есть плюсы и ограничения, есть тонкости в применении.
А теперь попробуйте эффективно загрузить-запрограммировать всё это великолепие!
Задача нетривиальная… но очень интересная.
Что-то будет дальше?

Они оба могут обрабатывать несколько инструкций одновременно, но я полагаю, что есть фундаментальное различие, объясняющее, почему есть два имени, и мы не всегда просто переключаемся на использование суперскалярных?

Кроме того, если я правильно понял, в современном процессоре присутствуют как скалярные, так и векторные инструкции, поэтому я полагаю, что эти два не являются взаимоисключающими (скалярные инструкции, такие как mov или add, будут выполняться суперскалярно и, например, скалярное произведение будет вычисляться как вектор - в какой-то особой чёрной магии-образе)?

Принимая во внимание отрицательные и отрицательные голоса, объяснение будет приветствоваться. Мне кажется, что этот вопрос является конкретным и достаточно ясным, и реальным вопросом, с которым я столкнулся в отношении программного или аппаратного обеспечения, в соответствии с указаниями. Luke 4 года назад 1

2 ответа на вопрос

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

Векторный процессор содержит инструкции, специально предназначенные для работы на целых группах нескольких значений данных одновременно (называемые массивы или векторах ). Большинство современных высокопроизводительных процессоров содержат некоторую форму векторной обработки; например; SSE ADDPS инструкции доступны в большинстве процессоров x86 вычисляет сумму двух векторов каждая из которых содержит четыре с одинарной точностью значения. Компилятор, разработчик и операционная система обычно требуют использования векторных инструкций, и не каждый процессор, даже в нынешних поколениях, поддерживает самые передовые векторные инструкции (например, процессоры Intel Celeron и Pentium, даже в Kaby Lake, не поддерживают AVX). ).

В этом ответе содержится дополнительная техническая информация о том, как современные процессоры достигают высокой производительности .

1 Альтернативный и довольно необычный подход к проектированию состоит в том, чтобы иметь несколько исполнительных блоков, но позволить компилятору определять, какие инструкции выдавать каждому исполнительному блоку для каждого тактового цикла. Это называется очень длинным командным словом и обычно встречается только на специализированных процессорах.

Поскольку никто не придумал ответ, я думаю, что я понял это за это время.

Скалярный процессор - это обычный процессор, выполняющий скалярные инструкции, которые работают над одним числом одновременно. Ничего особенного.

Суперскаляр - это термин, используемый для обозначения конкретной оптимизации, позволяющей скалярным инструкциям выполняться параллельно на разных «обычных» исполнительных блоках (например, нескольких ALU). Он делит инструкции на несколько «потоков» (я только что придумал этот термин), которые затем выполняются одновременно.

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

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

Заметьте, как я никогда не говорил, что какие-либо категории являются взаимоисключающими? Это не так. Векторные блоки будут выполнять векторные инструкции, а процессор попытается найти лучший способ распараллеливания скалярных. Фактически, все современные процессоры поддерживают как векторные инструкции (SSE *, 3DNow !, AVX, . ), так и скалярные (x86), которые будут выполняться «суперскалярным» способом.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Дикарев Н. И., Шабанов Б. М.

Векторный потоковый процессор: оценка производительности Недостаточная пропускная способность памяти на программе Stencil: преимущество векторного потокового процессора Моделирование параллельной работы ядер векторного потокового процессора с общей памятью Управление вычислительными процессами в вычислительной системе с автоматическим распределением ресурсов i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Текст научной работы на тему «Векторный потоковый процессор»

Н.И. Дикарев, Б.М. Шабанов ВЕКТОРНЫЙ ПОТОКОВЫЙ ПРОЦЕССОР

В последние десятилетия происходил быстрый рост производительности высокопроизводительных вычислительных систем (суперЭВМ) и такое же быстрое расширение сферы их применения. В результате суперЭВМ превратились в мощный инструмент, использование которого позволяет выйти на качественно новый уровень во многих отраслях науки и техники.

Однако, если проанализировать список ТОР500 - систем наивысшей производительности, установленных в мире [1], легко заметить, что за последние 3 - 5 лет повышение производительности скалярных многопроцессорных суперЭВМ, которые составляют более 95% списка, происходит в основном за счет совершенствования технологии изготовления используемых в них микропроцессоров и, как следствие, роста их тактовой частоты. Что же касается архитектуры, то производительность скалярных микропроцессоров уже достигла своего предела, который составляет 5 - б команд в такт.

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

В современных суперскалярных микропроцессорах поиск параллелизма среди выполняемых команд осуществляется аппаратными методами, а в микропроцессорах Intel Itanium с длинным командным словом (VLIW) - компилятором. Однако и в том, и в другом типе микропроцессоров при увеличении числа команд, выдаваемых в такт (К > 4), возникают труднопреодолимые препятствия. Во-первых, среди этих последовательных К команд, выбираемых из КЭШ команд каждый такт, как правило, встречается команда перехода, и следующие за ней команды чаще всего не выполняются. Во-вторых, аппаратные затраты в ряде устройств процессора, например в схеме регистрового файла, с ростом К увеличиваются пропорционально К2, что требует соответствующего увеличения времени такта. В результате в микропроцессорах семейства Itanium пропускную способность конвейера команд удалось поднять до б команд в такт, и лишь один суперскалярный микропроцессор - IBM Power4, выпущенный в 2GG2 г., выдает на исполнение до 5 команд в такт. Причем эта же пропускная способность осталась и в микропроцессоре IBM Power5, выпущенном в 2GG5 г., что лишь подтверждает труднопреодолимый характер встретившихся препятствий.

Кроме того, при выполнении реальных программ производительность микропроцессора часто оказывается существенно ниже его пиковой производительности. Снижение эффективности обусловлено недостаточным быстродействием подсистемы памяти в случае промаха при обращении к КЭШ памяти микропроцессора. Реальная производительность современных микропроцессоров начинает падать, если время выборки из памяти (оперативной) превышает 15 - 2G тактов, а пропускная способность становится меньше 3G - 4G байт в такт. В случае же отсутствия данных в КЭШ памяти микропроцессора время выборки требуемого слова возрастает до ста тактов, а пропускная способность тракта передачи данных снижается до 2 - 4 байт в такт. Причем с ростом тактовой частоты разрыв в быст-

родействии процессора и памяти лишь увеличивается [2]. Отсюда легко понять, что частые промахи при обращении к КЭШ снижают эффективность работы микропроцессора до единиц процентов, и случается это достаточно часто. Так, согласно [3], эффективность работы микропроцессоров IBM Power4, например, составляет лишь 2% - 13% при выполнении 10 из 11 типовых научных задач, и лишь на одной задаче достигает 44%.

Таким образом, одним из основных недостатков скалярных многопроцессорных суперЭВМ является то, что они слишком мало дают пользователю от их пиковой производительности. Гораздо лучше в этом отношении зарекомендовали себя векторные суперЭВМ, которые имеют два важных преимущества. Во-первых, пиковая производительность у векторных процессоров, как правило, в 2 - 4 раза выше по сравнению с современными скалярными микропроцессорами, и, во-вторых, реальная производительность на большинстве научных задач у векторного процессора значительно ближе к его пиковой производительности. Поэтому одной из актуальных задач совершенствования суперЭВМ, особенно для программ, в которых можно задействовать лишь ограниченное число процессоров, является разработка более мощных векторных процессоров.

В Межведомственном суперкомпьютерном центре (МСЦ) РАН ведется разработка векторного процессора с архитектурой управления потоком данных (dataflow), реальная производительность которого может быть повышена в 5 - 8 раз по сравнению с современными векторными процессорами и почти на два порядка величины - по сравнению с микропроцессорами.

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

Введение векторной обработки в динамическую потоковую ЭВМ позволяет существенно снизить требования к емкости АП, поскольку одна векторная команда выполняет не одну, а группу из VL элементарных операций, где VL - длина вектора. При хранении векторов в памяти векторов (ПВ) для выполнения векторной команды требуется поиск в АП лишь одной пары токенов с указателями векторов вместо VL пар токенов при скалярной обработке, и требования к емкости АП на векторизуемой части программы снижаются в VL раз.

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

В качестве единицы фрагментации при аппаратном распределении памяти в ВПП используется вектор с фиксированным числом слов УЬ=2П (УЬ=256 - 1024). Причем большие массивы предлагается хранить в ПВ в виде «векторов-указателей», то есть векторов, элементами которых являются указатели векторов подмассивов, как это показано на рис. 1.

Рис. 1. Представление трехмерного массива векторами-указателями

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

Такое хранение массивов в одноуровневой ПВ позволяет исключить из графа программы для ВПП команды обращения к памяти (команды пересылки данных между основной оперативной памятью и блоком векторных регистров) и команды, осуществляющие адресные вычисления. В результате общее число выполняемых команд в программах сокращается примерно вдвое, а доля операций с плавающей запятой в них может быть доведена до 70 - 99 %. Кроме того, представление массивов в виде векторов-указателей дает возможность выполнять одинаковые операции над всеми их элементами, например над строками, содержащимися в векторе-указателе матрицы. Тем самым удается векторизовать не один, а два вложенных цикла программы. Рассмотрим в качестве примера фрагмент программы обработки матриц, в котором элементы матрицы результата В вычисляются из элементов матрицы А по следующему алгоритму:

БО 20 і=1, N БО 20 і=1, N

В тесте ЬШРЛСК (решение системы линейных уравнений методом исключения Гаусса) основной объем вычислений приходится на аналогичный алгоритм обработки матриц. Внутренний цикл в этой программе исключается за счет использования векторных арифметических команд, и программу можно представить в следующем виде:

БО 20 і=1, N Ві = Лі - Лк * Л(і,к).

Читайте также: